這篇文章主要介紹“如何使用單片機(jī)獨(dú)立按鍵輸入”,在日常操作中,相信很多人在如何使用單片機(jī)獨(dú)立按鍵輸入問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何使用單片機(jī)獨(dú)立按鍵輸入”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)成立與2013年,先為南澗等服務(wù)建站,南澗等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為南澗企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
在《 52單片機(jī)獨(dú)立按鍵輸入 》中,在主函數(shù)中通過循環(huán)掃描得到按鍵輸入,這種設(shè)計(jì)的缺點(diǎn)是整個(gè)過程CPU主進(jìn)程一直被占用。為了改變這種情況,本次練習(xí)采用中斷機(jī)制改進(jìn)獨(dú)立按鍵輸入的設(shè)計(jì)。使用中斷時(shí),主函數(shù)不需要掃描按鍵輸入;當(dāng)有按鍵按下時(shí),通過與門首先向單片機(jī)發(fā)起中斷請(qǐng)求,通過中斷函數(shù)處理按鍵按下事件;當(dāng)按鍵彈起時(shí),外部電路向單片機(jī)發(fā)起另一個(gè)中斷請(qǐng)求,通過另一個(gè)中斷函數(shù)處理按鍵的彈起事件。
通過本練習(xí),可以學(xué)習(xí)到:
與門電路的使用
中斷的使用
1. 電路設(shè)計(jì)
有按鍵按下時(shí),對(duì)應(yīng)引腳會(huì)被下拉為低電平。通過與門電路將這些電路連接起來,有任何一個(gè)引腳為低電平0時(shí),與門都會(huì)輸出低電平0,該低電平正好用作按鍵按下事件的中斷源。按鍵按下和按鍵彈起是互斥事件,因此將按鍵按下的中斷源通過非門取非,即可用作按鍵彈起事件的中斷源。
細(xì)節(jié):與門的檢索關(guān)鍵詞 AND,非門的檢索關(guān)鍵詞 NOT。
2. 程序設(shè)計(jì)
(1)中斷的啟用 主函數(shù)開始,設(shè)置啟用中外部斷。
// 啟用中斷 EA = 1; // 開中斷(總開關(guān)) EX0 = 1; // 允許外部中斷0中斷 IT0 = 1; // 下降沿觸發(fā)IT0=1。 // *下降沿觸發(fā)只觸發(fā)一次,低電平觸發(fā)則可能會(huì)反復(fù)觸發(fā)。 EX1 = 1; // 允許外部中斷1中斷 IT1 = 1; // 下降沿觸發(fā)IT1=1。 // 啟用中斷
(2)按鍵按下中斷函數(shù) 按鍵按下發(fā)起中斷后,臨時(shí)關(guān)閉中斷,檢測(cè)按鍵,檢測(cè)完成后重新開啟中斷。這種設(shè)計(jì)的目的是避免按鍵抖動(dòng)引發(fā)多重中斷。
/** * @brief 按鍵按下時(shí)的中斷函數(shù) * */ void onKeyDown() interrupt 0 { // 臨時(shí)關(guān)閉中斷 EA = 0; // 臨時(shí)關(guān)閉中斷 if (P1_0 == 0) { delayNms(10); // 消除抖動(dòng) if (P1_0 == 0) { displayNum(0); goto FUNCEND; } } if (P1_1 == 0) { delayNms(10); // 消除抖動(dòng) if (P1_1 == 0) { displayNum(1); goto FUNCEND; } } if (P1_2 == 0) { delayNms(10); // 消除抖動(dòng) if (P1_2 == 0) { displayNum(2); goto FUNCEND; } } if (P1_3 == 0) { delayNms(10); // 消除抖動(dòng) if (P1_3 == 0) { displayNum(3); goto FUNCEND; } } if (P1_4 == 0) { delayNms(10); // 消除抖動(dòng) if (P1_4 == 0) { displayNum(4); goto FUNCEND; } } if (P1_5 == 0) { delayNms(10); // 消除抖動(dòng) if (P1_5 == 0) { displayNum(5); goto FUNCEND; } } if (P1_6 == 0) { delayNms(10); // 消除抖動(dòng) if (P1_6 == 0) { displayNum(6); goto FUNCEND; } } if (P1_7 == 0) { delayNms(10); // 消除抖動(dòng) if (P1_7 == 0) { displayNum(7); goto FUNCEND; } } FUNCEND: // 重啟中斷 EA = 1; // 重啟中斷 }
(3)按鍵彈起中斷函數(shù) 按鍵彈起后,數(shù)碼管停止顯示。
/** * @brief 按鍵抬起時(shí)的中斷函數(shù) * */ void onKeyUP() interrupt 2 { display4N(0x10, 0x10, 0x10, 0x10); }
1. 用到的全局變量的聲明。
// 全局變量 sbit P1_0 = P1 ^ 0; sbit P1_1 = P1 ^ 1; sbit P1_2 = P1 ^ 2; sbit P1_3 = P1 ^ 3; sbit P1_4 = P1 ^ 4; sbit P1_5 = P1 ^ 5; sbit P1_6 = P1 ^ 6; sbit P1_7 = P1 ^ 7; const unsigned char HexBCD[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0x7F}; // 全局變量
2. 用到的其它函數(shù)。
/** * @brief 延時(shí) ms 毫秒。 0 <= ms <= 65535 * **/ void delayNms(unsigned int ms) { unsigned int n = 124; while (ms) { while (n) n--; ms--; n = 124; } } /** * @brief 分別在4根數(shù)碼管上顯示數(shù)字。每個(gè)數(shù)字的范圍都是0-F。 * * @param n1 第一個(gè)數(shù)碼管上顯示的數(shù)字。 * @param n2 第二個(gè)數(shù)碼管上顯示的數(shù)字。 * @param n3 第三個(gè)數(shù)碼管上顯示的數(shù)字。 * @param n4 第四個(gè)數(shù)碼管上顯示的數(shù)字。 */ void display4N(UCHAR n1, UCHAR n2, UCHAR n3, UCHAR n4) { P2 = 0x01; // 選擇第一個(gè)數(shù)碼管 if (n1 >= 0 && n1 < 0x10) P0 = HexBCD[n1]; // 顯示n1 else P0 = 0xFF; delayNms(5); P2 = 0x02; // 選擇第二個(gè)數(shù)碼管 if (n2 >= 0 && n2 < 0x10) P0 = HexBCD[n2]; // 顯示n2 else P0 = 0xFF; delayNms(5); P2 = 0x04; // 選擇第三個(gè)數(shù)碼管 if (n3 >= 0 && n3 < 0x10) P0 = HexBCD[n3]; // 顯示n3 else P0 = 0xFF; delayNms(5); P2 = 0x08; // 選擇第四個(gè)數(shù)碼管 if (n4 >= 0 && n4 < 0x10) P0 = HexBCD[n4]; // 顯示n4 else P0 = 0xFF; delayNms(5); } /** * @brief 顯示給定的數(shù)n * * @param n 給定的數(shù)n */ void displayNum(int n) { UCHAR thousand; // 千位 UCHAR hundred; // 百位 UCHAR decade; // 十位 UCHAR ones; // 個(gè)位 thousand = n / 1000; hundred = (n % 1000) / 100; decade = (n % 100) / 10; ones = n % 10; if (n < 1000) // 若n小于1000, 則不顯示千位 thousand = 0xff; if (n < 100) // 若n小于100,, 則不顯示百位 hundred = 0xff; if (n < 10) // 若n小于10,, 則不顯示十位 decade = 0xff; display4N(thousand, hundred, decade, ones); }
到此,關(guān)于“如何使用單片機(jī)獨(dú)立按鍵輸入”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!