89c51按鍵計數器

鍵盤分編碼鍵盤和非編碼鍵盤。鍵盤上閉合建的識別有專用的硬件編碼器實現,併產生鍵編碼號或鍵值的稱爲編碼鍵盤,如計算機鍵盤,而靠軟件編程來識別的稱爲非編碼鍵盤,在單片機組成的各種系統中,用的最多的是非編碼鍵盤。也有用到編碼鍵盤的,非編碼鍵盤分爲:獨立鍵盤和矩陣式鍵盤。

我所用的獨立鍵盤的硬件連接如下圖所示

當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--);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章