微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 定时器0—LCD1602显示—时钟

定时器0—LCD1602显示—时钟

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcd_rs=P2^4;
sbit lcd_rw=P2^5;
sbit lcd_e=P2^6;
sbit K1=P1^7;
sbit K2=P1^6;
sbit K3=P1^5;
sbit K4=P1^4;
uchar data ri_qi[]="2013-08-05";
uchar data shi_jian[]="11:12:50";
uchar num,flag,yue=8,ri=5,shi=11,fen=12,miao=50;
uint nian=2013;
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}            
void write_com(uchar com)
{
lcd_e=0;
lcd_rs=0;
lcd_rw=0;
P0=com;
delay(5);
lcd_e=1;
delay(5);
lcd_e=0;
}
void write_data(uchar dat)
{
lcd_e=0;
lcd_rs=1;
lcd_rw=0;
P0=dat;
delay(5);
lcd_e=1;
delay(5);
lcd_e=0;
}
void keyscan()
{
if(!K1)
{
   delay(10);
  if(!K1)
  while(!K1);
  TR0=0;
  flag++;
  if(flag==6)
  flag=1;
}
if(flag==1)    //调节分钟
{
  if(!K2)
  {
   delay(10);
   if(!K2)
   {
    write_com(0x80+0x40+0x08);
    while(!K2);
    fen++;
    if(fen==60)
    fen=0;
    shi_jian[3]=fen/10+48;
    shi_jian[4]=fen%10+48;
   }
  }
  if(!K3)
  {
   delay(10);
   if(!K3)
   {
    write_com(0x80+0x40+0x08);
    while(!K3);
    fen--;
    if(fen==0)
    fen=60;
    shi_jian[3]=fen/10+48;
    shi_jian[4]=fen%10+48;
   }
  }
}
if(flag==2)     //调节小时
{
  if(!K2)
  {
   delay(10);
   if(!K2)
   {
    write_com(0x80+0x40+0x05);
    while(!K2);
    shi++;
    if(shi==24)
    shi=0;
    shi_jian[0]=shi/10+48;
    shi_jian[1]=shi%10+48;
   }
  }
  if(!K3)
  {
   delay(10);
   if(!K3)
   {
    write_com(0x80+0x40+0x05);
    while(!K3);
    shi--;
    if(shi==0)
    shi=24;
    shi_jian[0]=shi/10+48;
    shi_jian[1]=shi%10+48;
   }
  }
}
if(flag==3)         //调节日
{
  if(!K2)
  {
   delay(10);
   if(!K2)
   {
    write_com(0x80+0x12);
    while(!K2);
    if((nian%4==0&&nian%100!=0)||(nian%400==0))
    {
     if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
     {
      ri++;
      if(ri==32)
      ri=1;
     }
     if(yue==4||yue==6||yue==9||yue==11)
     {
      ri++;
      if(ri==31)
      ri=1;
     }
     if(yue==2)
     {
      ri++;
      if(ri==30)
      ri=1;
     }
    }
    else
    {
     if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
     {
      ri++;
      if(ri==32)
      ri=1;
     }
     if(yue==4||yue==6||yue==9||yue==11)
     {
      ri++;
      if(ri==31)
      ri=1;
     }
     if(yue==2)
     {
      ri++;
      if(ri==30)
      ri=1;
      yue++;
     }
    }
    ri_qi[8]=ri/10+48;
    ri_qi[9]=ri%10+48;
   }
  }
  if(!K3)
  {
   delay(10);
   if(!K3)
   {
    write_com(0x80+0x12);
    while(!K3);
    if((nian%4==0&&nian%100!=0)||(nian%400==0))
    {
     if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
     {
      ri--;
      if(ri==1)
      ri=31;
     }
     if(yue==4||yue==6||yue==9||yue==11)
     {
      ri--;
      if(ri==1)
      ri=30;
     }
     if(yue==2)
     {
      ri--;
      if(ri==1)
      ri=28;
     }
    }
    else
    {
     if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
     {
      ri--;
      if(ri==1)
      ri=31;
     }
     if(yue==4||yue==6||yue==9||yue==11)
     {
      ri--;
      if(ri==1)
      ri=30;
     }
     if(yue==2)
     {
      ri--;
      if(ri==1)
      ri=28;
     }
    }
    ri_qi[8]=ri/10+48;
    ri_qi[9]=ri%10+48;
   }
  }
}
if(flag==4)         // 调节月
{
  if(!K2)
  {
   delay(10);
   if(!K2)
   {
    write_com(0x80+0x09);
    while(!K2);
    yue++;
    if(yue==13)
    yue=1;
    ri_qi[5]=yue/10+48;
    ri_qi[6]=yue%10+48;
   }
  }
  if(!K3)
  {
   delay(10);
   if(!K3)
   {
    write_com(0x80+0x09);
    while(!K3);
    yue--;
    if(yue==0)
    yue=12;
    ri_qi[5]=yue/10+48;
    ri_qi[6]=yue%10+48;
   }
  }
}
if(flag==5)      //调节年
{
  if(!K2)
  {
   delay(10);
   if(!K2)
   {
    write_com(0x80+0x06);
    while(!K2);
    nian++;
    if(nian==2090)
    nian=0;
    ri_qi[0]=nian/1000+48;
    ri_qi[1]=nian%1000/100+48;
    ri_qi[2]=nian%1000%100/10+48;
    ri_qi[3]=nian%10+48;
   }
  }
  if(!K3)
  {
   delay(10);
   if(!K3)
   {
    write_com(0x80+0x06);
    while(!K3);
    nian--;
    if(nian==0)
    nian=2013 ;
    ri_qi[0]=nian/1000+48;
    ri_qi[1]=nian%1000/100+48;
    ri_qi[2]=nian%1000%100/10+48;
    ri_qi[3]=nian%10+48;
   }
  }
}   
if(!K4)
{
  delay(10);
  if(!K4)
  {
   write_com(0x80+0x40+0x12);
   while(!K4);
   TR0=1;
   flag=0;
  }
}
}
void init()
{
write_com(0x38);
delay(5);
write_com(0x38);
delay(5);
write_com(0x38);
delay(5);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
delay(5);   
write_com(0x0f);
write_com(0x80+0x03);
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{  
uchar i;
init();
while(1)
{
  write_com(0x80+0x03);
  for(i=0;i<10;i++)
  {
   write_data(ri_qi);
   delay(5);
  }
  write_com(0x80+0x40+0x04);
  for(i=0;i<8;i++)
  {
   write_data(shi_jian);
   delay(5);
  }
  keyscan();
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)
{
  num=0;
  miao++;
}
if(miao==60)
{
  miao=0;
  fen++;
}
if(fen==60)
{
  fen=0;            
  shi++;
    }
if(shi==24)
{
  shi=0;
  if((nian%4==0&&nian%100!=0)||(nian%400==0))
  {
   if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
   {
    ri++;
    if(ri==31)
    {
     ri=0;
     yue++;
     if(yue==13)
     {
      yue=0;
      nian++;
     }
    }
   }
   if(yue==4||yue==6||yue==9||yue==11)
   {
    ri++;
    if(ri==30)
    {
     ri=0;
     yue++;
     if(yue==13)
     {
      yue=0;
      nian++;
     }
    }
   }
   if(yue==2)
   {
    ri++;
    if(ri==29)
    {
     ri=0;
     yue++;
     if(yue==13)
     {
      yue=0;
      nian++;
     }
    }
   }
  }
  else
  {
   if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
    {
     ri++;
     if(ri==31)
     {
      ri=0;
      yue++;
      if(yue==13)
      {
       yue=0;
       nian++;
      }
     }
    }
    if(yue==4||yue==6||yue==9||yue==11)
    {
     ri++;
     if(ri==30)
     {
      ri=0;
      yue++;
      if(yue==13)
      {
       yue=0;
       nian++;
      }
     }
    }
    if(yue==2)
    {
     ri++;
     if(ri==28)
     {
      ri=0;
      yue++;
      if(yue==13)
      {
       yue=0;
       nian++;
      }
     }
    }
  }
}
shi_jian[0]=shi/10+48;
shi_jian[1]=shi%10+48;
shi_jian[3]=fen/10+48;
shi_jian[4]=fen%10+48;
shi_jian[6]=miao/10+48;
shi_jian[7]=miao%10+48;
ri_qi[0]=nian/1000+48;
ri_qi[1]=nian%1000/100+48;
ri_qi[2]=nian%1000%100/10+48;
ri_qi[3]=nian%10+48;
ri_qi[5]=yue/10+48;
ri_qi[6]=yue%10+48;
ri_qi[8]=ri/10+48;
ri_qi[9]=ri%10+48;
}
各位大神 在下初学51  能不能告诉我一下 为什么我在Proteus上面仿真的时候 LCD1602会出现光标闪烁老是乱跑啊 可是时间显示 按键都正常啊 唯独光标老跑 还一会是阴影 一会是一个杠子

那个主函数上面没粘上去  应该分别是write_data(shi_jian[i]),和write_data(ri_qi[i])。谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top