📄 clock20090409.c
字号:
//---------------------------------------------------------
//Akey--select mode
//Bkey--add1
//Ckey--jian1&&alarm on/off&& stopwatch on/off
//Dkey--select position
//---------------------------------------------------------
#include<reg52.h>
#include<lcddriver.h> //LCD1302驱动程序
#define uchar unsigned char
#define uint unsigned int
//==========================
sbit Ak=P1^4 ;
sbit Bk=P1^5 ;
sbit Ck=P1^6;
sbit Dk=P1^7;
sbit ring=P2^3;
uchar currentmode,keyset,count;
uchar tab_time[8]={0,0,10,0,0,10,0,0};
uchar tab_ymdw[9]={2,0,0,9,0,4,0,1,3}; //年月日星期
uchar code tab_t[]="Time ";
uchar code tab_d[]="Date ";
uchar sec,min,hour,day,mon,year,week;
uchar tab_alarm[8]={1,2,10,0,1,10,0,0};
uchar code tab_a[]="Alarm";
uchar nsec,nmin,nhour;
uchar alarmmode;
uchar tab_stopwatch[]={0,0,11,0,0,11,0,0};
uchar code tab_s[]="Timer";
uchar ssec,smin,sh,stopwatch,stopwatchon,stopcount;
uchar code tab_num[]="0123456789:- ";
uchar code tab_week[21]="MonTeuWedThuFriSATSUN";
uchar code tab_ampm[4]="AMPM";
uchar code table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31};
uchar code table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31};
//------- 函数声明 --------
void mcu_initial();
void lcd_disp();
void time0();
void time1();
void keyprocess();
void jishi();
void delay(uint);
void alarm();
//------ 主函数 -----------
void main()
{
mcu_initial();
lcd_initial(); //LCD1602初始化
while(1)
{
if(currentmode==0)//clockmode
{
tab_time[0]=hour/10; //小时十位
tab_time[1]=hour%10; //小时个位
tab_time[3]=min/10; //分十位
tab_time[4]=min%10; //分个位
tab_time[6]=sec/10; //秒十位
tab_time[7]=sec%10; //秒个位
}
if(currentmode==1)//alarm mode
{
tab_alarm[0]=nhour/10; //小时十位
tab_alarm[1]=nhour%10; //小时个位
tab_alarm[3]=nmin/10; //分十位
tab_alarm[4]=nmin%10; //分个位
tab_alarm[6]=nsec/10; //秒十位
tab_alarm[7]=nsec%10; //秒个位
}
if(currentmode==2)//stopwatch mode
{
tab_stopwatch[0]=smin/10; //分十位
tab_stopwatch[1]=smin%10; //分个位
tab_stopwatch[3]=ssec/10; //秒十位
tab_stopwatch[4]=ssec%10; //秒个位
tab_stopwatch[6]=sh/10; //百分之一秒
tab_stopwatch[7]=sh%10; //百分之一秒
}
tab_ymdw[2]=year/10; //年十位
tab_ymdw[3]=year%10; //年个位
tab_ymdw[4]=mon/10; //月十位
tab_ymdw[5]=mon%10; //月个位
tab_ymdw[6]=day/10; //日十位
tab_ymdw[7]=day%10; //日个位
tab_ymdw[8]=week; //星期
lcd_disp();
keyprocess();
alarm();
delay(50);//////////////////////////////////
}
}
void keyprocess()
{ //-----------------------------------------------------
//设置时候,控制光标闪烁
if(keyset==1)//sec
{write_instruction(0x80+12);
write_instruction(0x08|0x04|0x01);
write_instruction(0x80+11);
write_instruction(0x08|0x04|0x01);
}
if(keyset==2)//min
{write_instruction(0x80+9);
write_instruction(0x08|0x04|0x01);
}
if(keyset==3)//hour
{write_instruction(0x80+6);
write_instruction(0x08|0x04|0x01);
}
if(keyset==4)//day
{write_instruction(0x80+12+0x40);
write_instruction(0x08|0x04|0x01);
}
if(keyset==5)//mon
{write_instruction(0x80+10+0x40);
write_instruction(0x08|0x04|0x01);
}
if(keyset==6)//year
{write_instruction(0x80+8+0x40);
write_instruction(0x08|0x04|0x01);
}
if(keyset==7)//week
{write_instruction(0x80+13+0x40);
write_instruction(0x08|0x04|0x01);
}
//-------------------------------------------------------------
//Akey,模式选择,currentmode=0 时钟 =1 闹钟 =2秒表
if(Ak==0)
{
delay(2);
if(Ak==0)
{
currentmode++;
if(currentmode>=3)
{
currentmode=0;
}
}
}
while(Ak==0) ;
//-----------------------------------------------
//Dkey 设置的位置选择,=0没有,=1秒,=2分,=3小时,=4day,=5mon,=6year,=7week
if(Dk==0)
{
delay(2);
if(Dk==0)
{
keyset++;
if(keyset==8)
{
keyset=0;
}
}
}
while(Dk==0);
//-------------------------------------------------
//时钟模式,按键处理
if(currentmode==0)//clockmode
{
if(Bk==0)///+1按键
{
delay(2);
if(Bk==0)
{
if(keyset==1)//sec
{
sec++;
if(sec>=60)
{
sec=0;
}
if(sec<0)
{
sec=60;
}
}
if(keyset==2)//min
{
min++;
if(min>=60)
{
min=0;
}
if(min<0)
{
min=60;
}
}
if(keyset==3)//hour
{
hour++;
if(hour>=24)
{
hour=0;
}
if(hour<0)
{
hour=24;
}
}
if(keyset==4)//day
{
day++;
if(day>=31)
{
day=0;
}
if(day<0)
{
day=31;
}
}
if(keyset==5)//mon
{
mon++;
if(mon>=31)
{
mon=0;
}
if(mon<0)
{
mon=31;
}
}
if(keyset==6)//year
{
year++;
if(year>=99)
{
mon=0;
}
if(mon<0)
{
mon=99;
}
}
if(keyset==7)//week
{
week++;
if(week>=99)
{
week=0;
}
if(week<0)
{
week=99;
}
}
}
}
while(Bk==0);
if(Ck==0)//减一按键
{
delay(2);
if(Ck==0)
{
if(alarmmode==1)
{
ring=0;
alarmmode=0;
}
if(alarmmode==0)
{
if(keyset==1)
{
sec--;
if(sec>=60)
{
sec=0;
}
if(sec<0)
{
sec=60;
}
}
if(keyset==2)
{
min--;
if(min>=60)
{
min=0;
}
if(min<0)
{
min=60;
}
}
if(keyset==3)
{
hour--;
if(hour>=24)
{
hour=0;
}
if(hour<0)
{
hour=24;
}
}
if(keyset==4)
{
day--;
if(day>=31)
{
day=0;
}
if(day<0)
{
day=31;
}
}
if(keyset==5)
{
mon--;
if(mon>=31)
{
mon=0;
}
if(mon<0)
{
mon=31;
}
}
if(keyset==6)
{
year--;
if(year>=99)
{
mon=0;
}
if(mon<0)
{
mon=99;
}
}
if(keyset==7)
{
week--;
if(week>=99)
{
week=0;
}
if(week<0)
{
week=99;
}
}
}
}
}
while(Ck==0);
}
//-------------------------------------------------
if(currentmode==1)//alarmmode
{
if(Ck==0)
{
delay(2);
if(Ck==0)
{
alarmmode=1;//Ck open alarm set alarmmode=1
}
}
while(Ck==0);
if(keyset>=4)
{
keyset=0;
}
if(Bk==0)
{
delay(2);
if(Bk==0)
{
if(keyset==2)
{
nmin++;
if(nmin>=60)
{
nmin=0;
}
}
if(keyset==3)
{
nhour++;
if(nhour>=24)
{
nhour=0;
}
}
}
}
while(Bk==0);
if(Ck==0)
{
delay(2);
if(Ck==0)//alarm off
{
if(alarmmode==1)
{
ring=0;
alarmmode=0;
}
}
}
while(Ck==0);
}
//--------------------------------------------------------------------
if(currentmode==2)
{
if(Bk==0)
{
delay(2);
if(Bk==0)
{
stopwatch=1;
stopwatchon=0;
sh=0;
ssec=0;
smin=0;
}
}
while(Bk==0);
if(keyset>=1)
keyset=0;
if(Ck==0)
{
delay(2);
if(Ck==0)
{
stopwatchon++;
if(stopwatch==1&&(stopwatchon%2)!=0)
{
TR1=1;
}
else
{
TR1=0;
}
}
}
while(Ck==0);
}
}
void mcu_initial(void)
{
TMOD=0x11;
TH0=0x94;
TL0=0x94;
TH1=0xd8;
TL1=0xef;
EA=1;
ET0=1;
ET1=1;
TR0=1;
year=9;
mon=4;
day=11;
hour=0;
min=0;
sec=0;
week=6;
ring=0;
currentmode=0;
}
void alarm()
{
if(min==nmin&&hour==nhour&&alarmmode==1)
{
ring=1;
}
}
void lcd_disp()
{
uchar i,j;
write_instruction(0x80); //LCD1602写命令函数,从第一行开始显示
//-------------------------
if(currentmode==0)
{
for(i=0;i<5;i++)
{
write_data(tab_t[i]);
}
write_instruction(0x80+5);
for(i=0;i<8;i++)
{
j=tab_time[i];
write_data(tab_num[j]);
}
}
if(currentmode==1)
{
for(i=0;i<5;i++)
{
write_data(tab_a[i]);
}
write_instruction(0x80+5);
write_data(' ');
write_instruction(0x80+6);
for(i=0;i<5;i++)
{
j=tab_alarm[i];
write_data(tab_num[j]);
}
write_instruction(0x80+6+5);
if(alarmmode==0)
{
for(i=0;i<2;i++)
write_data(' ');
}
if(alarmmode==1)
{
write_data(tab_ampm[0]);
write_data(' ');
}
}
if(currentmode==2)
{
for(i=0;i<5;i++)
{
write_data(tab_s[i]);
}
write_instruction(0x80+5);
for(i=0;i<8;i++)
{
j=tab_stopwatch[i];
write_data(tab_num[j]);
}
}
write_instruction(0x80+5+8);
//------------------
write_data(' ');
if(hour<12)
{
write_data(tab_ampm[0]);
write_data(tab_ampm[1]);
}
else
{
write_data(tab_ampm[2]);
write_data(tab_ampm[3]);
}
write_instruction(0x80+0x40);
for(i=0;i<5;i++)
{
write_data(tab_d[i]); //显示'Date '
}
//---------------------
write_instruction(0x80+0x40+5);
for(i=0;i<8;i++)
{
j=tab_ymdw[i]; //显示日期
write_data(tab_num[j]); //LCD1602写数据函数,显示年月日星期
}
//----------------------
write_instruction(0x80+0x40+5+8);
for(i=0;i<3;i++)
{
j=tab_ymdw[8]; //星期
write_data(tab_week[(j-1)*3+i]);
}
}
void time1() interrupt 3
{
TH1=0xdb;
TL1=0Xef; //0.001s
sh++;
if(sh==100)
{
sh=0;
ssec++;
if(ssec==60)
{
ssec=0;
smin++;
if(smin>=60);
{
smin=0;
}
}
}
}
void time0() interrupt 1
{
TH0=0xb1;
TL0=0Xdf; ////20ms初值,12MHZ
count++;
if(count==50)
{
count=0;
sec++;
jishi();
}
}
void jishi() //计时函数
{
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{ hour=0;
day++;
week++;
if(week==8)
{week=0;}
if(year%4==0&&year%100!=0||year%400==0) //闰年
{
if(day==table1[mon]+1)
{
day=0;
mon++;
if(mon==13)
{mon=0;year++;}
}
}
else //非闰年
{
if(day==table2[mon]+1)
{
day=0;
mon++;
if(mon==13)
{
mon=0;
year++;}
}
}
}
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -