獨立按鍵的掃描

EricsT發表於2024-12-04

電路原理分析

按鍵部分[以使用K9\K10\K11\K12為例]

獨立按鍵的掃描

首先,將 KeyOut3 置 0 ,其他三條分路[KeyOut1、KeyOut2、KeyOut4]置1,此時, KeyOut3 分路的按鍵 K9\K10\K11\K12 作為 4 個獨立按鍵處理

將此 4 個按鍵的狀態直接送給小燈,即可控制小燈的亮滅:

按下 K9 ,此時 KeyIn1 變為 0

按下 K10 ,此時 KeyIn2 變為 0

按下 K11 ,此時 KeyIn3 變為 0

按下 K12 ,此時 KeyIn4 變為 0

小燈部分

小燈部分的電路原理分析詳見https://www.cnblogs.com/EricsT/p/18442768

以下做簡單概要

獨立按鍵的掃描

P1.4 置 0,即 ENLED 置0

在下圖中將跳線連線在顯示譯碼部分,即 ADDR0 與 P1.0 連線,ADDR1 與 P1.1 連線,ADDR2 與 P1.2 連線,ADDR3 與 P1.3 連線

P1.3 置 1,即 ADDR3 置1

獨立按鍵的掃描

透過以上使能下圖的U3[74HC138]晶片

P1.0 置 0,即 ADDR0 置 0

P1.1 置 1,即 ADDR1 置 1

P1.2 置 1,即 ADDR2 置 1

獨立按鍵的掃描

透過以上,則U3晶片 A2 置 1,A1 置 1,A0 置 0,查詢下圖真值表可知 LEDS6 為 0

獨立按鍵的掃描

透過以上,下圖中的Q16[9012]三極體導通,此時,只要DBX為0,則小燈就被點亮

獨立按鍵的掃描

即小燈被點亮:P1.0 = 0; P1.1 = 1; P1.2 = 1; P1.3 = 1; P1.4 = 0;

綜合分析

KeyOut3 置 0,即 P2.1 置 0

P1.0 = 0; P1.1 = 1; P1.2 = 1; P1.3 = 1; P1.4 = 0; P2.1 = 0;其餘為預設值

將 KeyIn1 的值給 DB7 ,則 K9 的狀態控制 LED9 的狀態

將 KeyIn2 的值給 DB6 ,則 K10 的狀態控制 LED8 的狀態

將 KeyIn3 的值給 DB5 ,則 K11 的狀態控制 LED7 的狀態

將 KeyIn4 的值給 DB4 ,則 K12 的狀態控制 LED6 的狀態

程式碼實現


#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

sbit LED9 = P0 ^ 7;
sbit LED8 = P0 ^ 6;
sbit LED7 = P0 ^ 5;
sbit LED6 = P0 ^ 4;

sbit KeyIn4 = P2 ^ 7;
sbit KeyIn3 = P2 ^ 6;
sbit KeyIn2 = P2 ^ 5;
sbit KeyIn1 = P2 ^ 4;

void main(void)
{
    //使能U3[74HC138]晶片
    ADDR3 = 1;
    ENLED = 0;
   
    // LEDS6 為 0
    ADDR0 = 0;
    ADDR1 = 1;
    ADDR2 = 1;
    
    //keyOut3 為0,其他均為1
    P2 = 0xFD;
    
    while (1)
    {
        LED9 = KeyIn1;//K9控制LED9
        LED8 = KeyIn2;//K10控制LED8
        LED7 = KeyIn3;//K11控制LED7
        LED6 = KeyIn4;//K12控制LED6
    }
}

電路原理分析

數碼管部分

獨立按鍵的掃描

LEDS2為低電平,Q14導通,數碼管可使用

數碼管電路以及真值表內容詳見https://www.cnblogs.com/EricsT/p/18460817

程式碼部分


#include <reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

sbit KeyIn4 = P2 ^ 7;

unsigned char code LedChar[] =//數碼管顯示字元轉換表
{
	0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
	0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

void main(void)
{
	bit backup = 1;//定義一個位變數,儲存前一次掃描的按鍵值
	unsigned char cnt = 0;//定義一個計數變數,記錄按下的次數

	ENLED = 0;//選擇數碼管DS3進行顯示
	ADDR3 = 1;
	ADDR2 = 0;
	ADDR1 = 1;
	ADDR0 = 0;

	P2 = 0xF7;//P2.3置0,即keyOut1輸出低電平
	P0 = LedChar[cnt];//顯示按鍵次數初值

	while (1)
	{
		if (backup != KeyIn4)//當前值與前次值不相等說明此時按鍵有動作
		{
			if (0 == backup)//如果前次值為0,則說明當前由0變1,即按鍵彈起
			{
				cnt++;//按鍵次數+1
				if (cnt >= 10)//只用一個數碼管顯示,所以加到10就清零重新開始
					cnt = 0;
				P0 = LedChar[cnt];
			}
			backup = KeyIn4;//更新備份為當前值,以備進行下次比較
		}
	}
}

bit51微控制器特有的變數型別,bit型是1位資料,只佔用一個位(bit)的記憶體,用法和其他的基本資料型別一樣。優點:節省記憶體空間,8個bit變數才相當於一個char變數所佔用的空間。只有0和1兩個值

以上程式碼實現的主要功能:在按下按鍵後彈起的過程中,數碼管會顯示按鍵彈起次數,當按鍵彈起10次數碼管會變成0,重新開始計數,按下的時候,不作任何處理

相關文章