1、獨立按鍵
1.1、按鍵介紹
輕觸開關是一種電子開關,使用時,輕輕按開關按鈕就可使開關接通,當松開手時,開關斷開。
1.2、獨立按鍵原理
按鍵在閉合和斷開時,觸點會存在抖動現象。P2\P3\P1都是準雙向IO口,內部都有上拉電阻。P0口是漏極開路,沒有上拉,只有外部加一個上拉,才能對高低電平進行控制。
在硬件和軟件上進行消抖處理
1)硬件消抖電路(成本高):?
通過RC的充放電延遲時間,利用施密特觸發器(74HC132)可以整理波形成為方方正正的波形。
?
2)軟件消抖
?通過延遲來解決。
1.3、編寫獨立按鍵控制程序
#include "reg52.h"typedef unsigned char u8;
typedef unsigned int u16;sbit led = P2^0;
sbit k1=P3^1; // 開關接口void delay(u16 i) //10us
{while(i--);
}void keypros()
{if(k1==0){//消抖處理delay(1000); //10msif(k1==0){led=~led;}while(!k1); //再次按下}
}void main()
{while(1){keypros();}
}
2、矩陣按鍵
2.1、矩陣按鍵的由來
將獨立按鍵每一個按鍵的管腳連接起來,形成一根線。矩陣鍵盤用最少的IO口控制電路。
矩陣按鍵掃描的原理:
- ?逐行掃描:我們可以通過高四位輪流輸出低電平來對矩陣鍵盤進行逐行掃描,當低四位接收到的數據不全為1的時候,說明有按鍵按下,然后通過接收到的數據是哪一位為0來判斷是哪一個按鍵被按下。
- 行列掃描:我們可以通過高四位全部輸出低電平,低四位輸出高電平。當接收到的數據,低四位不全為高電平時,說明有按鍵按下,然后通過接收的數據值,判斷是哪一列有按鍵按下,然后再反過來,高四位輸出高電平,低四位輸出低電平,然后根據接收到的高四位的值判斷是那一行有按鍵按下,就這樣能夠確定是哪一個按鍵按下了。
2.2、矩陣按鍵掃描原理
#include "reg52.h"
#include <intrins.h>typedef unsigned char u8;
typedef unsigned int u16;
//定義38譯碼器
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;#define GPIO_KEY P1
#define GPIO_DIG P0u8 keyValue;// 發生字碼:code關鍵詞,保持變量到flash里面,如果沒有code保持在data里面
u8 code smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(u16 i)
{while(i--);
}
void keyDown()
{u8 a;GPIO_KEY=0X0f;if(GPIO_KEY!=0X0F){ // 判斷是否按鍵按下delay(1000); //延遲消抖if(GPIO_KEY!=0X0F){GPIO_KEY=0X0F;swith(GPIO_KEY){case(0x07): keyValue=0; break; //S1 根據按下的按鍵進行判斷case(0x0b): keyValue=1; break; //S2case(0x0d): keyValue=2; break; //S3 case(0x0e): keyValue=3; break; //S4}GPIO_KEY=0XF0;swith(GPIO_KEY){case(0x70): keyValue=keyValue; break; //S1 根據按下的按鍵進行判斷case(0xb0): keyValue=keyValue+4; break; //S2case(0xd0): keyValue=keyValue+8; break; //S3 case(0xe0): keyValue=keyValue+12; break; //S4}// 判斷按鍵是否松開,GPIO_KEY檢測行按鍵已經松開,a<50用于判斷是否一直按著while((a<50)&&(GPIO_KEY!=0xf0)){ delay(10000);a++;}}}}void main()
{//選擇數碼管LSA=0;LSB=0;LSC=0;while(1){keyDown();GPIO_DIG=smgduan[keyValue];}
}