不对,这段代码要实现在数码管上显示按下的矩阵键盘的键值,你也可以重新写一个,
时间: 2024-03-18 22:41:12 浏览: 43
好的,我重新写一个代码,实现在数码管上显示按下的矩阵键盘的键值。假设数码管左侧第一位对应的段码为P0.4~P0.7,代码如下:
```
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管共阴
uchar code colcode[4] = { 0xfe, 0xfd, 0xfb, 0xf7 }; //列依次为0
void delayms(uchar ms)
{
uchar i;
while(ms--)
for(i=0; i<123; i++);
}
uchar key_scan(void)//P1口连矩阵键盘
{
uchar temp, row, column, i;
P1 = 0XF0; //行为1,列为0
temp = P1 & 0XF0;
if(temp != 0xf0)
{
delayms(10);
temp = P1 & 0XF0;
if(temp != 0xf0)//发生变化
{
switch(temp)
{
case 0x70: row = 3; break;
case 0xb0: row = 2; break;
case 0xd0: row = 1; break;
case 0xe0: row = 0; break;
default: break;
}
for(i = 0; i < 4; i++)
{
P1 = colcode[i];
temp = P1 & 0XF0;
temp = ~temp;
if(temp != 0x0f) column = i;
}
return row * 4 + column;
}
}
else P1 = 0XFF;
return 16;
}
void main(void)
{
uchar key_val;
while(1)
{
key_val = key_scan();
if(key_val != 16)
{
P0 = (P0 & 0x0f) | (seg[key_val] << 4);//数码管显示键值
}
else
{
P0 = (P0 & 0x0f) | (seg[0] << 4);//数码管显示矩阵按键的键值
}
delayms(50);
}
}
```
这个代码在读取到矩阵按键的键值时,会将对应的数字显示在数码管左侧第一位。如果没有读取到矩阵按键的键值,会将数码管左侧第一位显示为0。