1、鍵盤分類
- 而靠軟件編程來識別的稱為非編碼鍵盤;
- 在單片機(jī)組成的各種系統(tǒng)中,用的最多的是非編碼鍵盤。也有用到編碼鍵盤的。
- 非編碼鍵盤又分為:獨(dú)立鍵盤和行列式(又稱為矩陣式)鍵盤。
此圖為矩陣鍵盤
- 在單片機(jī)內(nèi)部P1,P2,P3口各I/O口線片內(nèi)均有固定的上拉電阻,當(dāng)這3個準(zhǔn)雙向I/O口作為輸入口使用時,向該口先寫“1”
才能讀取這個I/O的狀態(tài),P3.4 =1 ,如果這個I/O口沒有3態(tài)就是沒有3態(tài)關(guān)系這個I/O就跟連接的元器件是一個線與的關(guān)系,所以按鍵按下去就是低電平。如果有3態(tài)的I/O口就是跟連接的器件是一個線或的關(guān)系,高阻態(tài)并非是高電平還是低電平,而是高阻狀態(tài),如果外接高它就是高,接低它就是低電平。 - 實(shí)例:先寫個程序檢測下吧
note:說明下這個程序就是每按下按鍵讓一個數(shù)碼管變一下,從0--9 然后再按變成0循環(huán)
#include
#define uchar unsigned char
sbit
sbit key1= P3^4 ;//接的一個按鍵
sbit dula = P2^6;// 段啦
sbit wela = P^7;// 位啦
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};//編碼表 數(shù)組 code 是在ROM區(qū)
void main(){
以上程序存在問題:按下按鍵時候數(shù)碼管顯示的不是1 2.....9 0 1...
#include
#define uchar unsigned char
sbit
sbit key1= P3^4 ;//接的一個按鍵
sbit dula = P2^6;// 段啦
sbit wela = P^7;// 位啦
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};//編碼表 數(shù)組 code 是在ROM區(qū)
void main(){
- 按鍵在閉合和斷開時,觸點(diǎn)會存在抖動現(xiàn)象
我們解決的是按下去的毛刺去掉:延時函數(shù) 10毫秒
#include
#define uchar unsigned char
sbit
sbit key1= P3^4 ;//接的一個按鍵
sbit dula = P2^6;// 段啦
sbit wela = P^7;// 位啦
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};//編碼表 數(shù)組 code 是在ROM區(qū)
//此為延時 測試值為1毫秒級
void delay(uint z)
{
}
void main(){
經(jīng)過以上的更改是改善了問題但是還是會存在抖動現(xiàn)象,原因是我們只是在按下去消除抖動,沒有在松手消除抖動,但是實(shí)際的項(xiàng)目中一般我們都是按下去的時候做消除抖動,如果想要達(dá)到更好的效果可以在松手也做消除抖動。程序簡單修改如下:
#include
#define uchar unsigned char
sbit
sbit key1= P3^4 ;//接的一個按鍵
sbit dula = P2^6;// 段啦
sbit wela = P^7;// 位啦
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};//編碼表 數(shù)組 code 是在ROM區(qū)
//此為延時 測試值為1毫秒級
void delay(uint z)
{
}
void main(){
以上程序是獨(dú)立鍵盤的應(yīng)用中確實(shí)存在的一些問題和本人的一些簡單的解決問題的思路。當(dāng)然延時也可以改成5毫秒盡量的不要讓MCU過多的等待。一般的項(xiàng)目中都不會采用延時來去抖動,可以用定時器來去除抖動。特別在一些嵌入式系統(tǒng)中常用定時器去抖動,因?yàn)榍度胧皆O(shè)備的硬件資源太寶貴了哦。希望大牛們給個定時器的去除抖動程序。。。!