📄 dzsz.txt
字号:
#include <reg51.h> //头文件,定义寄存器
#include <intrins.h>
#include <absacc.h>
#include <math.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P3^7;//数据指令选择信号
sbit RW=P3^6;//读写选择信号
sbit E=P3^5;//使能信号
uchar table1[13]={'C','L','O','C','K',' ','G','O','O','D','B','Y','E'};
uchar table2[13]={'C','L','O','C','K',' ','W','E','L','C','O','M','E'};
uchar dizhi[2]={0x80,0xc0};
void chushihua();
void busy();
void writecode (uint daima);
void writeshuju (uchar shuju);
void delay(uint m);
void display(uchar dizhi,uint shuju);
void select(uchar dizhi,uchar shu);
void key_scan(void);
void display2(uchar *shuju);
void clr_timer(void);
void display3(void);
void xiugai(void);
void jia(void);
void xiugaifen(void);
void fenjia(void);
void jianshi(void);
void jianfen(void);
void display4(uchar *s);
void close(void);
uchar temp=0;
uchar t1=0,t2=0;
char f1=0,f2=0;
char s1=0,s2=0;
uchar shi[2]={0,0};
uchar fen[2]={0,0};
uchar miao[2]={0,0};
void time0(void) interrupt 1 using 1
{
TMOD=0X01;
TH0=0X3C; //定时50ms
TL0=0X0B0;
temp++;
if(temp==20)
{
P0=!P0;
temp=0;
t1++; //定时1秒到,就是秒加1
if(t1<10) //秒低位处理程序
{
miao[1]=t1;
}
else
{
t2++;
t1=0;
miao[0]=t2;
miao[1]=t1;
}
if(t2>5) //秒高位处理程序
{
f1++;
t2=0;
t1=0;
miao[0]=t2;
fen[1]=f1;
}
if(f1>9) //分低位处理程序
{
f1=0;
f2++;
fen[0]=f2;
fen[1]=f1;
}
if(f2>5) //分高位处理程序
{
s1++;
f2=0;
f1=0;
fen[0]=f2;
shi[1]=s1;
}
if(s1>9) //时低位处理程序
{
s2++;
s1=0;
shi[0]=s2;
shi[1]=s1;
}
if(s2>1) //时高位处理程序
{
if(s1>3)
{
t1=t2=0;
s1=s2=0;
f1=f2=0;
miao[0]=0;
miao[1]=0;
fen[0]=0;
fen[1]=0;
shi[0]=0;
shi[1]=0;
}
}
writecode(0x86); //显示秒钟
display2(miao);
writecode(0x83); //显示分钟
display2(fen);
writecode(0x80); //显示小时
display2(shi);
}
}
main()
{
chushihua();
display4(table2);
delay(3000);
chushihua();
writecode(0x80);
display2(shi);
display(0x82,':');
writecode(0x83);
display2(fen);
display(0x85,':');
writecode(0x86);
display2(miao);
TMOD=0X01;
P0=0x00;
TH0=0X3C;
TL0=0X0B0;
TR0=1;
ET0=1;
while(1)
{
key_scan();
}
}
void display3(void)
{
display(0x85,':');
display(0x82,':');
writecode(0x80); //显示小时
display2(shi);
writecode(0x83); //显示分钟
display2(fen);
writecode(0x86); //显示秒钟
display2(miao);
}
void clr_timer(void)
{
t1=t2=0;
s1=s2=0;
f1=f2=0;
miao[0]=0;
miao[1]=0;
fen[0]=0;
fen[1]=0;
shi[0]=0;
shi[1]=0;
}
void display2(uchar *shuju) //显示数据
{
uchar i;
uchar m;
for (i=0;i<2;i++)
{
m=shuju[i];
writeshuju(m+0x30);
}
}
void key_scan(void)
{
uchar temp;
delay(10);
P1=0xff;
while(P1==0xff)
{;}
temp=P1;
switch (temp) //定义按键代表的含义
{
case 0xfe:chushihua();clr_timer();EA=0;display3();break;
case 0xfd:EA=1;display3();break;
case 0xfb:EA=0;display3();break;
case 0xf7:jia();break;
case 0xef:jianshi();break;
case 0xdf:fenjia();break;
case 0xbf:jianfen();break;
case 0x7f:close();break;
default:;break;
}
while(P1!=0xff) // 等待按键释放,若有按键在按下,就等待,直到释放才跳出程序
{;}
}
void close(void)
{
display4(table1);
}
void display4(uchar *s)
{
uchar i,m;
writecode(0x80);
for(i=0;i<13;i++)
{
m=s[i];
writeshuju(m);
}
}
void jianshi(void) //s1表示小时的低位,s2表示小时的高位
{
if(s2>0)
{
if(s1>=0)
{
s1--;
if(s1<0)
{
s2--;
s1=9;
}
}
}
else if(s2==0)
{
if(s1>=0)
{
s1--;
}
if(s1<0)
{
s1=3;
s2=2;
}
}
shi[1]=s1;
shi[0]=s2;
writecode(0x81);
display3();
writecode(0x81);
}
void jianfen(void)
{
if(f2>0)
{
if(f1>=0)
{
f1--;
if(f1<0)
{
f2--;
f1=9;
}
}
}
else if(f2==0)
{
if(f1>=0)
{
f1--;
}
if(f1<0)
{
f1=9;
f2=5;
}
}
fen[1]=f1;
fen[0]=f2;
writecode(0x84);
display3();
writecode(0x84);
}
void xiugai(void) //修改小时的光标位置
{
uchar i=0;
writecode(0x81);
}
void xiugaifen(void) //修改分钟的光标位置
{
writecode(0x84);
}
void jia(void) //设置小时的加1程序
{
s1++;
shi[1]=s1;
writecode(0x81);
display3();
writecode(0x81);
if(s1>9)
{
s2++;
shi[0]=s2;
s1=0;
shi[1]=s1;
display3();
writecode(0x81);
}
if(s2>1)
{
if(s1>3)
{
s1=s2=0;
shi[0]=shi[1]=0;
display3();
writecode(0x81);
}
}
}
void fenjia(void) //设置分钟的加1程序
{
f1++;
fen[1]=f1;
writecode(0x84);
display3();
writecode(0x84);
if(f1>9)
{
f2++;
fen[0]=f2;
f1=0;
fen[1]=f1;
display3();
writecode(0x84);
}
if(f2>5)
{
f1=f2=0;
fen[0]=fen[1]=0;
display3();
writecode(0x84);
}
}
void select(uchar dizhi,uchar shu)//数据送液晶显示
{
switch(shu)
{
case(0):display(dizhi,'0');break;
case(1):display(dizhi,'1');break;
case(2):display(dizhi,'2');break;
case(3):display(dizhi,'3');break;
case(4):display(dizhi,'4');break;
case(5):display(dizhi,'5');break;
case(6):display(dizhi,'6');break;
case(7):display(dizhi,'7');break;
case(8):display(dizhi,'8');break;
case(9):display(dizhi,'9');break;
default:display(dizhi,' ');break;
}
}
void chushihua()//液晶初始化
{
delay(15);
writecode (0x38);
delay(5);
writecode (0x38);
delay(5);
writecode (0x38);
delay(5);
writecode (0x08);
writecode (0x01);
writecode (0x06);
writecode (0x0f);
}
void busy()//检测液晶是否忙,RS为0,RW为1,E为高
{
RS=0;
RW=1;
E=1;
P2=0xff;
while(P2&0x80)
{
;
}
E=0;
}
void writecode (uint daima)//给液晶写代码,RS为0,RW为0,E为高脉冲
{
busy();
RS=0;
RW=0;
P2=0xff;
P2=daima;
E=1;
E=0;
}
void writeshuju (uchar shuju)//向液晶写数据,RS为1,RW为0,E为高脉冲
{
busy();
RS=1;
RW=0;
P2=0xff;
P2=shuju;
E=1;
E=0;
}
void display(uchar dizhi,uint shuju) //显示数据
{
writecode (dizhi);
writeshuju(shuju);
}
void delay(uint m)
{
while (m--)
{uchar j;
for (j=0;j<125;j++)
{;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -