键盘分编码键盘和非编码键盘。键盘上闭合建的识别有专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘,而靠软件编程来识别的称为非编码键盘,在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的,非编码键盘分为:独立键盘和矩阵式键盘。

我所用的独立键盘的硬件连接如下图所示

89c51按键计数器

当S1被按下时,S1两端就会导通,由于P35与GND相连,所以就会变成低电平,则会检测到按键被按下。

计数器的显示我用的是板子上的四个共阳极数码管,原理图如下,当位选端P20给一个低电平时,Q3这个PNP三极管即导通,那么数码管K1则亮。P0则是控制数码管的段选,RL1即为限流电阻。

89c51按键计数器

接下来就是说当我按下键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--);
}

相关文章: