原创 用51控制1602液晶的时钟程序

2007-5-6 00:21 3874 3 3 分类: MCU/ 嵌入式


用51控制1602液晶的时钟程序

sun.gif2007-02-01 17:05:31







用51控制的1602液晶的时钟程序,接口:1PIN--GND  2PIN--VCC  3PIN--VO  4PIN--RS  5PIN--RW  6PIN--E  7-14PIN--DB0-DB7  15PIN--A  16PIN--K
欢迎和我讨论!

#include "AT89X51.H"
#define Ddata P2
sbit RS="P0"^5;
sbit RW="P0"^6;
sbit LCDE="P0"^7;
//1PIN--GND  2PIN--VCC  3PIN--VO  4PIN--RS  5PIN--RW  6PIN--E  7-14PIN--DB0-DB7  15PIN--A  16PIN--K
unsigned char hour="12",min=0,sec=0;
unsigned int count="0";
unsigned char line1[16]={"www.gliet.edu.cn"};
unsigned char line2[16]={"Gui Lin 12:00:00"};
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'};

void delay5ms()
{unsigned  int i;
for (i=0;i<1000;i++);
}

void delay50us()
{register int i;
for (i=0;i<20;i++);
}

void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);}

wr_com(unsigned char comm)//********写控制字符程序 E="1" RS="0" RW="0"**********//
{                        
  LCDE=0;
  RS=0;             //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
  RW=0;             //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
  LCDE=1;
  Ddata=comm;
  RS=0;
  RW=0;
  LCDE=0;
}

wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS="1" RW="0"
{
  LCDE=0;
  RS=0;             //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
  RW=0;             //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
  RS=1;
  RW=0;
  LCDE=1;
  Ddata=dat;
    LCDE=0;
  RS=0;
  RW=0;
}


unsigned char busycheck()//*****忙状态检查*******//
{
  unsigned char i;
  LCDE=0;
  RS=0;
  RW=0;
  RS=0;
  RW=1;
  LCDE=1;
  i=Ddata;
    LCDE=0;
  return(i);
}
 
void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
 wr_com(0x38);   //*****显示模式设置必须三次,不用检测忙信号
 delay5ms();
 wr_com(0x38);
 delay5ms();
 wr_com(0x38);
 delay5ms();
 wr_com(0x01);   ///***清屏****
 delay5ms();
 busycheck();
 delay5ms();
 wr_com(0x06);   ///****光标移动设置***
 delay5ms();
 busycheck();
 delay50us();
 wr_com(0x38);   ////***显示模式设置****
 delay50us();
 busycheck();
 delay50us();
 wr_com(0x0c);   /////***显示开***
 delay50us();
 busycheck();
 delay50us();
 wr_com(0x40);  //set cgram address
 delay50us();
 delay50us();      //***这些延时可用可不用***//
}


void display()
{  unsigned char i;
  wr_com(0x80);  //set ram address
  delay50us();
  busycheck();
  delay50us();
  for(i=0;i<16;i++)
       {wr_data(line1);  //display
  delay50us();
  busycheck();}
  busycheck();
  delay50us();
  wr_com(0xc0);
  delay50us();
  busycheck();
  delay50us();
  for(i=0;i<16;i++)
  {
   wr_data(line2);  //display
   delay50us();
   busycheck();
  }
}


void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init(); 
 while(1)
   {line2[15]=tab[sec%10];line2[14]=tab[sec/10];
    line2[12]=tab[min%10];line2[11]=tab[min/10];
   line2[9]=tab[hour%10];line2[8]=tab[hour/10];
 if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
 if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
 if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
    display();
    }
}

void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
 count++;
 if(count==200){count=0;sec++;}
 if(sec==60){sec=0;min++;}
 if(min==60){min=0;hour++;}
 if(hour==24){hour=0;}
}

 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条