求求大佬看看这个键盘扫描数码管显示函数哪里不对!哭了
protues吧
全部回复
仅看楼主
level 1
问题:键盘扫描只能用一次

#include <reg51.h>#
define INT8Uunsigned char#define INT16U unsigned int//共阳数码管0~F的数字段码表code INT8U SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E, 0x8c,0xaf,0xbF};//待显示到数码管的6个数字 INT8U array[] = {16,17,14,5,5,18} ; //显示缓存,可更新显示内容:如 array[i]=keyno; INT8U keyNo ;// 延时函数void delay_ms(INT16U x) {INT8U t; while(x--) for(t = 0; t < 120; t++);}//键盘函数void Keys_Scan(){ //高四位置零, 放入四行, 扫描四列P1 = 0x0f;delay_ms(1);if (P1 == 0x0f){keyNo = 0xff; return;}//按键后00001111将变成0000xxxx,x中一个为0,三个为1//下面判断按键发生于0~3列的那一列switch (P1){case 0x0e: keyNo = 0; break; //按键在第0列 case 0x0d: keyNo = 1; break; //按键在第1列case 0x0b: keyNo = 2; break; //按键在第2列case 0x07: keyNo = 3; break; //按键在第3列default: keyNo = 0xff;return; //无按键返回}//第四位置零,放入四列,扫描四行P1 = 0xf0;delay_ms(1);//按键后11110000将变成xxxx0000,x中一个为0,三个为1//下面判断按键发生于0~3行中的哪一行//对于0~3分别附加初值:0,4,8,12switch(P1){case 0xe0: keyNo += 0; break; //按键在第0行 case 0xd0: keyNo += 4; break; //按键在第1行case 0xb0: keyNo += 8; break; //按键在第2行case 0x70: keyNo += 12; break; //按键在第3行default: keyNo = 0xff;}}//显示程序 void LED_Screen_Refresh(){ INT8U i; while(1){ for ( i=0; i<6; i++ ) //扫描显示6位数码管 { P0= 0xff;//段码口输出全1,即先关闭 P2=1 << i;//输出位选码 00000001 00000010 00000100 .... 10000000 P0=SEG_CODE[array[i]]; //输出段选码 delay_ms(4); } }}// 主程序 void main(){ INT8U keyNo_temp;P0=0xff; array[5]=9;while(1){ Keys_Scan(); //扫描键盘键号 if(keyNo == 0xff) //无按键时,延时10ms{delay_ms(10);continue; // 无按键时延时10ms,重新扫描} else { keyNo_temp= keyNo;//在等待键释放前,先把键值暂存在这 while( Keys_Scan(), keyNo != 0xff); //未释放,等待 //修改缓存内容 array[5] = keyNo_temp;LED_Screen_Refresh(); }}}
2021年04月01日 06点04分 1
1