1. 程式人生 > >51單片機:獨立按鍵與矩陣按鍵控制數碼管

51單片機:獨立按鍵與矩陣按鍵控制數碼管

#define clas 4行 ++ 浪費 down 技術分享 sig .com

一,獨立按鍵註意一下幾點

>按下的時候,電壓被拉低,所以IO口要傳低電平( 0x0 )

>按下的時候要消除抖動 ( 延時10ms ),在判斷,是否還是低電平,再做業務處理

下面這段程序,就是通過一個獨立按鍵連接到p1口,控制靜態數碼管的 一段 進行亮和滅的切換。

#include <reg52.h>

sbit key_control = P1^0;
sbit led = P0^0;

typedef unsigned char u8;
typedef unsigned int u16;

void delay( u16 i ){
    while( i-- );
}

void key_press(){ if( key_control == 0x0 ) { delay( 1110 ); if( key_control == 0x0 ){ led = ~led; } while( !key_control ); } } void main (){ /* while( 1 ){ if( key_control == 0x0 ) { delay( 1110 ); //大概10ms if ( key_control == 0x0 ) { led = 1; } }else if( key_control == 0x1 ) { delay( 1110 ); if ( key_control == 0x1 ) { led = 0; } } }
*/ led = 0; while( 1 ) { key_press(); } }

二, 當按鍵比較多的時候,用矩陣按鈕,因為如果不用矩陣按鈕,一個獨立按鍵需要一個IO口,浪費資源。

如: 16個獨立按鍵需要16個io口, 而16個矩陣按鍵(4x4,一共8個管腳)需要8個IO口

下面的程序,通過16個矩陣按鈕,控制靜態數碼管,顯示0~F

技術分享圖片

#include <reg52.h>

#define GPIO_DIG    P0   //段選數碼管
#define GPIO_KEY     P1      //
矩陣按鍵 typedef unsigned char u8; typedef unsigned int u16; void delay( u16 i ){ while( i-- ); } u8 key_value; //靜態數碼管段碼 u8 character [16] = { 0xC0, 0xF9 , 0xA4 , 0xB0 , 0x99 , 0x92, 0x82 , 0xF8 , 0x80 , 0x90 , 0x88 , 0x83, 0xC6 , 0xA1 , 0x86 , 0x8E}; void key_down(){ u8 count = 0; //行列掃描 判斷哪個鍵被按下 GPIO_KEY = 0x0F; //高四位全部輸出低電平,低四位輸出高電平-->判斷被按下的按鈕所在的列 if( GPIO_KEY != 0x0F ) { //有按鍵按下 delay( 1110 ); //消除抖動 if( GPIO_KEY != 0x0F ){ switch( GPIO_KEY ){ case 0x07: key_value = 0; //矩陣第1列的按鈕被按下 break; case 0x0B: key_value = 1; //矩陣第2列的按鈕被按下 break; case 0x0D: key_value = 2; //矩陣第3列的按鈕被按下 break; case 0x0E: key_value = 3; //矩陣第4列的按鈕被按下 break; } GPIO_KEY = 0xF0; //高四位輸出高電平,低四位輸出低電平-->判斷被按下的按鈕所在的行 switch( GPIO_KEY ){ case 0x70: key_value = key_value; //矩陣第1行的按鈕被按下 break; case 0xB0: key_value = key_value + 4; //矩陣第2行的按鈕被按下 break; case 0xD0: key_value = key_value + 8; //矩陣第3行的按鈕被按下 break; case 0xE0: key_value = key_value + 12; //矩陣第4行的按鈕被按下 break; } GPIO_DIG = character[key_value]; //如果一直按下按鍵,等待500ms,強制退出 while( ( count < 50 ) && ( GPIO_KEY != 0xF0 ) ) { count++; } } } } void main (){ while( 1 ) { key_down(); } }

51單片機:獨立按鍵與矩陣按鍵控制數碼管