📄 yejin.c
字号:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P3^5;
sbit lcden=P3^4;
sbit rd=P3^7; //把rd口置0,扫描P3^0,1,2,3,同独立键盘功能
sbit s1=P3^0; //功能键
sbit s2=P3^1; //调日期,时间增加
sbit s3=P3^2; //调日期,时间减少
uchar code table[]=" 2000-01-01"; //初始化液晶显示
uchar code table1[]=" 00:00:00";
uchar count,s1num;
char second,minute,hour,day,month,year;
//uchar code dis_week[]={"Sun,Mon,Tue,Wed,Thu,Fri,Sat"};
//uchar code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5}; //星期月参变数
//------------延时---------------------
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//----------写命令--------------------
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//----------写数据--------------------
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//-------------初始化----------------
void init()
{
uchar num;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<13;num++) //让液晶显示日期
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++) //让液晶显示时间
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01; //定时器中断初始化
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
//-------写年月日---------------
void write_lyr(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
//--------写时分秒----------------------
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
//---------该年是否是闰年--------------------------
bit leap_year()
{
int leap;
if((year%4==0&&year%100!=0)||year%400==0)
leap=1;
else
leap=0;
return leap;
}
//星期的自动运算和处理
/*uchar week_proc()
{ uchar num_leap;
uchar b;
num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年次数
if( leap_year()&& month<=2 ) //既是闰年且是1月和2月
b=5;
else
b=6;
week=(year+para_month[month]+day+num_leap+b)%7;//计算对应的星期
return week;
}*/
//-------写星期-----------------------------
/*void write_week(week)
{
switch(week)
{
case 1:write_com(0x80+12);write_date(dis_week[0]);break;
case 2:write_com(0x80+12);write_date(dis_week[1]);break;
case 3:write_com(0x80+12);write_date(dis_week[2]);break;
case 4:write_com(0x80+12);write_date(dis_week[3]);break;
case 5:write_com(0x80+12);write_date(dis_week[4]);break;
case 6:write_com(0x80+12);write_date(dis_week[5]);break;
case 7:write_com(0x80+12);write_date(dis_week[6]);break;
default:write_com(0x80+12);write_date();break;
}
}*/
//----------键盘扫描--------------------
void keyscan()
{
rd=0; //把rd口置0,准备扫描
if(s1==0) //第一个键是否按下
{
delay(5);
if(s1==0)
{
while(!s1);
s1num++;
if(s1num==1) //第一个键被按一次
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
write_com(0x80+11);
}
if(s1num==5)
{
write_com(0x80+8);
}
if(s1num==6)
{
write_com(0x80+5);
}
/*if(s1num==7)
{
write_com(0x80+12);
}*/
if(s1num==7)
{
s1num=0;
write_com(0x0c);
TR0=1;
}
}
}
if(s1num!=0) //如果功能键被按下
{
if(s2==0) //第二个按下
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1) //第二个键被按一次,秒钟加一
{
second++;
if(second==60)
second=0;
write_sfm(10,second);
write_com(0x80+0x40+10);
}
if(s1num==2) //第二个键被按二次,分钟加一
{
minute++;
if(minute==60)
minute=0;
write_sfm(7,minute);
write_com(0x80+0x40+7);
}
if(s1num==3) //第二个键被按三次,时钟加一
{
hour++;
if(hour==24)
hour=0;
write_sfm(4,hour);
write_com(0x80+0x40+4);
}
if(s1num==4)
{
day++;
if(day==30)
day=0;
write_lyr(11,day);
write_com(0x80+11);
}
if(s1num==5)
{
month++;
if(month==12)
month=0;
write_lyr(8,month);
write_com(0x80+8);
}
if(s1num==6)
{
year++;
if(year==99)
year=0;
write_lyr(5,year);
write_com(0x80+5);
}
/*if(s1num==7)
{
week_proc();
write_com(0x80+12);
}*/
}
}
if(s3==0) //第三个键被按下
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
second--;
if(second==-1)
second=59;
write_sfm(10,second);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
minute--;
if(minute==-1)
minute=59;
write_sfm(7,minute);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
hour--;
if(hour==-1)
hour=23;
write_sfm(4,hour);
write_com(0x80+0x40+4);
}
if(s1num==4)
{
day--;
if(day==-1)
day=31;
write_lyr(11,day);
write_com(0x80+11);
}
if(s1num==5)
{
month--;
if(month==-1)
month=12;
write_lyr(8,month);
write_com(0x80+8);
}
if(s1num==6)
{
year--;
if(year==-1)
year=99;
write_lyr(5,year);
write_com(0x80+5);
}
/*if(s1num==7)
{
week_proc();
write_com(0x80+12);
}*/
}
}
}
}
//---------主程序----------------------
void main()
{
init();
while(1)
{
keyscan();
}
}
//---------定时器中断---------------------
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
day++;
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //大月三十一天
if(day==32)
{
day=1;
month++;
}
if(month==4||month==6||month==9||month==11) //小月三十天
if(day==31)
{
day=1;
month++;
}
if(month==2)
{
if(leap_year())
{
if(day==30) //闰年二月29天
{
day=1;
month++;
}
}
else
{
if(day==29) //非闰年二月28天
{
day=1;
month++;
}
}
}
//week_proc();
if(month==13)
{
month=1;
year++;
if(year==99)
{
year==0;
}
write_lyr(5,year);
}
write_lyr(8,month);
}
write_lyr(11,day);
}
write_sfm(4,hour);
}
write_sfm(7,minute);
}
write_sfm(10,second);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -