打印

单片机串口问题

[复制链接]
499|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
卷卷虫|  楼主 | 2019-11-19 19:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/*
按下矩阵键盘第一行时以1200bps发送1,2,3,4,
                        第二行时以2400bps发送5,6,7,8,
                        第三行以4800bps发送9,10,11,12 ,
                        第四行以9600bps发送13,14,15,16.
*/
#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
uchar flag,key;
void delay(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
void key_scan()
{
        uchar temp;
        TR1=0;

        P3=0xfe;         //第一行
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {        
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        TH1=0xe8;//波特率设置为1200bps
                        TL1=0xe8;        
                        switch(temp)
                        {
                                case 0xee:key=1;break;
                                case 0xde:key=2;break;
                                case 0xbe:key=3;break;
                                case 0x7e:key=4;break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;        
                        }
                        flag=1;
                }
        }

        P3=0xfd;        //第二行
        temp=0xfd;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        TH1=0xf4;
                        TL1=0xf4;//波特率设置为2400bps
                        switch(temp)
                        {
                                case 0xed:key=5;break;
                                case 0xdd:key=6;break;
                                case 0xbd:key=7;break;
                                case 0x7d:key=8;break;        
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;        
                        }
                        flag=1;
                }
        }

        P3=0xfb;//第三行
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        TH1=0xfa;
                        TL1=0xfa;//波特率设置为4800bps
                        switch(temp)
                        {        
                                case 0xeb:key=9;break;
                                case 0xdb:key=10;break;
                                case 0xbb:key=11;break;
                                case 0x7b:key=12;break;        
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }        
                        flag=1;
                }

        }

        P3=0xf7;//第四行
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        TH1=0xfd;
                        TL1=0xfd;//波特率设置为9600bps
                        switch(temp)
                        {
                                case 0xe7:key=13;break;
                                case 0xd7:key=14;break;
                                case 0xb7:key=15;break;
                                case 0x77:key=16;break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        flag=1;
                }
        }
        TR1=1;
}
void main()
{
        TMOD=0x20;//设置定时器1为工作方式2
        TH1=0xe8;//波特率设置为1200                          ???????????????????
        TH1=0xe8;                //????????????????????

        
        SM0=0;
        SM1=1;
        //REN=1;//????????????????????????允许串口接收

        EA=1;//????????????????????
        ES=1;//??????????????????
        while(1)
        {
                key_scan();
                P3=0xff;
                if(flag==1)
                {
                        flag=0;
                        
                        TI=1;                   //??????????????????
                        printf("%c",key); //????????????????

                //        SBUF=key;                //????????????????????
                        while(!TI);
                        TI=0;
                }
        }
}
按下第一行,第四行,也就是波特率为1200bps,9600bps时,还能显示出想要的结果,只是前面会出现一行“DF 9F 9F 9F 9F 9F”,第二行(2400bps)怎么按都没反应,按下第三行(4800bps)完全不受控制,是因为矩阵键盘与串口引脚冲突的问题吗,该怎么解决

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝