在进行矩阵按键检测的时候,对于51单片机来说,由于IO输出电流较小,驱动能力不足,若用一个A号IO口去检测B号IO口,无论B口高电平还是低电平,A口皆是低电平;若A口置高,可用来检测B口的低电平。
IO.H文件
#ifndef _MATRIX_H_#define _MATRIX_H_#include "STC15F2K60S2.h"#include "delay.h"#define line0 P30#define line1 P31#define line2 P32#define line3 P33#define list0 P44#define list1 P42#define list2 P35#define list3 P34extern bit flagSMGScreen;extern bit numClear;extern unsigned char num;extern unsigned char countPress;void key_scan();#endif
.C文件
#include "matrix.h"bit flagSMGScreen=0; //界面转换标志bit numClear; //清零按键unsigned char num;unsigned char countPress;void key_scan(){unsigned char temp;list0=1;list1=1;list2=1;list3=1; line0=0; line1=0; line2=0; line3=0;if(list0==0||list1==0||list2==0||list3==0){Delay5ms();if(list0==0||list1==0||list2==0||list3==0){list0=1;list1=1;list2=1;list3=1; line0=0; line1=0; line2=0; line3=0;if(list0==0) temp=1;if(list1==0) temp=2;if(list2==0) temp=3;if(list3==0) temp=4;list0=0;list1=0;list2=0;list3=0; line0=1; line1=1; line2=1; line3=1;if(line0==0) temp=temp-1;if(line1==0) temp=temp+3;if(line2==0) temp=temp+7;if(line3==0) temp=temp+11;}while(!line0 || !line1 || !line2 ||!line3) //若按键一直按下去则一直在该}else temp = 20;//while中循环switch(temp){case 0: temp=20; num=1; countPress++;break;//countPress可检测case 1: temp=20; num=2; countPress++;break;//按键按下的次数case 2: temp=20; num=3; countPress++;break;//num指某个按键代表的值case 3: break; //可任意修改case 4: temp=20; num=4; countPress++;break;case 5: temp=20; num=5; countPress++;break;case 6: temp=20; num=6; countPress++;break;case 7: break;case 8: temp=20; num=7; countPress++;break;case 9: temp=20; num=8; countPress++;break;case 10:temp=20; num=9; countPress++;break;case 11:break;case 12:temp=20; num=0; countPress++;break;case 13:temp=20; flagSMGScreen=~flagSMGScreen;countPress=0;break;case 14:temp=20; numClear=1;countPress--; break;default: break;}}
如果觉得《矩阵键盘_按键检测_按键次数检测》对你有帮助,请点赞、收藏,并留下你的观点哦!