|
其實(shí)編程就是一個(gè)小模塊一個(gè)小模塊積累而成的,當(dāng)我完成99秒倒計(jì)時(shí),我就想加入按鍵檢測(cè)模塊
今天下午有點(diǎn)興趣,就加入了兩個(gè)按鍵,一個(gè)是上升按鍵,每次按下后數(shù)字加1
而按鍵二 就是啟動(dòng)和停止按鍵
當(dāng)按下KEY4時(shí) 停止倒計(jì)時(shí),按下另一個(gè)按鍵可以啟動(dòng)
當(dāng)啟動(dòng)倒計(jì)時(shí)時(shí),按下按鍵KEY3時(shí)就會(huì)停止,再按一次就會(huì)重新啟動(dòng)
數(shù)字最大可以加到999
與大家分享我不值一提的小程序 吧!程序風(fēng)格是宋老師的風(fēng)格
也不搞什么回復(fù)可見(jiàn)了 !大家有什么意見(jiàn)要提出,一起進(jìn)步的好
另外,發(fā)表在網(wǎng)絡(luò)上也是自己備份的,到時(shí)自己的計(jì)算機(jī)沒(méi)有了,也好在這里找到
/******************************************************
項(xiàng)目名稱:99秒倒計(jì)時(shí)
時(shí)間:2015-7-9 V1.0
目的:使用51單片機(jī)的定時(shí)器1實(shí)現(xiàn)99秒倒計(jì)時(shí)
單片機(jī)平臺(tái):KST51單片機(jī)開(kāi)發(fā)平臺(tái)-金沙灘單片機(jī)
注意:unsigned char 的取值范圍為0-255
unsigned char 的取值范圍為0-65535
要結(jié)合單片機(jī)的硬件來(lái)看程序
2015-7-18 V1.1
增加按鍵功能
增加顯示為3位數(shù)碼管
按鍵按住后,可以讓數(shù)字上升,最大至999
增加按鍵功能停止或者啟動(dòng),同一個(gè)按鍵實(shí)現(xiàn)功能
**********************************************************/
#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() //此函數(shù)實(shí)現(xiàn)Led的動(dòng)態(tài)掃描
{
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;
//定時(shí)器寄存器初始化
TMOD = 0X01;
TH0 = 0xFC; //1 ms定時(shí)
TL0 = 0x67;
EA = 1;
ET0 = 1;
TR0 = 1;
P2 = 0xF7; //P2.3 and P2.0 置 0 ,即Keyout1 keyout4輸出低電平
while(1)
{
if(KeySta != backup) //當(dāng)前狀態(tài)與前次值不相等說(shuō)明此時(shí)按鍵有動(dòng)作
{
if(backup == 0) //如果前次值為0,則說(shuō)明當(dāng)前是彈起狀態(tài)
{
flag = 0; //倒計(jì)時(shí)停止
sec++;
}
}
backup = KeySta; //更新備份為當(dāng)前值,以備時(shí)行下次比較
if(KeySta_1 != backup_1) //Enter按鍵
{
if(backup_1 == 0)
{
flag = ~flag; //重新啟動(dòng)倒計(jì)時(shí)
}
}
backup_1 = KeySta_1;
Led();
}
}
//中斷服務(wù)函數(shù)
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;
}
}
|
評(píng)分
-
查看全部評(píng)分
|