|
本帖最后由 啊giao 于 2019-7-4 10:29 编辑
#include<reg51.h>
sbit key_1=P1^0 ; //秒、分、时间的切换键
sbit key_2=P1^1 ; //加1
sbit key_3=P1^2 ; //减1
sbit key_4=P1^3 ; //ok
sbit speaker_= P3^1;
unsigned char code table1[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //笔段码
unsigned char code table2[ ]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位选码
unsigned char count1=0 ;
/****************************************************/
unsigned char hour = 12, min = 0,sec = 0; //时钟赋初值
/******************T0__50mS中断程序*******************/
void T0_1s(void) interrupt 1 // 50mS中断程序
{
static unsigned char count = 0;
TR0 = 0;
TH0 = (65536 - 50000 ) / 256; //设置T0初始值为:15536
TL0 = (65536 - 50000 ) % 256; //记数为50000次//50000*1us=50ms*20=1s
TR0 = 1;
count++;
if(count == 20) //中断服务程序
{ //定时1s时间到(需要中断20次)
count = 0;
sec++;
if(sec==60) //1分钟时间到
{
sec=0;
min++;
if(min==60) //1小时时间到
{
min=0;
hour++;
if(hour==24) //24小时时间到
{
sec =0;
min =0;
hour=0;
}
}
}
}
}
/**************************************************************/
void delay_5ms() //动态扫描显示--软件延时
{
unsigned char i,j;
for(i=0;i<20;i++)
for(j=0;j<50;j++) //50
;
}
void delay_500ms() //500ms延时
{
unsigned char a,b;
for(a=500;a>0;a--)
for(b=110;b>0;b--) //500
;
}
/*****************************************************************/
void disp_led()
{
/****************显示时钟 ******************************/
P0=table1[hour/10]; //显示小时十位数
P2=table2[0];
delay_5ms();
P0=0xff; //共阳空字形
P0=table1[hour%10]; //显示小时个位数
P2=table2[1];
delay_5ms();
P0=0xff;
P0=0xbf; //显示分隔符'-'
P2=table2[2];
delay_5ms();
P0=0xff;
P0=table1[min/10]; //显示分钟十位数
P2=table2[3];
delay_5ms();
P0=0xff;
P0=table1[min%10]; //显示分钟个位数
P2=table2[4];
delay_5ms();
P0=0xff;
P0=0xbf; //显示分隔符'-'
P2=table2[5];
delay_5ms();
P0=0xff;
P0=table1[sec/10]; //显示秒十位数
P2=table2[6];
delay_5ms();
P0=0xff;
P0=table1[sec%10]; //显示秒个位数
P2=table2[7];
delay_5ms();
P0=0xff;
}
/*******************闹钟程序****************************/
void clock()
{ unsigned int i;
if(hour==12 && min==0 && sec==30)
{ speaker_=0;
for(i=0;i<500;i++) //15秒蜂鸣器
{
disp_led();
}
speaker_=1;
}
}
/*********************蜂鸣器按键声*****************************/
void speak()
{ unsigned char m;
speaker_=0;
for(m=0;m<3;m++)
{
disp_led();
}
speaker_=1;
}
/********************按键扫描程序***************************/
void delay_10ms() //键盘去抖动--软件延时
{
unsigned char i,j;
for(i=0;i<20;i++)
for(j=0;j<40;j++)
;
}
/*******************调时钟按键扫描*******************************/
void key_scan() //键盘扫描子程序
{
if(key_1==0) //检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key_1==0) //再次确认否有键按下
{ { speak();
count1++; //切换次数
TR0=0; //关计时
// ET0=0;
}
if(count1==4)
{ count1=0; //到4次后重新记
TR0=1; //开计时
ET0=1;
}
}
while(key_1==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(count1==1)
{ if(key_2==0) //调整秒钟加//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key_2==0) //再次确认否有键按下
{ speak(); //按键声
sec++;
if(sec==60) sec=0;
}
while(key_2==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(key_3==0) //调整秒钟减//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key_3==0) //再次确认否有键按下
{ speak();
sec--;
if(sec==-1) sec=59;
}
while(key_3==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(key_4==0)// ok键//
{
delay_10ms();
if(key_4==0)
{count1= 0;TR0=1;}
}
}
if(count1==2)
{
if(key_2==0) //调整分钟加//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key_2==0) //再次确认否有键按下
{ speak();
min++;
if(min==60) min=0;
}
while(key_2==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(key_3==0) //调整分钟减//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key_3==0) //再次确认否有键按下
{ speak();
min--;
if(min==-1) min=59;
}
while(key_3==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(key_4==0)//调时结束键//
{
delay_10ms();
if(key_4==0)
{
count1 = 0; TR0=1; }
}
}
if(count1==3)
{ if(key_2==0) //调整小时加//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key_2==0) //再次确认否有键按下
{ speak();
hour++;
if(hour==24)
{ hour=0;
min=0;
sec=0;
}
}
while(key_2==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(key_3==0) //调整小时减//检测是否有键按下
{
delay_10ms(); //去抖动延时
if(key_3==0) //再次确认否有键按下
{ speak();
hour--;
if(hour==-1) hour=23;
}
while(key_3==0) disp_led(); //等待按键释放,并且调用显示程序
}
if(key_4==0)//调时结束键//
{
delay_10ms();
if(key_4==0)
{
count1 = 0; TR0=1; }
}
}
}
/*********************主函数***********************/
void main()
{
TMOD = 0x01;
TH0 = (65536 - 50000 ) / 256; //设置T0初始值
TL0 = (65536 - 50000 ) % 256;
ET0 = 1; //开中断
EA = 1; //开CPU
TR0 = 1; //开定时
while(1)
{
disp_led(); //时钟显示
key_scan(); //时钟扫描
// clock(); //闹钟
}
}
|
-
1.png
(93.04 KB, 下载次数: 21)
|