鍵盤分編碼鍵盤和非編碼鍵盤。鍵盤上閉合建的識別有專用的硬件編碼器實現,併產生鍵編碼號或鍵值的稱爲編碼鍵盤,如計算機鍵盤,而靠軟件編程來識別的稱爲非編碼鍵盤,在單片機組成的各種系統中,用的最多的是非編碼鍵盤。也有用到編碼鍵盤的,非編碼鍵盤分爲:獨立鍵盤和矩陣式鍵盤。
我所用的獨立鍵盤的硬件連接如下圖所示
當S1被按下時,S1兩端就會導通,由於P35與GND相連,所以就會變成低電平,則會檢測到按鍵被按下。
計數器的顯示我用的是板子上的四個共陽極數碼管,原理圖如下,當位選端P20給一個低電平時,Q3這個PNP三極管即導通,那麼數碼管K1則亮。P0則是控制數碼管的段選,RL1即爲限流電阻。
接下來就是說當我按下鍵S1時,數字加1,按下S2時,數碼管減一,數碼管顯示的範圍是從0~9999,具體操作如下。
#include<reg52.h>
#define uint unsigned int //宏定義
#define uchar unsigned char
sbit S1 = P3^5; //位定義
sbit S2 = P3^4;
sbit S3 = P3^3;
sbit S4 = P3^2;
void delay(uchar i); //聲明延時函數
uint key_counter = 0; //定義一個整型變量來顯示
unsigned char leddata[]={ //定義一個數組來存放數碼管顯示
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
0x88, //"A"
0x83, //"B"
0xC6, //"C"
0xA1, //"D"
0x86, //"E"
0x8E, //"F"
0x89, //"H"
0xC7, //"L"
0xC8, //"n"
0xC1, //"u"
0x8C, //"P"
0xA3, //"o"
0xBF, //"-"
0xFF, //熄滅
0xFF //自定義
};
int main()
{
while(1)
{
if(S1 == 0)
{
delay(5); //消抖
if(S1 == 0 && key_counter < 9999)
{
key_counter++;
while(!S1); //鬆手檢測
}
}
if(S2 == 0)
{
delay(5);
if(S2 == 0 && key_counter > 0)
{
key_counter--;
while(!S2);
}
}
if( 0 <= key_counter && key_counter <=9)
{
P2 = 0Xf7; //P23給低電平只有最後一位數碼管顯示,只顯示0~9
P0 = leddata[key_counter];
delay(5);
P2 = 0xff;
}
if( 9 < key_counter && key_counter <= 99)
{
P2 = 0Xf7; //顯示個位
P0 = leddata[key_counter%10];
delay(5);
P2 = 0Xfb; //顯示十位
P0 = leddata[key_counter/10];
delay(5);
P2 = 0xff;
}
if( 99 < key_counter && key_counter <= 999)
{
P2 = 0Xf7; //顯示個位
P0 = leddata[key_counter%10];
delay(5);
P2 = 0Xfb; //顯示十位
P0 = leddata[key_counter/10%10];
delay(5);
P2 = 0Xfd; //顯示百位
P0 = leddata[key_counter/100];
delay(5);
P2 = 0xff;
}
if( 999 < key_counter && key_counter <= 9999)
{
P2 = 0Xf7; //顯示個位
P0 = leddata[key_counter%10];
delay(5);
P2 = 0Xfb; //顯示十位
P0 = leddata[key_counter/10%10];
delay(5);
P2 = 0Xfd; //顯示百位
P0 = leddata[key_counter/100%10];
delay(5);
P2 = 0xfe; //顯示千位
P0 = leddata[key_counter/1000];
delay(5);
P2 = 0xff;
}
}
}
/*
*********************************************************************
**函數名稱:delay
**函數作用:延時函數
*********************************************************************
*/
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}