📄 lesson 10.c
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table1[]=" 2009-02-05";
uchar table2[]=" 23:23:55";
uchar count,switch_num,flag,judge,day_full,week;
uint year;
char table3[7][3]={{"SUN"},{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"}};
char hour,minute,second,day,month,year1,year2;
sbit s1=P3^2;
sbit s2=P3^4;
sbit rs=P3^0;
sbit en=P3^1;
sbit switch1=P3^5; //功能键
sbit switch2=P3^6; //加1键
sbit switch3=P3^7; //减1键
void delay(uint z); //延时
void intial_T0(); //定时器T0初始化
void initial_LCD(); //液晶显示初始化
void write_cmd(uchar cmd_data); //写命令
void write_data(uchar data1); //写数据
void LCD_display(uchar address,uchar temp); //年、月、日、时、分、秒显示
void week_display(uchar week); //星期显示
void keyscan(); //键盘
void count_month_year(); //判断闰年和非闰年个月的天数
void count_day(); //年、月
void main()
{
intial_T0();
initial_LCD();
while(1)
{
keyscan();
}
}
void delay(uint z) //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void intial_T0() //T0初始化
{
second=56;minute=23;hour=23; week=4;
day=5; month=2; year1=9; year2=20;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void initial_LCD()
{
uchar i;
en=0; switch1=1; switch2=1; switch3=1;
write_cmd(0x38); // 16X2 5X8显示
write_cmd(0x0c); //开显示 光标 闪烁
write_cmd(0x06); //地址指针自动加一,不移动
write_cmd(0x01); //清屏
write_cmd(0x80); //数据指针设置
for(i=0;i<12;i++)
{
write_data(table1[i]);
}
write_cmd(0x80+0x40); //数据指针设置
for(i=0;i<12;i++)
{
write_data(table2[i]);
}
week_display(4); //写星期
}
void write_cmd(uchar cmd_data) //1602液晶写命令子程序
{
rs=0;
P2=cmd_data; delay(1); //P2为数据口
en=1; delay(1);
en=0;
}
void write_data(uchar data1) //1602液晶写数据子程序
{
rs=1;
P2=data1; delay(1); //P2为数据口
en=1; delay(1);
en=0;
}
void LCD_display(uchar address,uchar temp)
{ //LCD显示程序
uchar shi,ge;
shi=temp/10;
ge=temp%10;
write_cmd(0x80+0x40+address); //数据指针设置
if(flag==1) write_cmd(0x80+address);
write_data(0x30+shi);
write_data(0x30+ge);
flag=0;
}
void week_display(uchar week1)
{
uchar i;
write_cmd(0x80+12);
for(i=0;i<3;i++)
{
write_data(table3[week1][i]);
}
}
void keyscan()
{
if(switch1==0) //判断功能键是否按下
{
delay(5); //去抖动
if(switch1==0) //在判断功能键是否按下
{
while(!switch1); //松手检测
delay(5);
switch_num++; //功能键次数加一
TR0=0;
if(0<switch_num<=8) //功能键1到3次液晶显示对应位闪烁
write_cmd(0x0d);
if(switch_num==9) //按4次功能键时钟运行
{
switch_num=0;
TR0=1; //时钟重新运行
write_cmd(0x0c); //消除闪烁
}
switch(switch_num) //时 分 秒对应位闪烁
{
case 1: { write_cmd(0x80+0x40+11);}break;
case 2: { write_cmd(0x80+0x40+8);}break;
case 3: { write_cmd(0x80+0x40+5);}break;
case 4: { write_cmd(0x80+2);}break;
case 5: { write_cmd(0x80+4);}break;
case 6: { write_cmd(0x80+7);}break;
case 7: { write_cmd(0x80+10);}break;
case 8: { write_cmd(0x80+13);}break;
}
}
}
if(switch_num!=0) //判断功能键是否按下过
{
if(switch2==0) //判断加1键是否按下
{
delay(5); //去抖动
if(switch2==0)
{
while(!switch2);
delay(5);
switch(switch_num)
{
case 1:{second++; //秒加1并刷新显示
if(second==60) second=0;
LCD_display(10,second);
write_cmd(0x80+0x40+11);}break; case 2:{minute++; //分加1并刷新显示
if(minute==60) minute=0;
LCD_display(7,minute);
write_cmd(0x80+0x40+8);}break;
case 3:{hour++; //时加1并刷新显示
if(hour==24) hour=0;
LCD_display(4,hour);
write_cmd(0x80+0x40+5);}break;
case 4:{year2++; //年高二位加1并刷新显示
if(year2==100) year2=0;
flag=1;
LCD_display(1,year2);
write_cmd(0x80+2);}break;
case 5:{year1++; //年低二位加1并刷新显示
if(year1==100) year1=0;
flag=1;
LCD_display(3,year1);
write_cmd(0x80+4);}break;
case 6:{month++; //月加1并刷新显示
if(month==13) month=0;
flag=1;
LCD_display(6,month);
write_cmd(0x80+7);}break;
case 7:{day++; //天加1并刷新显示
if(day==32) day=0;
flag=1;
LCD_display(9,day);
write_cmd(0x80+10);}break;
case 8:{week++; //星期加1并刷新显示
if(week==7) week=0;
week_display(week);
write_cmd(0x80+13);} break;
}
}
}
}
if(switch_num!=0)
{
if(switch3==0)
{
delay(5);
if(switch3==0)
{
while(!switch3);
delay(5);
switch(switch_num)
{
case 1:{second--; //秒减1并刷新显示
if(second==-1) {second=59;}
LCD_display(10,second);
write_cmd(0x80+0x40+11);}break;
case 2:{minute--; //分减1并刷新显示
if(minute==-1) minute=59;
LCD_display(7,minute);
write_cmd(0x80+0x40+8);}break;
case 3:{hour--; //时减1并刷新显示
if(hour==-1) hour=23;
LCD_display(4,hour);
write_cmd(0x80+0x40+5);}break;
case 4:{year2--; //年高二位加1并刷新显示
if(year2==-1) year2=99;
flag=1;
LCD_display(1,year2);
write_cmd(0x80+2);}break;
case 5:{year1--; //年低二位加1并刷新显示
if(year1==-1) year1=99;
flag=1;
LCD_display(3,year1);
write_cmd(0x80+4);}break;
case 6:{month--; //月加1并刷新显示
if(month==0) month=12;
flag=1;
LCD_display(6,month);
write_cmd(0x80+7);}break;
case 7:{day--; //天加1并刷新显示
if(day==0) day=31;
flag=1;
LCD_display(9,day);
write_cmd(0x80+10);}break;
case 8:{week--; //星期减1并刷新显示
if(week==-1) week=6;
week_display(week);
write_cmd(0x80+13);} break;
}
}
}
}
}
void count_day()
{
if(month==2)
{
if(judge==1) //闰年2月份有29天
{
day++;
day_full=30;
count_month_year();
}
if(judge==0) //闰年2月份有28天
{
day++;
day_full=29;
count_month_year();
}
}
else if((month==4)||(month==6)||(month==9)||(month==11))
{ //4、6、9、11月份有30天
day++;
day_full=31;
count_month_year();
}
else //1、3、5、7、8、10、12月份有31天
{
day++;
day_full=32;
count_month_year();
}
}
void count_month_year()
{
if(day==day_full) //设置满月变量day_full使month嵌套在day中
{
day=1; month++;
if(month==13)
{
month=1; year1++;
if(year1==100)
{
year1=0; year2++;
if(year2==100) year2=0;
flag=1;
LCD_display(1,year2);
}
flag=1;
LCD_display(3,year1);
}
flag=1;
LCD_display(6,month);
}
flag=1;
LCD_display(9,day);
}
void T_0() 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; week++;
if(week==7) week=0;
week_display(week);
year=year2*100+year1;
if((year%4==0)&&(year%100!=0)||(year%400==0)) //判断是否是闰年
{
judge=1; //闰年
count_day();
}
else
{
judge=0; //非闰年
count_day();
}
}
LCD_display(4,hour);
}
LCD_display(7,minute);
}
LCD_display(10,second);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -