需要在增加一个闹钟模块
/************************
电子时钟
************************/
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY_ADD=P3^4; //对按键1定义在P3^4口 加1
sbit KEY_SUB=P3^5; //对按键2定义在P3^5口 减1
sbit KEY_MOVE=P3^6; //对按键3定义在P3^6口 移位
//sbit KEY_READ=P3^7; //对按键4定义在P3^7口 闹钟
bit flag_s;
bit flag_500ms;
uchar t0IntCnt,change_num;
uchar time_s,time_m,time_h;
uchar code TAB[]={ //数码管显示代码表
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
};
/************************
毫秒延时程序
************************/
void delays_ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<121;j++);
}
}
/************************
数码管显示程序
************************/
void display()
{
if(!(flag_500ms&&change_num==1))
{
P0=TAB[time_s%10]; //个位秒
P2_5=0;
delays_ms(1);
P2_5=1;
P0=TAB[time_s/10]; //十位秒
P2_4=0;
delays_ms(1);
P2_4=1;
}
if(!(flag_500ms&&change_num==2))
{
P0=TAB[time_m%10]; //个位分
P2_3=0;
P0_7=0;
delays_ms(1);
P2_3=1;
P0=TAB[time_m/10]; //十位分
P2_2=0;
delays_ms(1);
P2_2=1;
}
if(!(flag_500ms&&change_num==3))
{
P0=TAB[time_h%10]; //个位时
P2_1=0;
P0_7=0;
delays_ms(1);
P2_1=1;
P0=TAB[time_h/10]; //十位时
P2_0=0;
delays_ms(1);
P2_0=1;
}
P1=~time_s;
}
/************************
按键检测程序
************************/
void KEY_test()
{
if(KEY_ADD==0) //加1按键
{
delays_ms(10);
if(KEY_ADD==0)
{
switch(change_num)
{
case 1:time_s++;
if(time_s==60)
{
time_s=0;
}
break;
case 2:time_m++;
if(time_m==60)
{
time_m=0;
}
break;
case 3:time_h++;
if(time_h==24)
{
time_h=0;
}
break;
default:break;
}
while(KEY_ADD==0)
{
display();
}
}
}
if(KEY_SUB==0) //减1按键
{
delays_ms(10);
if(KEY_SUB==0)
{
switch(change_num)
{
case 1:
if(time_s==0)
time_s=59;
else
time_s--;
break;
case 2:
if(time_m==0)
time_m=59;
else
time_m--;
break;
case 3:
if(time_h==0)
time_h=23;
else
time_h--;
break;
default:break;
}
while(KEY_SUB==0)
{
display();
}
}
}
if(KEY_MOVE==0) //移位按键
{
delays_ms(10);
if(KEY_MOVE==0)
{
change_num--;
change_num%=4;
while(KEY_MOVE==0)
{
display();
}
}
}
// if(KEY_READ==0) //闹钟按键
// {
// delays_ms(10);
// if(KEY_READ==0)
// {
//
// while(KEY_READ==0)
// {
// display();
// }
// }
// }
}
/************************
定时程序
************************/
void timer0_ISR() interrupt 1
{
TH0=(65536-50000)/256; //初值
TL0=(65536-50000)%256; //初值
t0IntCnt++;
if(t0IntCnt==10||t0IntCnt==20)
{
flag_500ms=!flag_500ms;
}
if(t0IntCnt==20)
{
t0IntCnt=0x00;
if(change_num==0)
time_s++;
if(time_s==60)
{
time_s=0x00;
time_m++;
if(time_m==60)
{
time_m=0x00;
time_h++;
if(time_h==24)
{
time_h=0x00;
}
}
}
}
}
/************************
初始化程序
************************/
void init()
{
TMOD=0x01; //设定T0为方式1定时
TR0=1; //启动T0
TH0=(65536-50000)/256; //初值
TL0=(65536-50000)%256; //初值
EA=1; //开启总中断
ET0=1; //开启T0中断
t0IntCnt=0;
time_s=0; //秒清0
time_m=0; //分清0
time_h=0; //时清0
}
/************************
主程序
************************/
void main()
{
init();
while(1)
{
display();
KEY_test();
}
} |