真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用單片機(jī)獨(dú)立按鍵輸入

這篇文章主要介紹“如何使用單片機(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ù)處理按鍵的彈起事件。

如何使用單片機(jī)獨(dú)立按鍵輸入

通過本練習(xí),可以學(xué)習(xí)到:

  1. 與門電路的使用

  2. 中斷的使用

二、方法步驟

1. 電路設(shè)計(jì)

有按鍵按下時(shí),對(duì)應(yīng)引腳會(huì)被下拉為低電平。通過與門電路將這些電路連接起來,有任何一個(gè)引腳為低電平0時(shí),與門都會(huì)輸出低電平0,該低電平正好用作按鍵按下事件的中斷源。按鍵按下和按鍵彈起是互斥事件,因此將按鍵按下的中斷源通過非門取非,即可用作按鍵彈起事件的中斷源。

細(xì)節(jié):與門的檢索關(guān)鍵詞 AND,非門的檢索關(guān)鍵詞 NOT。

如何使用單片機(jī)獨(dú)立按鍵輸入

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);
}

三、其它注意事項(xiàng)

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í)用的文章!


分享名稱:如何使用單片機(jī)獨(dú)立按鍵輸入
當(dāng)前地址:http://weahome.cn/article/ijeosh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部