基于CH455芯片实现4x5矩阵键盘灯光的示例代码,使用P2口和P3口的6个引脚作为4x5矩阵键盘的输入端口,使用P0口的8个引脚作为灯光的输出端口。扫描键盘状态时,先将一列输出低电平,再检测该列的所有按键状态,最后将该列输出高电平,继续扫描下一列。灯光的状态是通过异或操作实现的,即每次按下一个键时,将对应的灯光状态取反,从而实现灯光的亮灭切换。
时间: 2024-02-03 17:14:48 浏览: 147
以下是基于CH455芯片实现4x5矩阵键盘灯光的示例代码:
```c
#include <STC15F2K60S2.H>
#define uint unsigned int
#define uchar unsigned char
sbit K1 = P2^0;
sbit K2 = P2^1;
sbit K3 = P2^2;
sbit K4 = P2^3;
sbit K5 = P2^4;
sbit K6 = P2^5;
sbit K7 = P3^4;
sbit K8 = P3^5;
sbit K9 = P3^6;
sbit K10 = P3^7;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sbit LED4 = P0^3;
sbit LED5 = P0^4;
sbit LED6 = P0^5;
sbit LED7 = P0^6;
sbit LED8 = P0^7;
uchar code Key_Map[4][5] = {
{'1', '2', '3', 'A', 'F'},
{'4', '5', '6', 'B', 'E'},
{'7', '8', '9', 'C', 'D'},
{'*', '0', '#', 'D', 'D'}
};
void Delay10ms() //延时10ms
{
uchar i, j;
i = 50;
j = 182;
do
{
while (--j);
} while (--i);
}
void KeyScan()
{
uchar i, j;
static uchar key_sts[4][5] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
for (i = 0; i < 5; i++) //扫描列
{
switch (i)
{
case 0:
P2 = 0x1F;
break;
case 1:
P2 = 0x2F;
break;
case 2:
P2 = 0x3F;
break;
case 3:
P2 = 0x4F;
break;
case 4:
P2 = 0x5F;
break;
}
for (j = 0; j < 4; j++) //检测行
{
if (key_sts[j][i] == 0 && ((i == 0 && K1) || (i == 1 && K2) || (i == 2 && K3) || (i == 3 && K4) || (i == 4 && K5) || (j == 0 && K6) || (j == 1 && K7) || (j == 2 && K8) || (j == 3 && K9) || (j == 3 && i == 1 && K10)))
{
key_sts[j][i] = 1; //按键抬起
switch (Key_Map[j][i])
{
case '1':
LED1 ^= 1;
break;
case '2':
LED2 ^= 1;
break;
case '3':
LED3 ^= 1;
break;
case '4':
LED4 ^= 1;
break;
case '5':
LED5 ^= 1;
break;
case '6':
LED6 ^= 1;
break;
case '7':
LED7 ^= 1;
break;
case '8':
LED8 ^= 1;
break;
}
}
if (key_sts[j][i] == 1 && ((i == 0 && !K1) || (i == 1 && !K2) || (i == 2 && !K3) || (i == 3 && !K4) || (i == 4 && !K5) || (j == 0 && !K6) || (j == 1 && !K7) || (j == 2 && !K8) || (j == 3 && !K9) || (j == 3 && i == 1 && !K10)))
{
key_sts[j][i] = 0; //按键按下
}
}
}
}
void main()
{
while (1)
{
KeyScan();
Delay10ms();
}
}
```
该示例代码中使用了一个二维数组`Key_Map`来存储键盘的映射关系,即第一维代表行号,第二维代表列号,数组元素为对应的字符。在扫描键盘状态时,先将一列输出低电平,再检测该列的所有按键状态,最后将该列输出高电平,继续扫描下一列。灯光的状态是通过异或操作实现的,即每次按下一个键时,将对应的灯光状态取反,从而实现灯光的亮灭切换。
阅读全文