键盘分编码键盘和非编码键盘。键盘上闭合建的识别有专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘,而靠软件编程来识别的称为非编码键盘,在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的,非编码键盘分为:独立键盘和矩阵式键盘。
我所用的独立键盘的硬件连接如下图所示
当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--);
}