在keil5 里用线翻转法扫描矩阵按键来表示1到16
时间: 2024-03-17 20:45:17 浏览: 211
线翻转法是一种常用的按键扫描方式,可以通过矩阵按键来快速检测用户的按键操作。以下是一个使用线翻转法扫描矩阵按键来表示1到16的示例代码。
假设我们使用4行4列的矩阵按键,其中每个按键对应一个数字,按下某个按键后,程序将该数字显示在数码管上。
首先,我们需要定义一个4x4的按键矩阵,这里使用P2口作为输入端口。
```c
#define uchar unsigned char
#define uint unsigned int
uchar code keymap[] = {0x11, 0x12, 0x13, 0x14, 0x21, 0x22, 0x23, 0x24, 0x31, 0x32, 0x33, 0x34, 0x41, 0x42, 0x43, 0x44}; //按键矩阵
uchar row, col, keyval; //当前扫描的行、列,以及按下的按键值
sbit LSA = P0^2;
sbit LSB = P0^3;
sbit LSC = P0^4;
void delay(uint xms) //延时函数
{
uint i, j;
for (i = xms; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
uchar keyscan()
{
uchar val = 0xFF; //初始化按键值
for (row = 0; row < 4; row++) {
P2 = 0xFF; //设置列为高电平
P2 &= ~(1 << row); //将当前行设置为低电平
delay(5); //延时等待输入稳定
col = P2 & 0x0F; //读取列的值
if (col != 0x0F) { //如果有按键按下
switch (col) { //检查按下的列
case 0x0E: val = keymap[row * 4 + 0]; break;
case 0x0D: val = keymap[row * 4 + 1]; break;
case 0x0B: val = keymap[row * 4 + 2]; break;
case 0x07: val = keymap[row * 4 + 3]; break;
}
while ((P2 & 0x0F) != 0x0F); //等待按键释放
}
}
return val; //返回按键值
}
void display(uchar value) //在数码管上显示数字
{
uchar code table[] = { //数码管段码表
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
};
P1 = table[value - 1]; //显示数字
}
void main()
{
while (1) {
keyval = keyscan(); //扫描按键
if (keyval != 0xFF) { //如果有按键按下
display(keyval); //在数码管上显示数字
}
}
}
```
在上面的代码中,我们使用了一个keyscan函数来扫描矩阵按键,返回按下的按键值。具体实现是先将所有列设置为高电平,然后依次将每一行设置为低电平,读取列的值,如果有按键按下,则返回对应的按键值。
在主函数中,我们不断调用keyscan函数来扫描按键,如果有按键按下,则将其值显示在数码管上。具体实现是使用一个display函数来将数字转换为对应的数码管段码,然后在P1口显示该码。
阅读全文