#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^2; // 定义硬件引脚
sbit key2=P3^3;
sbit key3=P3^4;
sbit key4=P3^5;
sbit key5=P3^6;
sbit key6=P3^7;
sbit bz=P1^6;
sbit w1=P2^0;
sbit w2=P2^1;
sbit w3=P2^2;
sbit w4=P2^3;
sbit w5=P2^4;
sbit w6=P2^5;
#define all_off {P2=0X00;}
uint i,jihour,count,timer,count_ss;
uchar sec=52,min=59,hour=11,set,num,mb,count_mb;
bit flag_mb,flag_mb_run,flag_bs;
code uchar
shuma[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; // 显示段码共阳数码管
// 延时函数
void delay(uchar t)
{
uchar i,j;
for(i=0;i
{
for(j=14;j>0;j--);
}
}
void disp() // 数码管显示函数
{
if(flag_mb) // 显示秒表
{
all_off;P0=shuma[10];w1=1;delay(5); // 无显示
all_off;P0=shuma[10];w2=1;delay(5);
all_off;P0=shuma[mb/10];w3=1;delay(5);// 显示秒
all_off;P0=shuma[mb%10];w4=1;delay(5);
all_off;P0=shuma[count_mb/10];w5=1;delay(5); // 百分秒
all_off;P0=shuma[count_mb%10];w6=1;delay(5);
}
else // 显示 时间
{
all_off;P0=shuma[hour/10];w1=1;delay(5); // 时
all_off;if(set==1)P0=shuma[hour%10]&0x7f;else
P0=shuma[hour%10];w2=1;delay(5);
all_off;P0=shuma[min/10];w3=1;delay(5); // 分
all_off;if(set==2)P0=shuma[min%10]&0x7f;else
P0=shuma[min%10];w4=1;delay(5);
all_off;P0=shuma[sec/10];w5=1;delay(5); // 秒
all_off;if(set==3)P0=shuma[sec%10]&0x7f;else
P0=shuma[sec%10];w6=1;delay(5);
}
}
void keyscan()
// 按键扫描函数
{
if(!key1)
// 检测按下
{
delay(10); // 延时消抖动
if(!key1) //+
{
switch(set)
{
case 1:if(hour<23)hour++;break; // 设置时
case 2:if(min<59)min++;break; // 设置分
case 3:if(sec<59)sec++;break; // 设置秒
default:break;
}
while(!key1){;}// 检测松手
}
}
if(!key2)
// 检测按下
{
delay(10); // 延时消抖动
if(!key2) //-
{
switch(set)
{
case 1:if(hour>0)hour--;break; // 设置时
case 2:if(min>0)min--;break; // 设置分
case 3:if(sec>0)sec--;break; // 设置秒
default:break;
}
if(flag_mb)flag_mb_run=!flag_mb_run;
while(!key2){;}// 检测松手
}
}
if(!key3)
// 检测按下
{
delay(10); // 延时消抖动
if(!key3) // 设置当前时间
{
set++;if(set==4)set=0;
if(set==0)TR0=1;else TR0=0;
while(!key3){;}// 检测松手
}
}
if(!key4)
// 检测按下
{
delay(10); // 延时消抖动
if(!key4) // 秒表
{
flag_mb=!flag_mb;count_mb=0;mb=60;
while(!key4){;}// 检测松手
}
}
if(!key5)
// 检测按下
delay(10); // 延时消抖动
if(!key5) // 秒表启动或停止
{
flag_mb_run=!flag_mb_run;
while(!key5){;}// 检测松手
}
}
if(!key6)
// 检测按下
{
delay(10); // 延时消抖动
if(!key6) // 秒表清零
{
count_mb=0;mb=60;
while(!key6){;}// 检测松手
}
}
}
void main()
{
TMOD |= 0x01; // 初始化定时器 0
TL0 = 0x00;
// 设置定时初值
TH0 = 0xDC;
// 设置定时初值 10MS @11.0592MHZ
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan(); // 按键扫描函数
disp();
if(min==59 && sec==50) // 整点前 10 秒
flag_bs=1; // 报时
}
}
void Tim() interrupt 1
{
TL0 = 0x00;
// 设置定时初值
TH0 = 0xDC;
// 设置定时初值 10MS @11.0592MHZ
jihour++;
if(jihour==100) //1 秒
{jihour=0;sec++;}
if(sec==60) //1 分钟
{sec=0;min++;}
if(min==60) //1 小时
{min=0;hour++;}
if(hour==24)
{hour=0;}
if(flag_mb&&flag_mb_run) // 秒表
{
count_mb--;
if(count_mb==255) //1S
{
count_mb=99;
mb--;
if(mb==255){mb=flag_mb_run=0;count_mb=0;}
}
}
if(flag_bs) // 蜂鸣器响
{
count_ss++;
if(count_ss==100) // 约 1 秒
{
bz=0; // 蜂鸣器响
}
if(count_ss==200) // 约 1 秒
{
count_ss=0;
bz=1;
// 蜂鸣器不响
num++;if(num==5){num=0;flag_bs=0;}
}
}
}