其實編程就是一個小模塊一個小模塊積累而成的,當我完成99秒倒計時,我就想加入按鍵檢測模塊
今天下午有點興趣,就加入了兩個按鍵,一個是上升按鍵,每次按下后數字加1
而按鍵二 就是啟動和停止按鍵
當按下KEY4時 停止倒計時,按下另一個按鍵可以啟動
當啟動倒計時時,按下按鍵KEY3時就會停止,再按一次就會重新啟動
數字最大可以加到999
與大家分享我不值一提的小程序 吧!程序風格是宋老師的風格
也不搞什么回復可見了 !大家有什么意見要提出,一起進步的好
另外,發表在網絡上也是自己備份的,到時自己的計算機沒有了,也好在這里找到
/******************************************************
項目名稱:99秒倒計時
時間:2015-7-9 V1.0
目的:使用51單片機的定時器1實現99秒倒計時
單片機平臺:KST51單片機開發平臺-金沙灘單片機
注意:unsigned char 的取值范圍為0-255
unsigned char 的取值范圍為0-65535
要結合單片機的硬件來看程序
2015-7-18 V1.1
增加按鍵功能
增加顯示為3位數碼管
按鍵按住后,可以讓數字上升,最大至999
增加按鍵功能停止或者啟動,同一個按鍵實現功能
**********************************************************/
#include<reg52.h>
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY3 = P2 ^6;
sbit KEY4 = P2 ^7;
bit flag = 1;
bit KeySta = 1;
bit KeySta_1 = 1;
unsigned int sec = 99;
unsigned char code LedChar[] ={
0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,
0x80,0x90,0X88,0x83,0XC6,0xA1,0x86,0x8E
};
unsigned char LedBuff[6] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
void LedScan() //此函數實現Led的動態掃描
{
static unsigned char i = 0;
P0 = 0xFF;
P1 = (P1 & 0xF8)| i;
P0 = LedBuff[ i];
if(i < 2)
i++;
else
i = 0;
}
void Led()
{
LedBuff[0] = LedChar[sec % 10];
LedBuff[1] = LedChar[sec/10 %10];
LedBuff[2] = LedChar[sec/100 %10];
}
void main()
{
bit backup = 1; //按鍵值備份,保存前一次的掃描值
bit backup_1 = 1;
ENLED = 0;
ADDR3 = 1;
//定時器寄存器初始化
TMOD = 0X01;
TH0 = 0xFC; //1 ms定時
TL0 = 0x67;
EA = 1;
ET0 = 1;
TR0 = 1;
P2 = 0xF7; //P2.3 and P2.0 置 0 ,即Keyout1 keyout4輸出低電平
while(1)
{
if(KeySta != backup) //當前狀態與前次值不相等說明此時按鍵有動作
{
if(backup == 0) //如果前次值為0,則說明當前是彈起狀態
{
flag = 0; //倒計時停止
sec++;
}
}
backup = KeySta; //更新備份為當前值,以備時行下次比較
if(KeySta_1 != backup_1) //Enter按鍵
{
if(backup_1 == 0)
{
flag = ~flag; //重新啟動倒計時
}
}
backup_1 = KeySta_1;
Led();
}
}
//中斷服務函數
void InterruptTimer0() interrupt 1
{
static unsigned int cnt = 0;
static unsigned char keybuf = 0xFF;
static unsigned char keybuf_1 = 0xFF;
//Range of "unsigned char" is 0 to 255
//Range of "unsigned int" is 0 to 65535
TH0 = 0xFC;
TL0 = 0x67;
cnt++;
LedScan();
keybuf = (keybuf << 1) | KEY4;
if(keybuf == 0)
{
KeySta = 0;
}
else if(keybuf == 0xFF)
{
KeySta = 1;
}
else
{
}
//end key4 pro
keybuf_1 = (keybuf_1 << 1) |KEY3;
if(keybuf_1 == 0)
{
KeySta_1 = 0;
}
else if(keybuf_1 == 0xFF)
{
KeySta_1 = 1;
}
else
{
}
//end the key3
if(cnt >= 1000 && flag == 1 )
{
cnt = 0;
if(sec >0)
sec --;
else
sec = 99;
}
}
|