89C52键盘检测遇到的问题,请教诸老师。

2019-07-16 06:31发布

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
void send(uchar a)
{

SBUF=a;
ES=1;
while(!ti);
TI=0;
ES=0;
}
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);   
}
void init()
{  
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
// PCON=0;
TR1=1;
SM0=0;
SM1=1;
EA=1;
ES=0;
TI=0;
}
void keyscan()
{
   uchar temp,num;
   P3=0xfe;
   temp=P3;
   
   temp=temp&0xf0;
   if(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     if(temp!=0xf0)
     {
      temp=P3;
     switch(temp)
      {
       case 0xee:num=0;
        break;
       case 0xde:num=1;
        break;
       case 0xbe:num=2;
        break;
       case 0x7e:num=3;
        break;
      }
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      }
      send(num);
     }
    }
   P3=0xfd;
   temp=P3;
   temp=temp&0xf0;
   if(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     if(temp!=0xf0)
     {
      temp=P3;
      switch(temp)
      {
       case 0xed:num=4;
        break;
       case 0xdd:num=5;
        break;
       case 0xbd:num=6;
        break;
       case 0x7d:num=7;
        break;
      }
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      }
      send(num);
     }
    }

   P3=0xfb;
   temp=P3;
   temp=temp&0xf0;
   if(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     if(temp!=0xf0)
     {
      temp=P3;
     switch(temp)
      {
       case 0xeb:num=8;
        break;
       case 0xdb:num=9;
        break;
       case 0xbb:num=10;
        break;
       case 0x7b:num=11;
        break;
      }
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      }
      send(num);
     }
    }

   P3=0xf7;
   temp=P3;
   temp=temp&0xf0;
   if(temp!=0xf0)
    {
     delay(100);
     temp=P3;
     temp=temp&0xf0;
     if(temp!=0xf0)
     {
      temp=P3;
      switch(temp)
      {
       case 0xe7:num=12;
        break;
       case 0xd7:num=13;
        break;
       case 0xb7:num=14;
        break;
       case 0x77:num=15;
        break;
      }
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      }
      send(num);
     }
    }
//return num;
}
void main()
{
init();
while(1)
{
  keyscan();      
}
}
实验板上做键盘检测,发送0-15,在发送4、5、6、7时,串口助手一直收“00”而不是4、5、6、7,我的理解是不是因为P3^1口本身是做为发送端口,在检测4、5、6、7时,已经被定义为0而造成的,不知道对不对,如果是那样,可P3^1被定义为1时,为什么不发送“FF”,还有就是在把波特率改为4800或者2400时,串口助手一直接受数据,可我还没有去按下按键,又是为什么?请老师指点,已经闹了2天了,找不到原因啊!!谢谢!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
diangongshi
1楼-- · 2019-07-16 08:28
引脚在做串口的同时又被拿来做电平检测,当然容易出问题了,89C52那么多引脚,可以用别的试一下嘛。
popotang
2楼-- · 2019-07-16 11:45
谢谢您啊,呵呵,搞定了,确实是因为IO口与RXD,TXD冲突了,谢谢您啊
huangjunbo
3楼-- · 2019-07-16 12:22
popotang 发表于 2012-1-8 22:43
谢谢您啊,呵呵,搞定了,确实是因为IO口与RXD,TXD冲突了,谢谢您啊

恭喜!
qwa471036
4楼-- · 2019-07-16 17:31
 精彩回答 2  元偷偷看……
diangongshi
5楼-- · 2019-07-16 19:08
本帖最后由 diangongshi 于 2012-1-9 13:41 编辑
popotang 发表于 2012-1-8 22:43
谢谢您啊,呵呵,搞定了,确实是因为IO口与RXD,TXD冲突了,谢谢您啊

不客气,共同学习有什么问题大家一块来讨论
qop3412
6楼-- · 2019-07-17 00:37
学习啦!

一周热门 更多>