switch(keyNew) { case 0x0001: keyVal = 13; break; case 0x0002: keyVal = 12; break; case 0x0004: keyVal = 11; break; case 0x0008: keyVal = 10; break; case 0x0010: keyVal = 9; break; case 0x0020: keyVal = 8; break; case 0x0040: keyVal = 7; break; case 0x0080: keyVal = 6; break; case 0x0100: keyVal = 5; break; case 0x0200: keyVal = 4; break; case 0x0400: keyVal = 3; break; case 0x0800: keyVal = 2; break; default: keyVal = 0; break; } return keyVal;
时间: 2023-10-22 18:05:12 浏览: 42
这段代码是用来根据键盘扫描结果确定按下的键值。它通过 switch-case 语句对键盘扫描结果进行匹配,确定按下的键值。具体地,它通过判断 keyNew 的值来确定按下的是哪个键,然后将对应的键值赋值给 keyVal。如果 keyNew 的值不在 case 语句中匹配到,就会执行 default 语句,将 keyVal 赋值为 0。最后,这个函数会返回 keyVal,表示按下的键值。
相关问题
优化void delay(uint t){ uchar i; do{ i = 200; while(--i); }while(--t);}uchar KeyBoard_matrix(){ uchar val_key=255; P1=0x0F; delay(1); if(P1!=0x0F) { //扫描第一行,如行列方向选择则高低位对调 P1=0xEF; delay(10); if( (P1&0x0F) == 0x0E){ val_key=0; } if( (P1&0x0F) == 0x0D){ val_key=1; } if( (P1&0x0F) == 0x0B){ val_key=2; } if( (P1&0x0F) == 0x07){ val_key=3; } //扫描第二行 P1=0xDF; delay(10); if( (P1&0x0F) == 0x0E){ val_key=4; } if( (P1&0x0F) == 0x0D){ val_key=5; } if( (P1&0x0F) == 0x0B){ val_key=6; } if( (P1&0x0F) == 0x07){ val_key=7; } //扫描第三行 P1=0xBF; delay(10); if( (P1&0x0F) == 0x0E){ val_key=8; } if( (P1&0x0F) == 0x0D){ val_key=9; } if( (P1&0x0F) == 0x0B){ val_key=10; } if( (P1&0x0F) == 0x07){ val_key=11; } //扫描第四行 P1=0x7F; delay(10); if( (P1&0x0F) == 0x0E){ val_key=12; } if( (P1&0x0F) == 0x0D){ val_key=13; } if( (P1&0x0F) == 0x0B){ val_key=14; } if( (P1&0x0F) == 0x07){ val_key=15; } } return val_key;}
&0x0F) != 0x0F ){switch(P1&0x0F){case 0x07:val_key=0;break;case 0x0B:val_key=1;break;case 0x0D:val_key=2;break;case 0x0E:val_key=3;break;default:break;}}P1=0xF7;delay(10);if( (P1&0x0F) != 0x0F ){switch(P1&0x0F){case 0x07:val_key=4;break;case 0x0B:val_key=5;break;case 0x0D:val_key=6;break;case 0x0E:val_key=7;break;default:break;}}P1=0xFB;delay(10);if( (P1&0x0F) != 0x0F ){switch(P1&0x0F){case 0x07:val_key=8;break;case 0x0B:val_key=9;break;case 0x0D:val_key=10;break;case 0x0E:val_key=11;break;default:break;}}P1=0xFD;delay(10);if( (P1&0x0F) != 0x0F ){switch(P1&0x0F){case 0x07:val_key=12;break;case 0x0B:val_key=13;break;case 0x0D:val_key=14;break;case 0x0E:val_key=15;break;default:break;}}P1=0xFF;}return val_key;}
这段代码是用来读取键盘矩阵的。优化的话可以将重复的代码部分提取出来,减少代码量,提高可读性和可维护性。例如,可以将扫描矩阵的代码封装成一个函数,传入参数即可扫描对应的行或列。另外,可以考虑使用数组来存储键盘矩阵的值,这样可以更方便地进行处理和调用。
修正这个C51代码,使数码管左面第一位显示矩阵按键的键值: #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=keyscan(); P0=seg[key_val];//数码管显示键值 delayms(50); } }
在主函数中调用的函数名和定义的函数名不一致,需要将key_scan函数改为keyscan。同时,在主函数中需要将数码管左侧第一位对应的段码赋值给P0的高四位。修改后的代码如下:
```
#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 keyscan(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 = keyscan();
if(key_val == 0) P0 = (P0 & 0x0f) | (seg[0] << 4);//数码管显示矩阵按键的键值
else P0 = (P0 & 0x0f) | (seg[key_val] << 4);//数码管显示键值
delayms(50);
}
}
```