找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2070|回复: 2
收起左侧

串口通信问题求大神帮我看看哪儿不对

[复制链接]
ID:148351 发表于 2016-12-1 21:33 | 显示全部楼层 |阅读模式
有没有人弄过用矩阵键盘的反馈值送给串口显示0到15,下面是我写的程序,自己感觉对着呢,但是我还没有按下按键他自己发送了一堆乱码;要不就是3A一直不停的现显示下去

      #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
                                   };
uchar key;
void init()
{
   TMOD=0x20;
   TH1=0xf4;
   TL1=0xf4;
   SM0=0;
   SM1=1;
   TR1=1;
}
void delayms(uint xms)
{
   uint i,j;
   for(i=xms;i>0;i--)
    for(j=110;j>0;j--);
}
uchar shownum()
{
   uchar temp,key;
   P3=0xfe;
   temp=P3;
   temp=temp&0xf0;
   if(temp!=0xf0)
   {
                delayms(10);
           P3=0xfe;
           temp=P3;
           temp=temp&0xf0;
                if(temp!=0xf0)
                {        temp=P3;
                          switch(temp)
                        {
                           case 0xee: key=0;break;
                           case 0xde: key=1;break;
                           case 0xbe: key=2;break;
                           case 0x7e: key=3;break;
                        }
                }

   }
   P3=0xfd;
   temp=P3;
   temp=temp&0xf0;
   if(temp!=0xf0)
   {
                delayms(10);
           P3=0xfd;
           temp=P3;
           temp=temp&0xf0;
                if(temp!=0xf0)
                {        temp=P3;
                          switch(temp)
                        {
                           case 0xed: key=4;break;
                           case 0xdd: key=5;break;
                           case 0xbd: key=6;break;
                           case 0x7d: key=7;break;
                        }
                }

   }
   P3=0xfb;
   temp=P3;
   temp=temp&0xf0;
   if(temp!=0xf0)
   {
                delayms(10);
           P3=0xb;
           temp=P3;
           temp=temp&0xf0;
                if(temp!=0xf0)
                {        temp=P3;
                          switch(temp)
                        {
                           case 0xeb: key=8;break;
                           case 0xdb: key=9;break;
                           case 0xbb: key=10;break;
                           case 0x7b: key=11;break;
                        }
                }

   }
   P3=0xf7;
   temp=P3;
   temp=temp&0xf0;
   if(temp!=0xf0)
   {
                delayms(10);
           P3=0xf7;
           temp=P3;
           temp=temp&0xf0;
                if(temp!=0xf0)
                {        temp=P3;
                          switch(temp)
                        {
                           case 0xe7: key=12;break;
                           case 0xd7: key=13;break;
                           case 0xb7: key=14;break;
                           case 0x77: key=15;break;
                        }
                }

   }
        return(key);
}
void main()
{
   init();
   while(1)
   {  shownum();
          SBUF=table[key];
          while(!TI);
            TI=0;  
   }

}
回复

使用道具 举报

ID:151575 发表于 2016-12-1 23:13 | 显示全部楼层
问题应该出现在主函数那里。shownum();和 SBUF=table[key];都在while(1)里面,当没有按下键的时候SBUF=table[key];语句就已经执行了,而这时候key又没有实际值,当然是随机发送一个值了。试着这样改         while(1)
   {  if(shownum())
          SBUF=table[key];
          while(!TI);
            TI=0;  
   }}    先判断按下键之后再发送数据。
回复

使用道具 举报

ID:148351 发表于 2016-12-3 13:08 | 显示全部楼层
帅哥 发表于 2016-12-1 23:13
问题应该出现在主函数那里。shownum();和 SBUF=table[key];都在while(1)里面,当没有按下键的时候SBUF=ta ...

谢谢大神
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表