单片机与4个独立按键S1~S4以及8只LED指示灯构成一个独立式键盘系统。4个按键接在P1.0~P1.3引脚,P3口接8只LED指示灯,控制8只LED指示灯的亮和灭,原理图如下。当按下S1按键时,P3口的8只LED指示灯正向流水点亮;当按下S2按键时,P3口的8只LED指示灯反向流水点亮;当按下S3按键时,P3口的4只LED指示灯高低交替点亮;当按下S4按键时,P3口的8只LED指示灯闪烁点亮;
由于本例中的4个按健分别对应4种不同的点亮功能,且具有不同的交理号"keyval" ,具体如下:
●按下S1按键时,keyval=1。
●按下S2按键时,keyval=2。
●按下S3按键时,keyval=3。
●按下S4按键时,keyval=4。
本例的独立式键盘的工作原理如下:
(1)首先判断是否有按键按下
将接有4个按键的P1口低4位(P1.0~P1.3)写人1,使PI口低4位为输人状态。然后读入低4位的电平,只要不全为1,则说明有键按下。读取方法如下:
P1 =0xff;
i((P1&0x0f)! =0x0f);
//读人的P1口低4位各按键的状态,按位与运算后的结果
//不是0xOf,表明低4位必有1位是0,说明有键按下
(2)按键去抖动
当判别有键按下时,调用软件延时子程序,延时约10 ms后再进行判别,若按键确实按下,则执行相应的按键功能,否则重新开始进行扫描。
(3)获得键号
确认有键按下时,可采用扫描方法,来判断哪个键按下,并获取键值。
代码实现
1.定义按键引脚
#include<reg52.h>
sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
unsigned char keyval;
2. 主函数
void main()
{
keyval=0;
while(1)
{
key_scan();
switch(keyval)
{
case 1:forward();
break;
case 2:backward();
break;
case 3:alter();
break;
case 4:blink();
break;
}
}
}
3.键盘扫描函数
void key_scan()
{
P1=0xff;
if((P1&0x0f)!=0x0f)
{
delay10ms();
if(S1==0)
keyval=1;
if(S2==0)
keyval=2;
if(S3==0)
keyval=3;
if(S4==0)
keyval=4;
}
}
4.正向流水点亮LED
void forward()
{
P3=0xfe;
led_delay();
P3=0xfd;
led_delay();
P3=0xfb;
led_delay();
P3=0xf7;
led_delay();
P3=0xef;
led_delay();
P3=0xdf;
led_delay();
P3=0xbf;
led_delay();
P3=0x7f;
led_delay();
}
5.反向流水点亮LED函数
void backward()
{
P3=0x7f;
led_delay();
P3=0xbf;
led_delay();
P3=0xdf;
led_delay();
P3=0xef;
led_delay();
P3=0xf7;
led_delay();
P3=0xfb;
led_delay();
P3=0xfd;
led_delay();
P3=0xfe;
led_delay();
}
6.交替点亮高低LED函数
void alter()
{
P3=0x0f;
led_delay();
P3=0xf0;
led_delay();
}
7.闪烁点亮LED函数
void blink()
{
P3=0xff;
led_delay();
P3=0x00;
led_delay();
}
8.流水灯显示延时函数
void led_delay(void)
{
unsigned char i,j;
for(i=0;i<220;i++)
for(j=0;j<220;j++);
}
9.软件消抖延时函数文章来源:https://www.toymoban.com/news/detail-411865.html
void delay10ms()
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
这样我们一步步实现了独立式键盘设计。下面附上总程序。文章来源地址https://www.toymoban.com/news/detail-411865.html
#include<reg52.h>
sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
unsigned char keyval;
void key_scan()
{
P1=0xff;
if((P1&0x0f)!=0x0f)
{
delay10ms();
if(S1==0)
keyval=1;
if(S2==0)
keyval=2;
if(S3==0)
keyval=3;
if(S4==0)
keyval=4;
}
}
void forward()
{
P3=0xfe;
led_delay();
P3=0xfd;
led_delay();
P3=0xfb;
led_delay();
P3=0xf7;
led_delay();
P3=0xef;
led_delay();
P3=0xdf;
led_delay();
P3=0xbf;
led_delay();
P3=0x7f;
led_delay();
}
void backward()
{
P3=0x7f;
led_delay();
P3=0xbf;
led_delay();
P3=0xdf;
led_delay();
P3=0xef;
led_delay();
P3=0xf7;
led_delay();
P3=0xfb;
led_delay();
P3=0xfd;
led_delay();
P3=0xfe;
led_delay();
}
void alter()
{
P3=0x0f;
led_delay();
P3=0xf0;
led_delay();
}
void blink()
{
P3=0xff;
led_delay();
P3=0x00;
led_delay();
}
void led_delay(void)
{
unsigned char i,j;
for(i=0;i<220;i++)
for(j=0;j<220;j++);
}
void delay10ms()
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
void main()
{
keyval=0;
while(1)
{
key_scan();
switch(keyval)
{
case 1:forward();
break;
case 2:backward();
break;
case 3:alter();
break;
case 4:blink();
break;
}
}
}
到了这里,关于一个案例带你了解独立式键盘设计原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!