Sunday, January 23, 2011

LCD CLOCK USING 8051 (89C51)

This is a real time clock by using 89c51 micro-controller, clock's data format is hour:min:sec, and it is displayed on 16x2 lcd, the code has been tested and compilled on Keil uVision compiler, circuit diagram for the project is shown below.

Lcd is connected with port 2 and some pins of port 3 of 89c51 uController.

C Code :

#include <AT89X52.H>
#define MAXCOUNT 20       
#define HOUR 3
#define MIN 6
#define SEC 9

sbit RS=P3^3;           //RS=0; command register   RS=1; Data register
sbit RW=P3^4;
sbit E=P3^5;
sbit BF=P2^7;

bit time_keeping;
bit setmode;

bit packetok;
bit secflag;
bit minflag;
bit hourflag;

unsigned char data count;
unsigned char data hour;
unsigned char data hourT;
unsigned char data hourU;
unsigned char data min;
unsigned char data minT;
unsigned char data minU;
unsigned char data sec;
unsigned char data secT;
unsigned char data secU;
unsigned char data curfield;


unsigned char data curstate;
unsigned char data Debounce;
unsigned char data decrease;

//////////////////////////// DELAY/////////////////////////////
   
void delay(unsigned char z) //For delay (Starts)
        {
            unsigned char x;
            unsigned int y;
            for(x=0;x<z;x++){//start of the for loop
                for(y=0;y<=1000;y++);
                }
        }

///////////////////////////////// LCD CURSOR POSITION//////////////

void setcurpos(unsigned char pos)
    {
      pos = pos + 0x80;
      E=1;                    //Start LCD command
      RS=0;                    //Its a command.
      RW=0;
      P2=pos;                   
      E=0;                    //Finish LCD command
    }

////////////////////////////// LCD PULSE//////////////////////////   
   
void LCD_Pulse_E(unsigned char t)
       {
          unsigned char i;
          E = 1; for(i=0; i<t; i++) i = i;//For E from high to low
          E = 0; for(i=0; i<t; i++) i = i;
        }

//////////////////////////// READY/////////////////////////////

bit ready(void) //For checking that the LCD is ready or not?
    {
        BF=1;//Busy flag is one
        RS=0;// Command register is one
        RW=1;//Read the data from LCD
        while(BF==1)
            {
                E=0;
                E=1;
            }
        return 1;
    }

///////////////////////////////// LCD SHOW///////////////////////   

void LCD_Show(unsigned char CHARACTER)
     {
      if(ready())
          {
            P2=CHARACTER;
            RS=1; delay(1);//Data register
            RW=0; delay(1);//Write on LCD
            LCD_Pulse_E(255);
            delay(1);
           }
    }





/////////////////////////// LCD RUN/////////////////////////

void LCD_Run_Command(unsigned char COMMAND)
    {
      if(ready())
        {
            P2=COMMAND;
            RS=0; delay(1);//command register
            RW=0; delay(1);//read from LCD
            LCD_Pulse_E(255);//call to LCD_PULSE_E() function
        }
    }


/////////////////////////////////// CMD ARRAY///////////////////

bit Cmd_Array(unsigned char cmd)
 {
  if(cmd)
  {
  return 1;
  }
 else
 return 0;
}

////////////////////////////////// TIMER 0 ISR/////////////////
void timer0ISR(void) interrupt 1 using 1


    TR0=0; 
    TH0 = 0x4B;
    TL0 = 0xFF;
    TR0 = 1;                      

    count++;
    if(count == MAXCOUNT)
        {   
            count = 0;
            sec++;
            time_keeping = 1;
            secflag = 1;
            if(sec == 60)
                {
                    sec = 0;
                    min++;
                    minflag=1;
                    if(min==60)
                        {
                            min=0;
                            hour++;
                            hourflag=1;
                            if(hour==24)
                                {   
                                    hour=0;
                                }
                        }
                }
        }
       
}

   
///////////////////////////////////// THE MAIN  ///////////////////////////////

void main(void)
{     
    setmode=0;
    count=0;           //initialization
    sec=0;
    min=0;
    hour=0;
  
    curstate = 0; 

    setcurpos(5);
    LCD_Show(':');
    setcurpos(8);
    LCD_Show(':');

    SCON=0x50;
    TH1=0xFD;
    ES = 1;
     TMOD = 0x21;  
    TH0=0x4B;      
    TL0=0xFF;   

    ET0=1;
    EA=1;            

    TR0=1;
    TR1=1;

LCD_Run_Command(0x0C); // Display=ON, Curson=OFF, Cursor Blonking=ON
 
while(1)
{

    if(time_keeping)
     {           
                setcurpos(SEC);
                LCD_Show(secT+0x30);
                LCD_Show(secU+0x30);
                setcurpos(HOUR);
                LCD_Show(hourT+0x30);
                LCD_Show(hourU+0x30);
                setcurpos(MIN);
                LCD_Show(minT+0x30);
                LCD_Show(minU+0x30);
        if(hourflag)
            {
                   hourflag=0;       
                hourT=hour/10;
                hourU=hour%10;
                       
            }
       
         if(minflag)
            {
                minflag=0;
                minT=min/10;
                minU=min%10;
                           
            }
         if(secflag)
            {
                secflag=0;
                secT=sec/10;
                secU=sec%10;
           
            }
   
   
     }
}
}