单片机学习笔记(五)—— 键盘
生活随笔
收集整理的這篇文章主要介紹了
单片机学习笔记(五)—— 键盘
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、鍵盤的分類
? ??? ??· 編碼式鍵盤
? ??? ??· 非編碼式鍵盤
? ??? ??編碼式鍵盤:鍵盤上閉合鍵的識別由專用的硬件編碼器實現,并產生鍵編碼號或鍵值。(如:計算機鍵盤)
? ??非編碼式鍵盤:由軟件編程來識別。(單片機中使用最多)
2、非編碼式鍵盤
? ??· 獨立鍵盤
? ??· 矩陣鍵盤
隨手代碼: ? ?#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit d1=P1^0; sbit dula=P2^6; //數碼管段選信號 sbit wela=P2^7; //數碼管位選信號 sbit key1=P3^4; //獨立按鍵key1 uchar code table[]={ //數碼管顯示編碼 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar num; void delay(uint z) //延時 (防抖) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { wela=1; P0=0xfe; //打開低一數碼管 wela=0; P3=0xff; while(1) { if(key1==0) //監聽按鍵是否被按下 { delay(5);//延時5ms (具體解釋見本文尾) if(key1==0)//再次確認按鍵是否被按下 { d1=0; num++; if(num==10) num=0; } while(!key1);//松手監測 delay(5); while(!key1);//再次確認是否松手 } else d1=1; dula=1; P0=table[num];//數碼管顯示 dula=0; } }
(2)矩陣鍵盤
? ?? ? ? 通常,矩陣式鍵盤 8 個引腳接在單片機的 P3.0 ~P3.7上
? ? (2)定義一個變量 temp = P3, 通過 temp &= ?0xf0,取其高四位,判斷是否有鍵被按下
? ? (3)重讀 P3 口,判斷是哪一個鍵被按下
隨手代碼:#include<reg52.h>
#define uint unsigned int #define uchar unsigned char sbit dula = P2 ^ 6; sbit wela = P2 ^ 7;
uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0};
uchar num,temp,num1; void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 110; y > 0; y--); } uchar keyscan(); void display(uchar aa);
void main() { num = 17; dula = 1; P0 = 0; dula = 0; wela = 1; P0 = 0xc0; wela = 0; while(1) { display(keyscan()); } }
void display(uchar aa)//數碼管顯示 { dula = 1; P0 = table[ aa - 1 ]; dula = 0; }
uchar keyscan() { P3 = 0xfe; temp = P3; temp = temp & 0xf0; while(temp != 0xf0)//防抖 { delay(5); temp = P3; temp = temp & 0xf0; while(temp != 0xf0) { temp = P3; switch(temp) { case 0xee: num = 1; break; case 0xde: num = 2; break; case 0xbe: num = 3; break; case 0x7e: num = 4; break; } while(temp != 0xf0)//松手監測 { temp=P3; temp=temp&0xf0; } } } P3 = 0xfd; temp = P3; temp = temp & 0xf0; while(temp != 0xf0) { delay(5); temp = P3; temp = temp & 0xf0; while(temp != 0xf0) { temp = P3; switch(temp) { case 0xed: num = 5; break; case 0xdd: num = 6; ????break; case 0xbd: num = 7; break; case 0x7d: num = 8; break; } while(temp != 0xf0) { temp = P3; temp = temp & 0xf0; } } } P3 = 0xfb; temp = P3; temp = temp & 0xf0; while(temp != 0xf0) { delay(5); temp = P3; temp = temp & 0xf0; while(temp != 0xf0) { temp = P3; switch(temp) { ???? case 0xeb: num = 9; break; case 0xdb: num = 10; break; case 0xbb: num = 11; break; case 0x7b: num = 12; break; } while(temp != 0xf0) { temp = P3; ????temp = temp & 0xf0; } } } P3 = 0xf7; temp = P3; temp = temp & 0xf0; while(temp != 0xf0) { delay(5); temp = P3; temp = temp & 0xf0; while(temp != 0xf0) { temp = P3; switch(temp) { case 0xe7: num = 13; break; case 0xd7: num = 14; break; case 0xb7: num = 15; break; case 0x77: num = 16; break; } ????while(temp != 0xf0) { temp = P3; temp = temp & 0xf0; } } } ????return num; }
3、抖動現象
? ??? ??按鍵在閉合和斷開時,觸點會存在抖動現象
? ??? ??· 非編碼式鍵盤
? ??? ??編碼式鍵盤:鍵盤上閉合鍵的識別由專用的硬件編碼器實現,并產生鍵編碼號或鍵值。(如:計算機鍵盤)
? ??非編碼式鍵盤:由軟件編程來識別。(單片機中使用最多)
2、非編碼式鍵盤
? ??· 獨立鍵盤
? ??· 矩陣鍵盤
? ??(1)獨立鍵盤
原理:當按鍵被按下時,P3.4?/?P3.7?將會與 GND 連通,即為低電平(0);
隨手代碼: ? ?
原理:(以下為第一行鍵盤,以此類推) ? ? (1)將 P3 口賦值為 0xfe (1111,1110)
? ? (2)定義一個變量 temp = P3, 通過 temp &= ?0xf0,取其高四位,判斷是否有鍵被按下
? ? (3)重讀 P3 口,判斷是哪一個鍵被按下
隨手代碼:
?圖 ?1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖 ?2 ? ?? ? ? 如圖1,我們可以在 delay(5)后,重新讀取,可消除抖動; 圖2是硬件防抖
總結
以上是生活随笔為你收集整理的单片机学习笔记(五)—— 键盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 防火墙、DCD与TCP Keep ali
- 下一篇: 云脉档案管理系统助力档案信息化建设