1、鍵盤分類
- 在單片機內部P1,P2,P3口各I/O口線片內均有固定的上拉電阻,當這3個準雙向I/O口作為輸入口使用時,向該口先寫“1”
才能讀取這個I/O的狀態,P3.4 =1 ,如果這個I/O口沒有3態就是沒有3態關系這個I/O就跟連接的元器件是一個線與的關系,所以按鍵按下去就是低電平。如果有3態的I/O口就是跟連接的器件是一個線或的關系,高阻態并非是高電平還是低電平,而是高阻狀態,如果外接高它就是高,接低它就是低電平。 - 實例:先寫個程序檢測下吧
note:說明下這個程序就是每按下按鍵讓一個數碼管變一下,從0--9 然后再按變成0循環
#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};//編碼表 數組 code 是在ROM區
void main(){
以上程序存在問題:按下按鍵時候數碼管顯示的不是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};//編碼表 數組 code 是在ROM區
void main(){
- 按鍵在閉合和斷開時,觸點會存在抖動現象
我們解決的是按下去的毛刺去掉:延時函數 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};//編碼表 數組 code 是在ROM區
//此為延時 測試值為1毫秒級
void delay(uint z)
{
}
void main(){
經過以上的更改是改善了問題但是還是會存在抖動現象,原因是我們只是在按下去消除抖動,沒有在松手消除抖動,但是實際的項目中一般我們都是按下去的時候做消除抖動,如果想要達到更好的效果可以在松手也做消除抖動。程序簡單修改如下:
#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};//編碼表 數組 code 是在ROM區
//此為延時 測試值為1毫秒級
void delay(uint z)
{
}
void main(){
以上程序是獨立鍵盤的應用中確實存在的一些問題和本人的一些簡單的解決問題的思路。當然延時也可以改成5毫秒盡量的不要讓MCU過多的等待。一般的項目中都不會采用延時來去抖動,可以用定時器來去除抖動。特別在一些嵌入式系統中常用定時器去抖動,因為嵌入式設備的硬件資源太寶貴了哦。希望大牛們給個定時器的去除抖動程序。。。!