51单片机1602时钟程序
时间:2025-07-06
时间:2025-07-06
经过测试成功的单片机时钟程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P2^7;
sbit rs=P2^6;
sbit rd=P3^7;
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
uchar code table1[]=" 2009-07-18 ";
uchar code table2[]=" 00:00:00";
uchar *table3[]={"SUN","MON","TUE","WED","THU","FRI","STA"};
uchar countday=1;
uint count=0;
char month=7,day=18,shi,fen,miao;
uint year=2009;
uchar counts1=0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=112;y>0;y--);
}
经过测试成功的单片机时钟程序
void delay_us(uint z)
{
for(;z>0;z--)
_nop_();
}
void write_com(uchar com)
{
rs=0;
P0=com;
delay(1);
lcden=1;
delay(5);
lcden=0;
delay(1);
}
void write_dat(uchar dat)
{
rs=1;
P0=dat;
delay(1);
lcden=1;
delay(5);
lcden=0;
delay(1);
}
经过测试成功的单片机时钟程序
void init()
{
uint i;
wela=0; //液晶初始化
dula=0;
rd=0; //用于检测矩阵键盘
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
write_com(0x01);
for(i=0;i<12;i++)
{
write_dat(table1[i]);
delay_us(50);
}
write_com(0x80+0x40);
for(i=0;i<12;i++)
{
write_dat(table2[i]);
delay_us(50);
}
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65535-46080)/256;//晶振为11.0592MHz
TL0=(65535-46080)%256;
EA=1;//开总中断
经过测试成功的单片机时钟程序
ET0=1;//开定时器中断
TR0=1;//开启定时器
}
void display1(uchar address,char date)
{
char shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+address);
write_dat(0x30+shi);
write_dat(0x30+ge);
}
void display2(uchar address,char date)
{
char shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+address);
write_dat(0x30+shi);
write_dat(0x30+ge);
}
void display_year(uchar address,uint date)
{
uint qian,bai,shi,ge;
qian=date/1000;
经过测试成功的单片机时钟程序
bai=date/100%10;
shi=date/10%10;
ge=date%10;
write_com(0x80+address);
write_dat(0x30+qian);
write_dat(0x30+bai);
write_dat(0x30+shi);
write_dat(0x30+ge);
}
void display_week(uchar address,uchar date)
{
uchar i;
write_com(0x80+address);
for(i=0;i<3;i++)
write_dat(*(table3[date-1]+i));
}
void keyscan()
{
if(s1==0)//s1为模式选择
{
delay(10);//用于消抖,确认键是否被按下
if(s1==0)
{
counts1++;
if(counts1!=0)
{
经过测试成功的单片机时钟程序
TR0=0;//定时器停止工作
write_com(0x0d);//显示光标 光标闪烁
while(!s1);//松手检测
switch(counts1)
{
case 1: //miao
write_com(0x80+0x40+11);break;
case 2: //fen
write_com(0x80+0x40+8);break;
case 3: //shi
write_com(0x80+0x40+5);break;
case 4: //星期
write_com(0x80+14);break;
case 5: //day
write_com(0x80+10);break;
case 6: //month
write_com(0x80+7);break;
case 7: //year
write_com(0x80+4);break;
case 8:
counts1=0;
write_com(0x0c);//不显示光标
TR0=1;//启动定时器
break;
}
}
经过测试成功的单片机时钟程序
}
}
if(s2==0)
{
delay(10);
if(s2==0)
{
switch(counts1)
{
case 1:
miao++;
if(miao==60)
{
miao=0;
}
while(!s2);
display2(10,miao);
write_com(0x80+0x40+11);
break;
case 2:
fen++;
if(fen==60)
{
fen=0;
}
while(!s2);
经过测试成功的单片机时钟程序
display2(7,fen);
write_com(0x80+0x40+8);
break;
case 3:
shi++;
if(shi==24)
{
fen=0;
}
while(!s2);
display2(4,shi);
write_com(0x80+0x40+5);
break;
case 4:
countday++;
if(countday==8)
{
countday=1;
}
while(!s2);
display_week(12,countday);
write_com(0x80+14);
break;
case 5:
day++;
if(month==1||month==3||month==5||month==7||month==8||month=
经过测试成功的单片机时钟程序
=10||month==12)
{
if(day==32)
{
day=1;
}
}
if(month==4||month==6||month==9||month==11)
{
if(day==31)
{
day=1;
}
}
if(month==2)
{
if(day==29)
{
day=1;
}
}
while(!s2);
display1(9,day);
write_com(0x80+10);
break;
case 6:
经过测试成功的单片机时钟程序
month++;
if(month==13)
{
month=1;
}
while(!s2);
display1(6,month);
write_com(0x80+7);
break;
case 7:
year++;
while(!s2);
display_year(1,year);
write_com(0x80+4);
break;
}
}
}
if(s3==0)
{
delay(10);
if(s3==0)
{
switch(counts1)
{
case 1:
经过测试成功的单片机时钟程序
miao--;
if(miao==-1)
{
miao=59;
}
while(!s3);
display2(10,miao);
write_com(0x80+0x40+11);
break;
case 2:
…… 此处隐藏:2893字,全部文档内容请下载后查看。喜欢就下载吧 ……