定时器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会出现光标闪烁老是乱跑啊 可是时间显示 按键都正常啊 唯独光标老跑 还一会是阴影 一会是一个杠子
#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])。谢谢