各位看下这个例子为什么按一下按键串口输出N多数据

2019-07-15 18:45发布

/*
将键盘的值以1200bps发送到计算机,在计算机上显示。
*/

#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

uchar flag,temp,num,a;

void init()
{
        TMOD=0x20;    //timer1 mode2 8bit reload
        TH1=0xE8;          //1200bps
        TL1=0xE8;
        TR1=1;          //open timer1
        REN=1;         //admit serial receive data
        SM0=0;         //10bit asynchronous
        SM1=1;
        EA=1;
        ES=1;       //open serial
}

void delay(uchar t)             //delay function
{
        uint i;
        for(t;t>0;t--)
        {
                for(i=115;i>0;i--);
        }
}

uchar keyscan();

void main()
{
        init();

        while(1)
        {

                        ES=0;       
                         //怎样让串口只输出一个字符?
                        SBUF=keyscan();       
                        while(!TI);
                        TI=0;
                        ES=1;               
                 

                        
        }
}


uchar keyscan()
{
        P3=0xfe;   //将P3第一口拉低
        temp=P3;
        temp=temp&0xf0;           //检测P3口
        while(temp!=0xf0)
        {
                delay(5);
                temp=P3;
                temp=temp&0xf0;
                while(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xee: num=1;
                                        break;
                                case 0xde: num=2;
                                        break;
                                case 0xbe: num=3;
                                        break;
                                case 0x7e: num=4;
                                        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }

                                       
                }

        }
        P3=0xfd;   //将P3第2口拉低
        temp=P3;
        temp=temp&0xf0;           //检测P3口
        while(temp!=0xf0)
        {
                delay(5);
                temp=P3;
                temp=temp&0xf0;
                while(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xed: num=5;
                                        break;
                                case 0xdd: num=6;
                                        break;
                                case 0xbd: num=7;
                                        break;
                                case 0x7d: num=8;
                                        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }

                                       
                }

        }
        P3=0xfb;   //将P3第3口拉低
        temp=P3;
        temp=temp&0xf0;           //检测P3口
        while(temp!=0xf0)
        {
                delay(5);
                temp=P3;
                temp=temp&0xf0;
                while(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xeb: num=9;
                                        break;
                                case 0xdb: num=10;
                                        break;
                                case 0xbb: num=11;
                                        break;
                                case 0x7b: num=12;
                                        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }

                                       
                }

        }
        P3=0xf7;   //将P3第4口拉低
        temp=P3;
        temp=temp&0xf0;           //检测P3口
        while(temp!=0xf0)
        {
                delay(5);
                temp=P3;
                temp=temp&0xf0;
                while(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xe7: num=13;
                                        break;
                                case 0xd7: num=14;
                                        break;
                                case 0xb7: num=15;
                                        break;
                                case 0x77: num=16;
                                        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }

                                       
                }

        }

         return num;
       
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
阿信509
1楼-- · 2019-07-15 20:23
你先试试单独发送一个数据行不行
阿信509
2楼-- · 2019-07-15 20:26
而且num的数值不管有没有按键按下你都返回,肯定每次都要发送到串口了,会一直发的
sanmaodeai
3楼-- · 2019-07-15 23:16
阿信509 发表于 2014-8-19 22:59
而且num的数值不管有没有按键按下你都返回,肯定每次都要发送到串口了,会一直发的  ...

嗯,提醒到我了,我在主函数中加了一条while语句,虽然能单个显示了,但是有时候不正确
void main()
{
        init();

        while(1)
        {

                        ES=0;
                       
                        while(keyscan()==keyscan());
                        SBUF=keyscan();
       
                        while(!TI);
                        TI=0;
                        ES=1;               
                 

                        
        }
}


zy2014
4楼-- · 2019-07-16 02:13
sanmaodeai 发表于 2014-8-19 23:26
嗯,提醒到我了,我在主函数中加了一条while语句,虽然能单个显示了,但是有时候不正确
void main()
{

1.num 既然是全局变量,感觉没必要return吧。
2.keyscan函数中按键弹起后flag置1,无按键置0
3. out函数只是检测是否输出完成
4.main中while改动较大

  1. /*
  2. 将键盘的值以1200bps发送到计算机,在计算机上显示。
  3. */

  4. #include<reg52.h>

  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. uchar flag,temp,num,a,num_temp;

  8. void init()
  9. {
  10.         TMOD=0x20;    //timer1 mode2 8bit reload
  11.         TH1=0xE8;          //1200bps
  12.         TL1=0xE8;
  13.         TR1=1;          //open timer1
  14.         REN=1;         //admit serial receive data
  15.         SM0=0;         //10bit asynchronous
  16.         SM1=1;
  17.         EA=1;
  18.         ES=1;       //open serial
  19. }

  20. void delay(uchar t)             //delay function
  21. {
  22.         uint i;
  23.         for(t;t>0;t--)
  24.         {
  25.                 for(i=115;i>0;i--);
  26.         }
  27. }
  28. void out(uchar ch)
  29. {
  30.   SBUF=ch;
  31.   while(!TI);
  32.   TI=0;
  33. }
  34. uchar keyscan();

  35. void main()
  36. {
  37.         init();

  38.         while(1)
  39.         {
  40.           keyscan();
  41.           if(flag==1)
  42.           {
  43.             ES=0;
  44.             flag=0;
  45.             if(num<10)
  46.               out(num+48); //output 1-9
  47.             else
  48.               out(num+55); //output A-F
  49.             out(' ');
  50.             out(' ');
  51.             ES=1;
  52.           }      
  53.         }
  54. }


  55. void keyscan()
  56. {
  57.         P3=0xfe;   //将P3第一口拉低
  58.         temp=P3;
  59.         temp=temp&0xf0;           //检测P3口
  60.         while(temp!=0xf0)
  61.         {
  62.                 delay(5);
  63.                 temp=P3;
  64.                 temp=temp&0xf0;
  65.                 while(temp!=0xf0)
  66.                 {
  67.                         temp=P3;
  68.                         switch(temp)
  69.                         {
  70.                                 case 0xee: num=1;
  71.                                         break;
  72.                                 case 0xde: num=2;
  73.                                         break;
  74.                                 case 0xbe: num=3;
  75.                                         break;
  76.                                 case 0x7e: num=4;
  77.                                         break;
  78.                         }
  79.                         while(temp!=0xf0)
  80.                         {
  81.                                 temp=P3;
  82.                                 temp=temp&0xf0;
  83.                         }
  84.                         flag=1;  //表示有按键
  85.                 }

  86.         }
  87.         P3=0xfd;   //将P3第2口拉低
  88.         temp=P3;
  89.         temp=temp&0xf0;           //检测P3口
  90.         while(temp!=0xf0)
  91.         {
  92.                 delay(5);
  93.                 temp=P3;
  94.                 temp=temp&0xf0;
  95.                 while(temp!=0xf0)
  96.                 {
  97.                         temp=P3;
  98.                         switch(temp)
  99.                         {
  100.                                 case 0xed: num=5;
  101.                                         break;
  102.                                 case 0xdd: num=6;
  103.                                         break;
  104.                                 case 0xbd: num=7;
  105.                                         break;
  106.                                 case 0x7d: num=8;
  107.                                         break;
  108.                         }
  109.                         while(temp!=0xf0)
  110.                         {
  111.                                 temp=P3;
  112.                                 temp=temp&0xf0;
  113.                         }
  114.                         flag=1;  //表示有按键              
  115.                 }

  116.         }
  117.         P3=0xfb;   //将P3第3口拉低
  118.         temp=P3;
  119.         temp=temp&0xf0;           //检测P3口
  120.         while(temp!=0xf0)
  121.         {
  122.                 delay(5);
  123.                 temp=P3;
  124.                 temp=temp&0xf0;
  125.                 while(temp!=0xf0)
  126.                 {
  127.                         temp=P3;
  128.                         switch(temp)
  129.                         {
  130.                                 case 0xeb: num=9;
  131.                                         break;
  132.                                 case 0xdb: num=10;
  133.                                         break;
  134.                                 case 0xbb: num=11;
  135.                                         break;
  136.                                 case 0x7b: num=12;
  137.                                         break;
  138.                         }
  139.                         while(temp!=0xf0)
  140.                         {
  141.                                 temp=P3;
  142.                                 temp=temp&0xf0;
  143.                         }
  144.                         flag=1;  //表示有按键         
  145.                 }

  146.         }
  147.         P3=0xf7;   //将P3第4口拉低
  148.         temp=P3;
  149.         temp=temp&0xf0;           //检测P3口
  150.         while(temp!=0xf0)
  151.         {
  152.                 delay(5);
  153.                 temp=P3;
  154.                 temp=temp&0xf0;
  155.                 while(temp!=0xf0)
  156.                 {
  157.                         temp=P3;
  158.                         switch(temp)
  159.                         {
  160.                                 case 0xe7: num=13;
  161.                                         break;
  162.                                 case 0xd7: num=14;
  163.                                         break;
  164.                                 case 0xb7: num=15;
  165.                                         break;
  166.                                 case 0x77: num=16;
  167.                                         break;
  168.                         }
  169.                         while(temp!=0xf0)
  170.                         {
  171.                                 temp=P3;
  172.                                 temp=temp&0xf0;
  173.                         }
  174.                         flag=1;  //表示有按键            
  175.                 }

  176.         }
  177.         flag=0;  //表示无按键
  178. }
复制代码



评分

参与人数 1威望 +2 +2 积分 +2 收起 理由 1563661808 + 2 + 2 + 2 您的付出是论坛的动力,感谢您一直支持!.

查看全部评分

tcjsjxx12345
5楼-- · 2019-07-16 02:34
 精彩回答 2  元偷偷看……
阿信509
6楼-- · 2019-07-16 08:16
其实可以没按钮按下时不发送,有按下时再发送相应键码

一周热门 更多>