接下来讲解开发板上的独立按键部分。如果你想从头看起,那么请看
蓝桥杯单片机(一)流水灯
我们依旧先从原理图看起:
这是开发板按键的原理图部分,这是一个4×4的矩阵键盘,我们今天讲解的是S4,S5,S6,S7组成的独立键盘。仔细观察会发现S4-S7一端接到P30-P33,另外一端接到了J5这个排针2,排针3接地,排针1接到了P37,如果要使用独立按键,就要将排针的2和3连接起来,也就是让S4-S7一端接引脚,另外一端接地,这样当我们按下按键,P30-P33就会检测到低电平。
所以首先需要将开发板上的跳线帽让排针上的2和3连接起来。
然后我们先来看独立按键的代码部分
void Dkey_scan(void)
{
static unsigned char keybyte=0;
static unsigned char key;
if(((P3&0X0F)!=0X0F)&&(keybyte==0))
{
delayms(5);
if((P3&0X0F)!=0X0F)
{
keybyte=1;key=P3&0x0f;
}
}
if((keybyte==1)&&((P3&0X0F)==0X0F))
{
if((P3&0X0F)==0X0F)
{
switch(key)
{
case 0x0e:keybyte=0;break;
case 0x0d:keybyte=0;break;
case 0x0b:keybyte=0;break;
case 0x07:keybyte=0;break;
}
}
}
}
keybyte是static静态变量,只会被初始化一次。
这是一个按键扫描部分的代码,并且是松手检测,也就是按键松手才有效。
首先使用P3&0X0F来获得P3引脚前四位(P30,P31,P32,P33)的状态,如果有按键被按下P3&0X0F就不会等于0X0F,keybyte是状态标志位,如果等于0说明之前没有被按下,如果有按键被按下就会进入第一个if里面,然后延时5毫秒,这个作用是为了消除按键抖动(抖动时高低电平时不确定的),然后再进行判断,确定是不是真的被按下,然后将P3&0X0F的值赋给key,并且将keybyte状态变为1,认为被按下了。
如果松手了就会进入第二个判断语句里面,P3&0X0F= =0X0F意为没有按键被按下,也就是松手,然后通过switch语句进行对key筛选,如果key= =0xe,说明上一次是第一个按键被按下,然后就可以写入按键任务case里面,然后将keybyte重新置为0。这样按键扫描程序就写好了。
按下检测:
void Dkey_scan(void)
{
static unsigned char key;
if((P3&0X0F)!=0X0F)
{
delay5ms();
if((P3&0X0F)!=0X0F)
{
key=P3&0x0f;
switch(key)
{
case 0x0e:P2=0X80;P0=0XFE;
break;
case 0x0d:P2=0X80;P0=0XFD;
break;
case 0x0b:P2=0X80;P0=0XFB;
break;
case 0x07:P2=0X80;P0=0XF7;
break;
}
}
while((key&0X0F)!=0X0F)
{
key=P3&0x0f;
}
}
}
接下来写一个按键实验,使用按键控制LED的灯的亮灭。
作用是按下一个按键对应灯就会亮起
代码如下
#include <stc15f2k60s2.h>
void Dkey_scan(void);
void delay5ms(void);
void main(void)
{
P2=0XA0;P0=0X00;
while(1)
{
Dkey_scan();
}
}
void Dkey_scan(void)
{
static unsigned char keybyte=0;
static unsigned char key;
if(((P3&0X0F)!=0X0F)&&(keybyte==0))
{
delay5ms();
if((P3&0X0F)!=0X0F)
{
keybyte=1;key=P3&0x0f;
}
}
if((keybyte==1)&&((P3&0X0F)==0X0F))
{
if((P3&0X0F)==0X0F)
{
switch(key)
{
case 0x0e:P2=0X80;P0=0XFE;
keybyte=0;break;
case 0x0d:P2=0X80;P0=0XFD;
keybyte=0;break;
case 0x0b:P2=0X80;P0=0XFB;
keybyte=0;break;
case 0x07:P2=0X80;P0=0XF7;
keybyte=0;break;
}
}
}
}
void delay5ms(void) //@11.0592MHz
{
unsigned char i, j;
i = 54;
j = 199;
do
{
while (--j);
} while (--i);
}
我在按键扫描里面加入了对P0口的LED灯的控制,然后将按键扫描程序放入主函数就实现按键控制LED的程序
效果如下:
有不懂的可以评论或私信