首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

就一小段51上键盘扫描的代码,小弟我要疯了

2012-03-24 
就一小段51上键盘扫描的代码,我要疯了难道是我智商只有一位数吗?我写了一整天都没有写出个正常点的扫描键

就一小段51上键盘扫描的代码,我要疯了
难道是我智商只有一位数吗?我写了一整天都没有写出个正常点的扫描键盘的程序!
我把代码贴出来,这段代码只对按了0,4,A,F四个键(也就是4X4键盘上一条对角线)有效
其他的按键,一按下去,数码管全都亮了,不知道为什么

C/C++ code
#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;        }      }}


[解决办法]
1 你的程序和电路对应吗?

2 建议矩阵键盘使用中断读值。

3 从头来,找个新方案。有时会更快解决问题。这个问题可以以后再来想。
[解决办法]
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
}

拿这个来说吧,你给出0XF7说明P33为0了,如果有键按下,那么其他变低的应该在高四位中,而你的判断确高四位都是0xEx,那么就只有一个按键有效了!对不对。你试着将判断中的数值改为0X77 0XB7 0XD7 0XE7 试试!
[解决办法]
C/C++ code
#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相反状态}}} 


[解决办法]
同一楼!按着一楼的做法仔细查一下。给你点建议,你应该首先了解你的键盘结构,其次应该明确你的程序设计思路。

热点排行