独立按键BTN
首先需要将跳帽接到BTN(BUTTON),我们理解到 S7、S6、S5、S4 分别对应单片机的 P30~P33 端口,那么我们就可以用独立按键来简单的控制Led灯。
截取部分代码:
while(1)
{
if(S7 == 0)
{
Delay10ms(); //延时消抖,下同
if(S7 == 0)
{
P0 = 0xff; //关闭全部的LED灯
while(!S7); //确定按键松开
}
}
if(S6 == 0)
{
Delay10ms();
if(S6 == 0)
{
P0 = 0x00; //打开全部的LED灯
while(!S6);
}
}
if(S5 == 0)
{
Delay10ms();
if(S5 == 0)
{
while(1)
{
num++;
Delay1000ms(); //长按,1秒增加一个计数num
LED_display(num); //LED_display定义了显示num个LED灯
if(S5 == 1) //松开即断开循环
break;
}
while(!S5);
}
}
if(S4 == 0)
{
Delay10ms();
if(S4 == 0)
{
num++;
LED_display(num); //增加一个灯
while(!S4);
}
}
number_display(num);
}
独立按键中我们只需要注意P30~P33是否有延时消抖以及是否能够确保松开。
矩阵键盘KBD
首先需要将跳帽接到KBD(KEYBOARD),接着在编程中通过P30~P37进行“行扫描”和“列扫描”确定我们按下键的位置.
需要注意的是理解上的P36和P37并不存在,我们用P42以及P44分别代替了P36和P37。
截取部分代码:
void key_scan()
{
temp = 0x0f; P42 = 0; P44 = 0; //列扫描
if(temp != 0x0f)
{
Delay10ms(); //10ms延时
if(temp != 0x0f)
{
switch(temp)
{
case 0x0e: // 0000 1110
scan_num = 1;
break;
case 0x0d: // 0000 1101
scan_num = 5;
break;
case 0x0eb: // 0000 1011
scan_num = 9;
break;
case 0x07: // 0000 0111
scan_num = 13;
break;
}
temp = 0xf0; P42 = 1; P44 = 1; //行扫描
if(P44 == 0)
scan_num += 0; //P44 代替 P37
while(P44 == 0);
if(P42 == 0) //P42 代替 P36
scan_num += 1;
while(P42 == 0);
if(temp == 0xd0) //1101 0000
scan_num += 2;
while(temp == 0xd0);
if(temp == 0xe0) //1110 0000
scan_num += 3;
while(temp == 0xe0);
}
}
}
实质就是先确定Y轴,再确定X轴,我们用scan_num分别代表16个按键:
switch(scan_num)
{
case 1: //按键S7
//按键操作
break;
case 2: //按键S11
//按键操作
break;
case 3: //按键S15
//按键操作
break;
case 4: //按键S19
//按键操作
break;
.
.
.
}
我们用表格可以直观的展示:
| 0000 1110 | 0000 1101 | 0000 1011 | 0000 01111 | |
|---|---|---|---|---|
| P44 = 0 | S7(1) | S11(2) | S15(3) | S19(4) |
| P42 = 0 | S6(5) | S10(6) | S14(7) | S18(8) |
| 1101 0000 | S5(9) | S9(10) | S13(11) | S17(12) |
| 1110 0000 | S4(13) | S8(14) | S2(15) | S16(16) |