日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]在單片機系統(tǒng)中應(yīng)用按鍵的時候,如果只需要按下一次按鍵加 1 或減 1,那用第 8 章學(xué)到的知識就可以完成了,但如果想連續(xù)加很多數(shù)字的時候,要一次次按下這個按鍵確實有點不方便,這時我們會希望一直按住按鍵,數(shù)字就

在單片機系統(tǒng)中應(yīng)用按鍵的時候,如果只需要按下一次按鍵加 1 或減 1,那用第 8 章學(xué)到的知識就可以完成了,但如果想連續(xù)加很多數(shù)字的時候,要一次次按下這個按鍵確實有點不方便,這時我們會希望一直按住按鍵,數(shù)字就自動持續(xù)增加或減小,這就是所謂的長短按鍵應(yīng)用。


當檢測到一個按鍵產(chǎn)生按下動作后,馬上執(zhí)行一次相應(yīng)的操作,同時在程序里記錄按鍵按下的持續(xù)時間,該時間超過 1 秒后(主要是為了區(qū)別短按和長按這兩個動作,因短按的時間通常都達到幾百 ms),每隔 200ms(如果你需要更快那就用更短的時間,反之亦然)就自動再執(zhí)行一次該按鍵對應(yīng)的操作,這就是一個典型的長按鍵效果。


對此,我們做了一個模擬定時炸彈效果的實例,提供給大家作為參考。打開開關(guān)后,數(shù)碼管顯示數(shù)字 0,按向上的按鍵數(shù)字加 1,按向下的按鍵數(shù)字減 1,長按向上按鍵 1 秒后,數(shù)字會持續(xù)增加,長按向下按鍵 1 秒后,數(shù)字會持續(xù)減小。設(shè)定好數(shù)字后,按下回車按鍵,時間就會進行倒計時,當?shù)褂嫊r到 0 的時候,用蜂鳴器和板子上的 8 個 LED 小燈做炸彈效果,蜂鳴器持續(xù)響,LED 小燈全亮。

純文本復(fù)制

#include

sbit BUZZ = P1^6;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;

sbit KEY_IN_1 = P2^4;

sbit KEY_IN_2 = P2^5;

sbit KEY_IN_3 = P2^6;

sbit KEY_IN_4 = P2^7;

sbit KEY_OUT_1 = P2^3;

sbit KEY_OUT_2 = P2^2;

sbit KEY_OUT_3 = P2^1;

sbit KEY_OUT_4 = P2^0;

unsigned char code LedChar[] = { //數(shù)碼管顯示字符轉(zhuǎn)換表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};

unsigned char LedBuff[7] = { //數(shù)碼管+獨立 LED 顯示緩沖區(qū)

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};

unsigned char code KeyCodeMap[4][4] = { //矩陣按鍵編號到標準鍵盤鍵碼的映射表

{ 0x31, 0x32, 0x33, 0x26 }, //數(shù)字鍵 1、數(shù)字鍵 2、數(shù)字鍵 3、向上鍵

{ 0x34, 0x35, 0x36, 0x25 }, //數(shù)字鍵 4、數(shù)字鍵 5、數(shù)字鍵 6、向左鍵

{ 0x37, 0x38, 0x39, 0x28 }, //數(shù)字鍵 7、數(shù)字鍵 8、數(shù)字鍵 9、向下鍵

{ 0x30, 0x1B, 0x0D, 0x27 } //數(shù)字鍵 0、ESC 鍵、 回車鍵、 向右鍵

};

unsigned char KeySta[4][4] = { //全部矩陣按鍵的當前狀態(tài)

{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}

};

unsigned long pdata KeyDownTime[4][4] = { //每個按鍵按下的持續(xù)時間,單位 ms

{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}

};

bit enBuzz = 0; //蜂鳴器使能標志

bit flag1s = 0; //1 秒定時標志

bit flagStart = 0; //倒計時啟動標志

unsigned char T0RH = 0; //T0 重載值的高字節(jié)

unsigned char T0RL = 0; //T0 重載值的低字節(jié)

unsigned int CountDown = 0; //倒計時計數(shù)器

void ConfigTimer0(unsigned int ms);

void ShowNumber(unsigned long num);

void KeyDriver();

void main(){

EA = 1; //使能總中斷

ENLED = 0; //選擇數(shù)碼管和獨立 LED

ADDR3 = 1;

ConfigTimer0(1); //配置 T0 定時 1ms

ShowNumber(0); //上電顯示 0

while (1){

KeyDriver(); //調(diào)用按鍵驅(qū)動函數(shù)

if (flagStart && flag1s){ //倒計時啟動且 1 秒定時到達時,處理倒計時

flag1s = 0;

if (CountDown > 0){ //倒計時未到 0 時,計數(shù)器遞減

CountDown--;

ShowNumber(CountDown); //刷新倒計時數(shù)顯示

if (CountDown == 0){ //減到 0 時,執(zhí)行聲光報警

enBuzz = 1;

//啟動蜂鳴器發(fā)聲

LedBuff[6] = 0x00; //點亮獨立 LED

}

}

}

}

}

/* 配置并啟動 T0,ms-T0 定時時間 */

void ConfigTimer0(unsigned int ms){

unsigned long tmp; //臨時變量

tmp = 11059200 / 12; //定時器計數(shù)頻率

tmp = (tmp * ms) / 1000; //計算所需的計數(shù)值

tmp = 65536 - tmp; //計算定時器重載值

tmp = tmp + 28; //補償中斷響應(yīng)延時造成的誤差

T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節(jié)

T0RL = (unsigned char)tmp;

TMOD &= 0xF0; //清零 T0 的控制位

TMOD |= 0x01; //配置 T0 為模式 1

TH0 = T0RH; //加載 T0 重載值

TL0 = T0RL;

ET0 = 1; //使能 T0 中斷

TR0 = 1; //啟動 T0

}

/* 將一個無符號長整型的數(shù)字顯示到數(shù)碼管上,num-待顯示數(shù)字 */

void ShowNumber(unsigned long num){

signed char i;

unsigned char buf[6];

for (i=0; i<6; i++){ //把長整型數(shù)轉(zhuǎn)換為 6 位十進制的數(shù)組

buf[i] = num % 10;

num = num / 10;

}

for (i=5; i>=1; i--){ //從最高位起,遇到 0 轉(zhuǎn)換為空格,遇到非 0 則退出循環(huán)

if (buf[i] == 0){

LedBuff[i] = 0xFF;

}else{

break;

}

}

for ( ; i>=0; i--){ //剩余低位都如實轉(zhuǎn)換為數(shù)碼管顯示字符

LedBuff[i] = LedChar[buf[i]];

}

}

/* 按鍵動作函數(shù),根據(jù)鍵碼執(zhí)行相應(yīng)的操作,keycode-按鍵鍵碼 */

void KeyAction(unsigned char keycode){ //按鍵動作函數(shù),根據(jù)鍵碼執(zhí)行相應(yīng)動作

if (keycode == 0x26){ //向上鍵,倒計時設(shè)定值遞增

if (CountDown < 9999){ //最大計時 9999 秒

CountDown++;

ShowNumber(CountDown);

}

}else if (keycode == 0x28){ //向下鍵,倒計時設(shè)定值遞減

if (CountDown > 1){ //最小計時 1 秒

CountDown--;

ShowNumber(CountDown);

}

}else if (keycode == 0x0D){ //回車鍵,啟動倒計時

flagStart = 1; //啟動倒計時

}else if (keycode == 0x1B){ //Esc 鍵,取消倒計時

enBuzz = 0; //關(guān)閉蜂鳴器

LedBuff[6] = 0xFF; //關(guān)閉獨立 LED

flagStart = 0; //停止倒計時

CountDown = 0; //倒計時數(shù)歸零

ShowNumber(CountDown);

}

}

/* 按鍵驅(qū)動函數(shù),檢測按鍵動作,調(diào)度相應(yīng)動作函數(shù),需在主循環(huán)中調(diào)用 */

void KeyDriver(){

unsigned char i, j;

static unsigned char pdata backup[4][4] = { //按鍵值備份,保存前一次的值

{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}

};

static unsigned long pdata TimeThr[4][4] = { //快速輸入執(zhí)行的時間閾值

{1000, 1000, 1000, 1000}, {1000, 1000, 1000, 1000},

{1000, 1000, 1000, 1000}, {1000, 1000, 1000, 1000}

};

for (i=0; i<4; i++){ //循環(huán)掃描 4*4 的矩陣按鍵

for (j=0; j<4; j++){

if (backup[i][j] != KeySta[i][j]){ //檢測按鍵動作

if (backup[i][j] != 0){ //按鍵按下時執(zhí)行動作

KeyAction(KeyCodeMap[i][j]); //調(diào)用按鍵動作函數(shù)

}

}

backup[i][j] = KeySta[i][j];

if (KeyDownTime[i][j] > 0){

if (KeyDownTime[i][j] >= TimeThr[i][j]){ //達到閾值時執(zhí)行一次動作

KeyAction(KeyCodeMap[i][j]); //調(diào)用按鍵動作函數(shù)

TimeThr[i][j] += 200; //時間閾值增加 200ms,以準備下次執(zhí)行

}

}else{ //按鍵彈起時復(fù)位閾值時間

TimeThr[i][j] = 1000; //恢復(fù) 1s 的初始閾值時間

}

}

}

}

/* 按鍵掃描函數(shù),需在定時中斷中調(diào)用 */

void KeyScan(){

unsigned char i;

static unsigned char keyout = 0; //矩陣按鍵掃描輸出索引

static unsigned char keybuf[4][4] = { //矩陣按鍵掃描緩沖區(qū)

{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},

{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}

};

//將一行的 4 個按鍵值移入緩沖區(qū)

keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;

keybuf[keyout][1] = (keybuf[

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

特朗普集團近日取消了其新推出的T1智能手機“將在美國制造”的宣傳標語,此舉源于外界對這款手機能否以當前定價在美國本土生產(chǎn)的質(zhì)疑。

關(guān)鍵字: 特朗普 蘋果 AI

美國總統(tǒng)特朗普在公開場合表示,他已要求蘋果公司CEO蒂姆·庫克停止在印度建廠,矛頭直指該公司生產(chǎn)多元化的計劃。

關(guān)鍵字: 特朗普 蘋果 AI

4月10日消息,據(jù)媒體報道,美國總統(tǒng)特朗普宣布,美國對部分貿(mào)易伙伴暫停90天執(zhí)行新關(guān)稅政策,同時對中國的關(guān)稅提高到125%,該消息公布后蘋果股價飆升了15%。這次反彈使蘋果市值增加了4000多億美元,目前蘋果市值接近3萬...

關(guān)鍵字: 特朗普 AI 人工智能 特斯拉

3月25日消息,據(jù)報道,當?shù)貢r間3月20日,美國總統(tǒng)特朗普在社交媒體平臺“真實社交”上發(fā)文寫道:“那些被抓到破壞特斯拉的人,將有很大可能被判入獄長達20年,這包括資助(破壞特斯拉汽車)者,我們正在尋找你。”

關(guān)鍵字: 特朗普 AI 人工智能 特斯拉

1月22日消息,剛剛,新任美國總統(tǒng)特朗普放出重磅消息,將全力支持美國AI發(fā)展。

關(guān)鍵字: 特朗普 AI 人工智能

特朗普先生有兩件事一定會載入史冊,一個是筑墻,一個是挖坑。在美墨邊境筑墻的口號確保邊境安全,降低因非法移民引起的犯罪率過高問題;在中美科技產(chǎn)業(yè)之間挖坑的口號也是安全,美國企業(yè)不得使用對美國國家安全構(gòu)成威脅的電信設(shè)備,總統(tǒng)...

關(guān)鍵字: 特朗普 孤立主義 科技產(chǎn)業(yè)

據(jù)路透社1月17日消息顯示,知情人士透露,特朗普已通知英特爾、鎧俠在內(nèi)的幾家華為供應(yīng)商,將要撤銷其對華為的出貨的部分許可證,同時將拒絕其他數(shù)十個向華為供貨的申請。據(jù)透露,共有4家公司的8份許可被撤銷。另外,相關(guān)公司收到撤...

關(guān)鍵字: 華為 芯片 特朗普

曾在2018年時被美國總統(tǒng)特朗普稱作“世界第八奇跡”的富士康集團在美國威斯康星州投資建設(shè)的LCD顯示屏工廠項目,如今卻因為富士康將項目大幅縮水并拒絕簽訂新的合同而陷入了僵局。這也導(dǎo)致富士康無法從當?shù)卣抢铽@得約40億美...

關(guān)鍵字: 特朗普 富士康

今年5月,因自己發(fā)布的推文被貼上“無確鑿依據(jù)”標簽而與推特發(fā)生激烈爭執(zhí)后,美國總統(tǒng)特朗普簽署了一項行政令,下令要求重審《通信規(guī)范法》第230條。

關(guān)鍵字: 谷歌 facebook 特朗普

眾所周知,寄往白宮的所有郵件在到達白宮之前都會在他地進行分類和篩選。9月19日,根據(jù)美國相關(guān)執(zhí)法官員的通報,本周早些時候,執(zhí)法人員截獲了一個寄給特朗普總統(tǒng)的包裹,該包裹內(nèi)包含蓖麻毒蛋白。

關(guān)鍵字: 美國 白宮 特朗普
關(guān)閉