各位看下这个例子为什么按一下按键串口输出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条回答
ntmusic
2019-07-16 09:08
有时候解决这些问题很简单,只是想太多导致问题复杂化了。我也不想提类似模块化编程这样的说法,只是理所当然的就会想到应该这样去编才对啊。比如:串口发送,就单独编一个发送数据的功能,加多一个使能EN,当EN满足时将数据送出。再比如:按键识别,就单独编一个按键识别的功能,完成消抖一类的功能,返回键值和按键被触发的事件(可选)。然后再把这两个功能结合起来就OK。我们都应该培养这种功能块(别人也称模块化)的编程方法,每一个功能块通过形参等接口完成信息传递,这样每一个模块都可以独立调试,发现问题也能很快知道哪一个功能块出现问题。

评分

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

查看全部评分

一周热门 更多>