if (key_val != 0xFF) { if (key_val >= '0' && key_val <= '9') { number = number * 10 + (key_val - '0'); length++; // 显示当前输入的数字 DisplayNumber(1, 1, number, length); }矩阵按键为啥没反应一直七个0
时间: 2024-02-14 17:28:51 浏览: 51
在这段代码中,按键矩阵没有反应的原因可能有以下几个方面需要检查:
1. 硬件连接问题:确保你的矩阵按键正确连接到了 STM32F103ZET6 微控制器的引脚上。请检查引脚连接是否正确,包括行引脚和列引脚。
2. 引脚配置问题:确保你已经正确配置了矩阵按键的引脚。在 `MatrixKey_Init` 函数中,需要设置行引脚为输入模式,列引脚为输出模式,并且行引脚需要启用内部上拉电阻。
3. 按键读取问题:检查 `MatrixKey_GetKey` 函数是否正确读取了按键的值。确保行和列的 GPIO 引脚配置正确,并且读取行引脚和列引脚的状态时使用了正确的读取方法。
4. 按键值映射问题:确认你的 `key_Map` 数组中的映射关系是否设置正确。确保每个按键值都与对应的按键位置一一对应。
5. LCD 显示问题:检查 LCD12864 的驱动代码是否正确集成到你的项目中,并且初始化和显示函数是否正确调用。确保 LCD 的初始化过程和显示函数的调用是在正确的时机进行的。
如果你仍然遇到问题,请提供更多相关的代码和硬件连接信息,以便更好地帮助你解决问题。
相关问题
写出下列代码每行的注释: #include<reg51.h> sbit SN_green=P0^3; sbit SN_yellow=P0^4; sbit SN_red=P0^5; sbit EW_green=P0^0; sbit EW_yellow=P0^1; sbit EW_red=P0^2; unsigned char data cnt_sn,cnt_ew; unsigned int data T1_cnt; unsigned char data state_val_sn,state_val_ew; char code led_seg_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; char code init_sn[3]={24,4,29}; char code init_ew[3]={29,24,4}; void delay(unsigned int t) { while(--t); } void led_show(unsigned int u,unsigned int v) { unsigned char i; i=u%10; P1=led_seg_code[i]; P3=0xef; delay(50); P3=0xff; i=u%100/10; P1=led_seg_code[i]; P3=0xdf; delay(50); P3=0xff; i=v%10; P2=led_seg_code[i]; P3=0xbf; delay(50); P3=0xff; i=v%100/10; P2=led_seg_code[i]; P3=0x7f; delay(50); P3=0xff; } void timer1() interrupt 3 { T1_cnt++; if(T1_cnt>3999) { T1_cnt=0; if(cnt_sn!=0) { cnt_sn--; } else { state_val_sn++; if(state_val_sn>2)state_val_sn=0; cnt_sn=init_sn[state_val_sn]; if(state_val_sn==0) { SN_green=0; SN_yellow=1; SN_red=1; } else if(state_val_sn==1) { SN_green=1; SN_yellow=0; SN_red=1; } else if(state_val_sn==2) { SN_green=1; SN_yellow=1; SN_red=0; } } if(cnt_ew!=0) { cnt_ew--; } else { state_val_ew++; if(state_val_ew>2)state_val_ew=0; cnt_ew=init_ew[state_val_ew]; if(state_val_ew==0) { EW_green=1; EW_yellow=1; EW_red=0; } else if(state_val_ew==1) { EW_green=0; EW_yellow=1; EW_red=1; } else if(state_val_ew==2) { EW_green=1; EW_yellow=0; EW_red=1; } } } } void button1() interrupt 0 { cnt_sn=60; cnt_ew=60; SN_green=1; SN_yellow=1; SN_red=0; EW_green=1; EW_yellow=1; EW_red=0; } main() { cnt_sn=init_sn[0]; cnt_ew=init_ew[0]; T1_cnt=0; state_val_sn=0; state_val_ew=0; SN_green=0; SN_yellow=1; SN_red=1; EW_green=1; EW_yellow=1; EW_red=0; TMOD=0x20; TH1=0x19; TL1=0x19; EA=1; ET1=1;TR1=1; IT1=1;EX1=1; IT0=1;EX0=1; while(1) { delay(10); led_show(cnt_sn,cnt_ew); } }
#include<reg51.h> //包含头文件reg51.h
sbit SN_green=P0^3; //定义P0^3为SN_green
sbit SN_yellow=P0^4; //定义P0^4为SN_yellow
sbit SN_red=P0^5; //定义P0^5为SN_red
sbit EW_green=P0^0; //定义P0^0为EW_green
sbit EW_yellow=P0^1; //定义P0^1为EW_yellow
sbit EW_red=P0^2; //定义P0^2为EW_red
unsigned char data cnt_sn,cnt_ew; //定义cnt_sn和cnt_ew为无符号字符型变量
unsigned int data T1_cnt; //定义T1_cnt为无符号整型变量
unsigned char data state_val_sn,state_val_ew; //定义state_val_sn和state_val_ew为无符号字符型变量
char code led_seg_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义led_seg_code为字符型数组,初始化为0x3f、0x06、0x5b、0x4f、0x66、0x6d、0x7d、0x07、0x7f、0x6f
char code init_sn[3]={24,4,29}; //定义init_sn为字符型数组,初始化为24、4、29
char code init_ew[3]={29,24,4}; //定义init_ew为字符型数组,初始化为29、24、4
void delay(unsigned int t) //定义延时函数delay,参数为无符号整型变量t
{
while(--t); //循环t次(等待t个机器周期)
}
void led_show(unsigned int u,unsigned int v) //定义led_show函数,参数为无符号整型变量u和无符号整型变量v
{
unsigned char i; //定义i为无符号字符型变量
i=u%10; //i等于u除以10的余数
P1=led_seg_code[i]; //P1输出led_seg_code[i]
P3=0xef; //P3的最低位变为0,其余位不变
delay(50); //延时50个机器周期
P3=0xff; //P3全部位变为1
i=u%100/10; //i等于u除以10的结果的余数
P1=led_seg_code[i]; //P1输出led_seg_code[i]
P3=0xdf; //P3的第二位变为0,其余位不变
delay(50); //延时50个机器周期
P3=0xff; //P3全部位变为1
i=v%10; //i等于v除以10的余数
P2=led_seg_code[i]; //P2输出led_seg_code[i]
P3=0xbf; //P3的第三位变为0,其余位不变
delay(50); //延时50个机器周期
P3=0xff; //P3全部位变为1
i=v%100/10; //i等于v除以10的结果的余数
P2=led_seg_code[i]; //P2输出led_seg_code[i]
P3=0x7f; //P3的最高位变为0,其余位不变
delay(50); //延时50个机器周期
P3=0xff; //P3全部位变为1
}
void timer1() interrupt 3 //定时器1中断服务程序
{
T1_cnt++; //T1_cnt自加
if(T1_cnt>3999) //如果T1_cnt大于3999
{
T1_cnt=0; //T1_cnt清零
if(cnt_sn!=0) //如果cnt_sn不等于0
{
cnt_sn--; //cnt_sn自减
}
else //否则
{
state_val_sn++; //state_val_sn自加
if(state_val_sn>2)state_val_sn=0; //如果state_val_sn大于2,则state_val_sn等于0
cnt_sn=init_sn[state_val_sn]; //cnt_sn等于init_sn[state_val_sn]
if(state_val_sn==0) //如果state_val_sn等于0
{
SN_green=0; //SN_green等于0
SN_yellow=1; //SN_yellow等于1
SN_red=1; //SN_red等于1
}
else if(state_val_sn==1) //如果state_val_sn等于1
{
SN_green=1; //SN_green等于1
SN_yellow=0; //SN_yellow等于0
SN_red=1; //SN_red等于1
}
else if(state_val_sn==2) //如果state_val_sn等于2
{
SN_green=1; //SN_green等于1
SN_yellow=1; //SN_yellow等于1
SN_red=0; //SN_red等于0
}
}
if(cnt_ew!=0) //如果cnt_ew不等于0
{
cnt_ew--; //cnt_ew自减
}
else //否则
{
state_val_ew++; //state_val_ew自加
if(state_val_ew>2)state_val_ew=0; //如果state_val_ew大于2,则state_val_ew等于0
cnt_ew=init_ew[state_val_ew]; //cnt_ew等于init_ew[state_val_ew]
if(state_val_ew==0) //如果state_val_ew等于0
{
EW_green=1; //EW_green等于1
EW_yellow=1; //EW_yellow等于1
EW_red=0; //EW_red等于0
}
else if(state_val_ew==1) //如果state_val_ew等于1
{
EW_green=0; //EW_green等于0
EW_yellow=1; //EW_yellow等于1
EW_red=1; //EW_red等于1
}
else if(state_val_ew==2) //如果state_val_ew等于2
{
EW_green=1; //EW_green等于1
EW_yellow=0; //EW_yellow等于0
EW_red=1; //EW_red等于1
}
}
}
}
void button1() interrupt 0 //外部中断0服务程序
{
cnt_sn=60; //cnt_sn等于60
cnt_ew=60; //cnt_ew等于60
SN_green=1; //SN_green等于1
SN_yellow=1; //SN_yellow等于1
SN_red=0; //SN_red等于0
EW_green=1; //EW_green等于1
EW_yellow=1; //EW_yellow等于1
EW_red=0; //EW_red等于0
}
main() //主函数
{
cnt_sn=init_sn[0]; //cnt_sn等于init_sn[0]
cnt_ew=init_ew[0]; //cnt_ew等于init_ew[0]
T1_cnt=0; //T1_cnt清零
state_val_sn=0; //state_val_sn等于0
state_val_ew=0; //state_val_ew等于0
SN_green=0; //SN_green等于0
SN_yellow=1; //SN_yellow等于1
SN_red=1; //SN_red等于1
EW_green=1; //EW_green等于1
EW_yellow=1; //EW_yellow等于1
EW_red=0; //EW_red等于0
TMOD=0x20; //TMOD等于0x20
TH1=0x19; //TH1等于0x19
TL1=0x19; //TL1等于0x19
EA=1; //打开总中断
ET1=1; //打开定时器1中断
TR1=1; //启动定时器1
IT1=1; //设置外部中断1为下降沿触发
EX1=1; //打开外部中断1
IT0=1; //设置外部中断0为下降沿触发
EX0=1; //打开外部中断0
while(1) //无限循环
{
delay(10); //延时10个机器周期
led_show(cnt_sn,cnt_ew); //调用led_show函数,显示cnt_sn和cnt_ew
}
}
优化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;}
这段代码是用来读取键盘矩阵的。优化的话可以将重复的代码部分提取出来,减少代码量,提高可读性和可维护性。例如,可以将扫描矩阵的代码封装成一个函数,传入参数即可扫描对应的行或列。另外,可以考虑使用数组来存储键盘矩阵的值,这样可以更方便地进行处理和调用。