|
本帖最后由 啊giao 于 2019-7-4 10:29 編輯
#include<reg51.h>
sbit key_1=P1^0 ; //秒、分、時(shí)間的切換鍵
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; //時(shí)鐘賦初值
/******************T0__50mS中斷程序*******************/
void T0_1s(void) interrupt 1 // 50mS中斷程序
{
static unsigned char count = 0;
TR0 = 0;
TH0 = (65536 - 50000 ) / 256; //設(shè)置T0初始值為:15536
TL0 = (65536 - 50000 ) % 256; //記數(shù)為50000次//50000*1us=50ms*20=1s
TR0 = 1;
count++;
if(count == 20) //中斷服務(wù)程序
{ //定時(shí)1s時(shí)間到(需要中斷20次)
count = 0;
sec++;
if(sec==60) //1分鐘時(shí)間到
{
sec=0;
min++;
if(min==60) //1小時(shí)時(shí)間到
{
min=0;
hour++;
if(hour==24) //24小時(shí)時(shí)間到
{
sec =0;
min =0;
hour=0;
}
}
}
}
}
/**************************************************************/
void delay_5ms() //動(dòng)態(tài)掃描顯示--軟件延時(shí)
{
unsigned char i,j;
for(i=0;i<20;i++)
for(j=0;j<50;j++) //50
;
}
void delay_500ms() //500ms延時(shí)
{
unsigned char a,b;
for(a=500;a>0;a--)
for(b=110;b>0;b--) //500
;
}
/*****************************************************************/
void disp_led()
{
/****************顯示時(shí)鐘 ******************************/
P0=table1[hour/10]; //顯示小時(shí)十位數(shù)
P2=table2[0];
delay_5ms();
P0=0xff; //共陽空字形
P0=table1[hour%10]; //顯示小時(shí)個(gè)位數(shù)
P2=table2[1];
delay_5ms();
P0=0xff;
P0=0xbf; //顯示分隔符'-'
P2=table2[2];
delay_5ms();
P0=0xff;
P0=table1[min/10]; //顯示分鐘十位數(shù)
P2=table2[3];
delay_5ms();
P0=0xff;
P0=table1[min%10]; //顯示分鐘個(gè)位數(shù)
P2=table2[4];
delay_5ms();
P0=0xff;
P0=0xbf; //顯示分隔符'-'
P2=table2[5];
delay_5ms();
P0=0xff;
P0=table1[sec/10]; //顯示秒十位數(shù)
P2=table2[6];
delay_5ms();
P0=0xff;
P0=table1[sec%10]; //顯示秒個(gè)位數(shù)
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() //鍵盤去抖動(dòng)--軟件延時(shí)
{
unsigned char i,j;
for(i=0;i<20;i++)
for(j=0;j<40;j++)
;
}
/*******************調(diào)時(shí)鐘按鍵掃描*******************************/
void key_scan() //鍵盤掃描子程序
{
if(key_1==0) //檢測是否有鍵按下
{
delay_10ms(); //去抖動(dòng)延時(shí)
if(key_1==0) //再次確認(rèn)否有鍵按下
{ { speak();
count1++; //切換次數(shù)
TR0=0; //關(guān)計(jì)時(shí)
// ET0=0;
}
if(count1==4)
{ count1=0; //到4次后重新記
TR0=1; //開計(jì)時(shí)
ET0=1;
}
}
while(key_1==0) disp_led(); //等待按鍵釋放,并且調(diào)用顯示程序
}
if(count1==1)
{ if(key_2==0) //調(diào)整秒鐘加//檢測是否有鍵按下
{
delay_10ms(); //去抖動(dòng)延時(shí)
if(key_2==0) //再次確認(rèn)否有鍵按下
{ speak(); //按鍵聲
sec++;
if(sec==60) sec=0;
}
while(key_2==0) disp_led(); //等待按鍵釋放,并且調(diào)用顯示程序
}
if(key_3==0) //調(diào)整秒鐘減//檢測是否有鍵按下
{
delay_10ms(); //去抖動(dòng)延時(shí)
if(key_3==0) //再次確認(rèn)否有鍵按下
{ speak();
sec--;
if(sec==-1) sec=59;
}
while(key_3==0) disp_led(); //等待按鍵釋放,并且調(diào)用顯示程序
}
if(key_4==0)// ok鍵//
{
delay_10ms();
if(key_4==0)
{count1= 0;TR0=1;}
}
}
if(count1==2)
{
if(key_2==0) //調(diào)整分鐘加//檢測是否有鍵按下
{
delay_10ms(); //去抖動(dòng)延時(shí)
if(key_2==0) //再次確認(rèn)否有鍵按下
{ speak();
min++;
if(min==60) min=0;
}
while(key_2==0) disp_led(); //等待按鍵釋放,并且調(diào)用顯示程序
}
if(key_3==0) //調(diào)整分鐘減//檢測是否有鍵按下
{
delay_10ms(); //去抖動(dòng)延時(shí)
if(key_3==0) //再次確認(rèn)否有鍵按下
{ speak();
min--;
if(min==-1) min=59;
}
while(key_3==0) disp_led(); //等待按鍵釋放,并且調(diào)用顯示程序
}
if(key_4==0)//調(diào)時(shí)結(jié)束鍵//
{
delay_10ms();
if(key_4==0)
{
count1 = 0; TR0=1; }
}
}
if(count1==3)
{ if(key_2==0) //調(diào)整小時(shí)加//檢測是否有鍵按下
{
delay_10ms(); //去抖動(dòng)延時(shí)
if(key_2==0) //再次確認(rèn)否有鍵按下
{ speak();
hour++;
if(hour==24)
{ hour=0;
min=0;
sec=0;
}
}
while(key_2==0) disp_led(); //等待按鍵釋放,并且調(diào)用顯示程序
}
if(key_3==0) //調(diào)整小時(shí)減//檢測是否有鍵按下
{
delay_10ms(); //去抖動(dòng)延時(shí)
if(key_3==0) //再次確認(rèn)否有鍵按下
{ speak();
hour--;
if(hour==-1) hour=23;
}
while(key_3==0) disp_led(); //等待按鍵釋放,并且調(diào)用顯示程序
}
if(key_4==0)//調(diào)時(shí)結(jié)束鍵//
{
delay_10ms();
if(key_4==0)
{
count1 = 0; TR0=1; }
}
}
}
/*********************主函數(shù)***********************/
void main()
{
TMOD = 0x01;
TH0 = (65536 - 50000 ) / 256; //設(shè)置T0初始值
TL0 = (65536 - 50000 ) % 256;
ET0 = 1; //開中斷
EA = 1; //開CPU
TR0 = 1; //開定時(shí)
while(1)
{
disp_led(); //時(shí)鐘顯示
key_scan(); //時(shí)鐘掃描
// clock(); //鬧鐘
}
}
|
-
1.png
(93.04 KB, 下載次數(shù): 33)
下載附件
2019-7-4 10:27 上傳
|