Hi all...
i am working on a project where i have to interface shift register SN74HC595 (Circuit Diagram attached). with 89S52.
i have interfaced 8 LED's to shift register.
Code:
#include <reg51.h>
#include <STDIO.h>
sbit data1 = P2^0; //DS
sbit clock = P2^2; //SH_CP
sbit latch = P2^1; //ST_CP
unsigned char led_data_value, led_value, on_led_counter;
void led_data(unsigned char databyte);
//#define on_led 0xFE;
//#define extra1_led 0xFD;
//#define fault_led 0xFB;
//#define extra2_led 0xF7;
//#define all_call_led 0xEF;
//#define extra3_led 0xDF;
//#define extra4_led 0xBF;
//#define extra5_led 0x7F;
// fire_siren = 0xFC;
void msdelay(unsigned int value);
void led_data(unsigned char databyte)
{
unsigned int i;
for(i=0;i<8;i++)
{
data1 = ((databyte&0x80) == 0x80);
clock=1;
clock=0;
databyte = databyte << 1;
}
latch=1;
latch=0;
}
void msdelay(unsigned int value)
{
unsigned int i,j;
for(i=0;i<value;i++)
for(j=0;j<100;j++);
}
void main()
{
data1=0;
clock=0;
latch=0;
led_value = 0xFF;
led_data(0xFF);
while(1)
{
led_value = led_value &= 0xFE; // ON LED-1
led_data(led_value);
msdelay(2000);
led_value = led_value &= 0xFD; // ON LED-2
led_data(led_value);
}
}
for example i have 8 LED's (LED-1, LED-2, LED-3........ LED-8)
so when i need to on LED-1, i write
led_value = led_value &= 0xFE;
and then again when i need to ON the LED-2, i AND the previous value with the new value i need.
led_value = led_value &= 0xFD; // ON LED-2
so this things works perfectly when i need to ON any of led.
now what my problem is...
how can i OFF the specific LED, what parameter's should i pass to OFF any LED i need. because i cannot substract the value of LED i need to OFF because the output value will be something different.
ON and OFF of any LED's will be randomly done.
- - - Updated - - -
when i add first led i write (0xFE) 1111 1110
when i need to add second LED (0xFD) i add previous value with the second LED value.
so 0xFE &= 0xFD (1111 1110 &= 1111 1101) so what i get here is 1111 1100. so here my both the LED's get ON.
but when i need to OFF led 1. what should be done to the new value (1111 1100) to again get 1111 1101.