就一小段51上键盘扫描的代码,我要疯了
难道是我智商只有一位数吗?我写了一整天都没有写出个正常点的扫描键盘的程序!
我把代码贴出来,这段代码只对按了0,4,A,F四个键(也就是4X4键盘上一条对角线)有效
其他的按键,一按下去,数码管全都亮了,不知道为什么
#include<reg52.h> typedef unsigned char uchar;sbit we=P2^7;sbit duan=P2^6;uchar KeyScan();unsigned char table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};void delay(int a){ while(a--) { int b=72; while(b--); }}uchar KeyScan(){P3=0xf0;if(P3!=0xf0) { delay(10); P3=0xf0; if(P3!=0xf0) { P3=0xfe; { switch(P3) { case 0x7e:return 1;break;//0 按下相应的键显示相对应的码值 case 0x7d:return 2;break;//1 case 0x7b:return 3;break;//2 case 0x77:return 4;break;//3 } } P3=0xfd; switch(P3) { case 0xbe:return 5;break;//4 case 0xbd:return 6;break;//5 case 0xbb:return 7;break;//6 case 0xb7:return 8;break;//7 } P3=0xfb; switch(P3) { case 0xde:return 9;break;//8 case 0xdd:return 10;break;//9 case 0xdb:return 11;break;//a case 0xd7:return 12;break;//b } P3=0xf7; switch(P3) { case 0xee:return 13;break;//c case 0xed:return 14;break;//d case 0xeb:return 15;break;//e case 0xe7:return 16;break;//f } } }else {return 0xff;}}void main(){uchar num=0;uchar exnum;P0=0xff;we=1;we=0;P0=table[0]; //初始显示0duan=1;duan=0;while(1) { exnum=num; //就是用exnum保存上一个num假如按相同按键,就不变化 num=KeyScan(); if(num!=0xff) if(num!=exnum) { P0=table[num-1]; duan=1; duan=0; } }}
#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列单片机头文件sbit LED = P3 ^ 7;#define KEY P1 /*********************************************************************************************函数名:毫秒级CPU延时函数调 用:DELAY_MS (?);参 数:1~65535(参数不可为0)返回值:无结 果:占用CPU方式延时与参数数值相同的毫秒时间备 注:应用于1T单片机时i<600,应用于12T单片机时i<125/*********************************************************************************************/void DELAY_MS (unsigned int a){unsigned int i;while( a-- != 0){for(i = 0; i < 600; i++);}}/*********************************************************************************************//*********************************************************************************************函数名:阵列键盘处理函数调 用:? = Key (void);参 数:无返回值:0~0xff结 果:连接Px接口的键盘读出返回值备 注:/*********************************************************************************************/unsigned char Key (void){//键盘处理函数unsigned char a,b,c;//定义3个变量KEY = 0x0f;//键盘口置00001111if(KEY != 0x0f){ //查寻键盘口的值是否变化DELAY_MS (20);//延时20毫秒 if(KEY != 0x0f){//有键按下处理a = KEY;//键值放入寄存器a}KEY = 0xf0;//将键盘口置为11110000DELAY_MS(2);//延时20毫秒c = KEY;//将第二次取得值放入寄存器ca = a|c;//将两个数据相或switch(a){//对比数据值case 0xee: b = 1; break;//对比得到的键值给b一个应用数据case 0xed: b = 2; break;case 0xeb: b = 3; break;case 0xe7: b = 4; break;case 0xde: b = 5; break;case 0xdd: b = 6; break;case 0xdb: b = 7; break;case 0xd7: b = 8; break;case 0xbe: b = 9; break;case 0xbd: b = 10; break;case 0xbb: b = 11; break;case 0xb7: b = 12; break;case 0x7e: b = 13; break;case 0x7d: b = 14; break;case 0x7b: b = 15; break;case 0x77: b = 16; break;default: b = 10; break;//键值错误处理}}return (b);//将b作为返回值}/*********************************************************************************************/void main (void){ //主程序 while(1){if(Key() == 1){LED = 0; //取LED相反状态}if(Key() == 2){LED = 1; //取LED相反状态}}}
[解决办法]
同一楼!按着一楼的做法仔细查一下。给你点建议,你应该首先了解你的键盘结构,其次应该明确你的程序设计思路。