[asking] LCD+ADC+TRIAC. help me to combine these programs please.

Status
Not open for further replies.

i dont understand why i should call void firing (), it is inside interrupt routine. i thin it should check every interrupt.

Code:
// Program to interface TGS2600 using ADC 0809. The output of TGS2600 is displayed on LCD. Controller interrupt is used to generate the clock for driving ADC 0808.
#include<reg52.h>
sbit ale=P1^0;  //address latch enable
sbit oe=P1^3;  //output enable
sbit sc=P1^1;  //start conversion
sbit eoc=P1^2;  //end of conversion
sbit clk=P1^7;  // clock
sbit ADD_A=P1^4;  // Address pins for selecting input channels.
sbit ADD_B=P1^5;
sbit ADD_C=P1^6;
sfr lcd_data_pin=0xA0;  //P2 port
sbit rs=P3^7;
sbit rw=P3^1;
sbit en=P3^6;
sbit triac=P3^0;
sfr input_port=0x80;  //P0 port
unsigned int bitvalue,decimal_value,key,left_value,value,number,ascii1,ascii2,ascii3,flag,key1,lastReading;
void cct_init(void);
void initint0(void);

void timer0() interrupt 1  // Function to generate clock of frequency 500KHZ using Timer 0 interrupt.
{
clk=~clk;
}

void delay(unsigned int count) //delay function in mS
{
unsigned int i;                         
    while(count) {
        i = 115;
                while(i>0) i--;
        count--;
}}

void cct_init(void)
 {
 P3=0x05;	//triac is on when active low. initialy triac is off.
 }

void initINT0(void)	  //activate int0
 {
 IT0=1;	 //interupted when transition from logic 1 to 0 (zero cross detector)
 EX0=1;
 EA=1;
 }

void external0_isr(void) interrupt 0 //interrupt routine

{
lastReading=input_port;
 if((lastReading>=52) && (lastReading<=77))	//1st condition
      {triac=1;
       delay(4);
       triac=0;
       delay(1);
       triac=1;}

          else if((lastReading>=77) && (lastReading<=103))	//2nd condition
              {triac=1;
               delay(3);
               triac=0;
               delay(1);
               triac=1;}

             else if((lastReading>=103) && (lastReading<=128))	//3rd condition
               {triac=1;
                delay(2);
                triac=0;
                delay(1);
                triac=1;}

                else if(lastReading>128) //4th condition; full power
                  {triac=0;
				   delay(1);
                   triac=1;}

else  //5th condition; triac not firing
{triac=1;}
}



void lcd_command(unsigned char comm)  //Function to send command to LCD.
{
lcd_data_pin=comm;
en=1;
rs=0;
rw=0;
delay(10);
en=0;
}

void lcd_data(unsigned char disp)  //Function to send data to LCD.
{
lcd_data_pin=disp;
en=1;
rs=1;
rw=0;
delay(10);
en=0;
}

lcd_dataa(unsigned char *disp)  //Function to send string data to LCD.
{
int x;
for(x=0;disp[x]!=0;x++)
{
  lcd_data(disp[x]);
}
}

void lcd_ini()  //Function to inisialize the LCD
{
lcd_command(0x38); 
delay(5);
lcd_command(0x0E); 
delay(5);
lcd_command(0x80);  //Force cursor to blink at line 1 positon 0
delay(5);
}

void BCD()  // Binary to decimal conversion to send the data to LCD
{
  key1++;
  key=0;
  flag=0;
    number=input_port;
    number= number*39;
    number= number/100;
    value=number%10;
number=number/10;
ascii1=value+48;
if(number!=0)
{
  value=number%10;
  number=number/10;
  ascii2=value+48;
    flag=1;
}
else
{
   ascii2=48;
   flag=1;
}
if(number!=0)
{
 value=number%10;
    number=number/10;
    ascii3=value+48;
    key=2;
}
else
{
  ascii3=48;
  key=2;
}
if(key==2)
lcd_data(ascii3);
if(flag==1)
lcd_data(ascii2);
lcd_data(ascii1);
if(key1==3)
{
key1=0;
ascii3=0;
ascii2=0;
ascii1=0;
delay(10);
} 
}



void adc()  //Function to drive ADC
{
while(1)
{
  ADD_C=0;  // Selecting input channel 2 using address lines
  ADD_B=0;
  ADD_A=1;
  delay(2);
  ale=1;
  delay(2);
  sc=1;
  delay(1);
  ale=0;
  delay(1);
  sc=0;
  while(eoc==1);
  while(eoc==0);
  oe=1;
  BCD();
  lcd_command(0x88);
  delay(2);
  oe=0;
  }
}


void main()
{
cct_init();
initINT0();
eoc=1;
ale=0;
oe=0;
sc=0;
key1=0;
TMOD=0x02;  //timer0 setting for generating clock of 500KHz using interrupt enable mode.
TH0=0xFD;
IE=0x82;
TR0=1;
lcd_ini();

lcd_dataa("PPM : ");
lcd_command(0x88);
adc();

}

this is my updated code.
 

Code:
// Program to interface TGS2600 using ADC 0809. The output of TGS2600 is displayed on LCD. Controller interrupt is used to generate the clock for driving ADC 0808.
#include<reg52.h>
#include<stdio.h>
sbit ale=P1^0;  //address latch enable
sbit oe=P1^3;  //output enable
sbit sc=P1^1;  //start conversion
sbit eoc=P1^2;  //end of conversion
sbit clk=P1^7;  // clock
sbit ADD_A=P1^4;  // Address pins for selecting input channels.
sbit ADD_B=P1^5;
sbit ADD_C=P1^6;
sfr lcd_data_pin=0xA0;  //P2 port
sbit rs=P3^7;
sbit rw=P3^1;
sbit en=P3^6;
sbit triac=P3^0;
sbit intr0=P3^2;
sfr input_port=0x80;  //P0 port
unsigned int bitvalue,decimal_value,key,left_value,value,number,ascii1,ascii2,ascii3,flag,key1,lastReading;
void initINT0(void);

void timer0() interrupt 1  // Function to generate clock of frequency 500KHZ using Timer 0 interrupt.
{
clk=~clk;
}

void delay(unsigned int count) //delay function in mS
{
unsigned int i;                         
    while(count) {
        i = 115;
                while(i>0) i--;
        count--;
}}


void initINT0(void)	  //activate int0
 {
 IT0=1;	 //interupted when transition from logic 1 to 0 (zero cross detector)
 EX0=1;
 EA=1;
 }




void lcd_command(unsigned char comm)  //Function to send command to LCD.
{
lcd_data_pin=comm;
en=1;
rs=0;
rw=0;
delay(10);
en=0;
}

void lcd_data(unsigned char disp)  //Function to send data to LCD.
{
lcd_data_pin=disp;
en=1;
rs=1;
rw=0;
delay(10);
en=0;
}

lcd_dataa(unsigned char *disp)  //Function to send string data to LCD.
{
int x;
for(x=0;disp[x]!=0;x++)
{
  lcd_data(disp[x]);
}
}

void lcd_ini()  //Function to inisialize the LCD
{
lcd_command(0x38); 
delay(5);
lcd_command(0x0E); 
delay(5);
lcd_command(0x80);  //Force cursor to blink at line 1 positon 0
delay(5);
}

void BCD()  // Binary to decimal conversion to send the data to LCD
{
  key1++;
  key=0;
  flag=0;
    number=input_port;
    number= number*39;
    number= number/100;
    value=number%10;
number=number/10;
ascii1=value+48;
if(number!=0)
{
  value=number%10;
  number=number/10;
  ascii2=value+48;
    flag=1;
}
else
{
   ascii2=48;
   flag=1;
}
if(number!=0)
{
 value=number%10;
    number=number/10;
    ascii3=value+48;
    key=2;
}
else
{
  ascii3=48;
  key=2;
}
if(key==2)
lcd_data(ascii3);
if(flag==1)
lcd_data(ascii2);
lcd_data(ascii1);
if(key1==3)
{
key1=0;
ascii3=0;
ascii2=0;
ascii1=0;
delay(10);
} 
}



void adc()  //Function to drive ADC
{
  ADD_C=0;  // Selecting input channel 2 using address lines
  ADD_B=0;
  ADD_A=1;
  delay(2);
  ale=1;
  delay(2);
  sc=1;
  delay(1);
  ale=0;
  delay(1);
  sc=0;
  while(eoc==1);
  while(eoc==0);
  oe=1;
  BCD();
  lcd_command(0x88);
  delay(2);
  oe=0;
  }
void external0_isr(void) interrupt 0 //interrupt routine

{
 if((input_port>=52) && (input_port<=77))	//1st condition
      {delay(5);
       triac=0;
	   delay(1);}

          else if((input_port>=77) && (input_port<=103))	//2nd condition
              {delay(4);
               triac=0;
			   delay(1);}

             else if((input_port>=103) && (input_port<=128))	//3rd condition
               {delay(3);
                triac=0;
				delay(1);}

                else if(input_port>128) //4th condition; full power
                  {triac=0;
				  delay(1);}

	                else
					{triac=1;
					}

triac=1;
EA=0;
EA=1;
}


void main()
{
initINT0();
intr0=1;
triac=1;
while(1)
{
eoc=1;
ale=0;
oe=0;
sc=0;
key1=0;
TMOD=0x02;  //timer0 setting for generating clock of 500KHz using interrupt enable mode.
TH0=0xFD;
IE=0x82;
TR0=1;
lcd_ini();

lcd_dataa("PPM : ");
lcd_command(0x88);
adc();
}
}

i would like to update my code, but i cant find edit button. so i posted again.
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…