1獨立按鍵
獨立按鍵模塊位置示意圖
硬件連接原理:
圖1.2獨立按鍵原理圖
把對應的端口賦值高電平,即“1”,按鍵按下,端口被拉低至低電平,即“0”,通過檢測該端口的電平即可判斷按鍵是否按下。
去抖分析:
按鍵是機械器件,按下或者松開時有固定的機械抖動,抖動圖如下:
圖1.3按鍵抖動示意圖
上圖看出按鍵按下和松開的瞬間出現機械抖動,這個抖動時間雖然很短,一般10~15ms,不同按鍵抖動不同,但對應單片機來說,很輕松就能檢測到,單片機是uS 級別。
但這個結果并不是我們需要的,實際上只進行一次按鍵操作,但有可能執行了多次按鍵結果,這就是抖動造成的,所以大多數產品實際使用中都使用了按鍵去抖功能。
按鍵去抖分為硬件去抖和軟件去抖,硬件去抖最簡單的就是按鍵2端并聯電容,容量根據實驗而定。軟件去抖使用方便不增加硬件成本,容易調試,所以現在大都使用軟件去抖。
軟件去抖原理:
1、檢測到按鍵按下后進行10~15ms 延時,用于跳過這個抖動區域;
2、延時后再檢測按鍵狀態,如果沒有按下表明是抖動或者干擾造成,如果仍舊按下,可以
認為是真正的按下。并進行對應的操作。
3、同樣按鍵釋放后也要進行去抖延時,延時后檢測按鍵是否真正松開。
程序樣例中沒有使用按鍵釋放去抖程序,用戶可以自行添加。
多數時候按鍵需要在釋放時才起作用,像電腦鼠標一樣,這個時候需要檢測按鍵是否釋放,如果沒有釋放則一直等待。
獨立按鍵控制LED
程序如下圖:
/*-----------------------------------------------
名稱:獨立按鍵控制led
內容:按一次按鍵,led點亮,再按一次熄滅,以此循環
------------------------------------------------*/
#include< reg52.h > //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
sbit KEY=P1^1; //定義按鍵輸入端口
sbit LED=P1^2; //定義led輸出端口
void DelayUs2x(unsigned char t);//函數聲明
void DelayMs(unsigned char t);
/*------------------------------------------------
主函數
------------------------------------------------*/
void main (void)
{
KEY=1; //按鍵輸入端口電平置高
while (1) //主循環
{
if(!KEY) //如果檢測到低電平,說明按鍵按下
{
DelayMs(10); //延時去抖,一般10-20ms
if(!KEY) //再次確認按鍵是否按下,沒有按下則退出
{
while(!KEY);//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
{
LED=!LED;//釋放則執行需要的程序
}
}
}
//主循環中添加其他需要一直工作的程序
}
}
/*------------------------------------------------
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{ //大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
圖1.4獨立按鍵程序
接線方式:
實驗現象:按一次按鍵,led點亮,再按一次熄滅,以此循環。
2矩陣鍵盤
圖2.1矩陣鍵盤模塊示意圖
矩陣鍵盤反轉掃描:
圖2.2矩陣鍵盤硬件原理圖
通過八個IO口控制16個按鍵,節省IO口。
重點是弄清基本原理,結合鍵盤掃描程序代碼分析、理解。
1.矩陣鍵盤逐行掃描(逐行掃描思路簡單,但程序較長)
2.矩陣鍵盤反轉掃描(反轉掃描程序簡短,思路巧妙)
本節著重講矩陣鍵盤的反轉掃描,逐行掃描將在外部中斷部分
程序如下:
/*-----------------------------------------------
名稱:矩陣鍵盤反轉掃描
------------------------------------------------*/
#include< reg52.h > //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#define KeyPort P3
sbit dula=P2^1;
sbit wela=P2^0;
unsigned char code DuanMa[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void DelayUs2x(unsigned char t);//us級延時函數聲明
void DelayMs(unsigned char t); //ms級延時
unsigned char KeyScan(void);//鍵盤掃描
unsigned char KeyPro(void);
void display(unsigned char aa);
/*------------------------------------------------
主函數
------------------------------------------------*/
void main (void)
{
unsigned char num;
dula=1;
P1=0x00;
dula=0;
wela=1;
P1=0x00;
wela=0;
while (1) //主循環
{
num=KeyPro();
if(num!=0xff)
{
display(num);
}
}
}
void display(unsigned char aa)
{
dula=1;
P1=DuanMa[aa];
dula=0;
}
/*------------------------------------------------
按鍵掃描函數,返回掃描鍵值
------------------------------------------------*/
unsigned char KeyScan(void) //鍵盤掃描函數,使用行列反轉掃描法
{
unsigned char cord_h,cord_l;//行列值中間變量
KeyPort=0x0f; //列線輸出全為0
cord_h=KeyPort&0x0f; //讀入行線值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
DelayMs(10); //去抖
if((KeyPort&0x0f)!=0x0f)
{
cord_h=KeyPort&0x0f; //讀入行線值
KeyPort=cord_h|0xf0; //輸出當前列線值
cord_l=KeyPort&0xf0; //讀入列線值
while((KeyPort&0xf0)!=0xf0);//等待松開并輸出
return(cord_h+cord_l);//鍵盤最后組合碼值
}
}return(0xff); //返回該值
}
/*------------------------------------------------
按鍵值處理函數,返回掃鍵值
------------------------------------------------*/
unsigned char KeyPro(void)
{
switch(KeyScan())
{
case 0x7e:return 0;break;//0 按下相應的鍵顯示相對應的碼值
case 0x7d:return 1;break;//1
case 0x7b:return 2;break;//2
case 0x77:return 3;break;//3
case 0xbe:return 4;break;//4
case 0xbd:return 5;break;//5
case 0xbb:return 6;break;//6
case 0xb7:return 7;break;//7
case 0xde:return 8;break;//8
case 0xdd:return 9;break;//9
case 0xdb:return 10;break;//a
case 0xd7:return 11;break;//b
case 0xee:return 12;break;//c
case 0xed:return 13;break;//d
case 0xeb:return 14;break;//e
case 0xe7:return 15;break;//f
default:return 0xff;break;
}
}
/*------------------------------------------------
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
矩陣鍵盤反轉掃描程序
接線方式:
-
原理圖
+關注
關注
1298文章
6343瀏覽量
234057 -
單片機
+關注
關注
6037文章
44558瀏覽量
635306 -
矩陣鍵盤
+關注
關注
7文章
206瀏覽量
31471 -
獨立按鍵
+關注
關注
1文章
45瀏覽量
11563
發布評論請先 登錄
相關推薦
評論