找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1948|回复: 5
收起左侧

求大佬指点,51单片机串口和矩阵按键程序的问题

[复制链接]
ID:903513 发表于 2021-4-19 19:23 | 显示全部楼层 |阅读模式
我对这个程序有点小疑问,如果我一直没有按按键一直没有按下,那么程序就会停在while(!TI)里面,那为什么我在单片机里面会看到小灯一直闪烁?
单片机源程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z);
sbit wela=P2^7;
sbit dula=P2^6;
uint b;
int c;
uint d=0;
uchar DAT;
void delay(uint z)
{
    uint x,y;
     for(x=z;x>0;x--)
    {
         for(y=144;y>0;y--);
    }
}
void scon_crol()
{
    SM0=0;//工作方式1 八位数据传输
    SM1=1;
    REN=1;//允许接收数据
    TMOD=0x20;//计时器1工作模式2 八位自动装填计时器
    TH1=0xfd;//计时器初值
    TL1=0xfd;//自动装填:TL1=TH1
    TR1=1;//打开计时器
}
uchar keydown()
{
    uchar a;
    P3=0xf0;
    if(P3 != 0xf0)
    {
        delay(5);
        if(P3 != 0xf0)
        {
            a=P3;
            P3=0x0f;
            a=a|P3;
        }
        while(P3!=0x0f);
    }
    P1=0xfe;//小灯闪烁
    delay(50);
    P1=0xff;
    delay(50);
    return a;
}
uchar keypro()
{
    uchar key_value;
    switch(keydown())
    {
        case 0xee: key_value =0x01; break;
        case 0xde: key_value =0x02; break;
        case 0xbe: key_value =0x03; break;
        case 0x7e: key_value =0x04; break;
        
        case 0xed: key_value =0x05; break;
        case 0xdd: key_value =0x06; break;
        case 0xbd: key_value =0x07; break;
        case 0x7d: key_value =0x08; break;
        
        case 0xeb: key_value =0x09; break;
        case 0xdb: key_value =0x0a; break;
        case 0xbb: key_value =0x0b; break;
        case 0x7b: key_value =0x0c; break;
        
        case 0xe7: key_value =0x0d; break;
        case 0xd7: key_value =0x0e; break;
        case 0xb7: key_value =0x0f; break;
        case 0x77: key_value =0x10; break;
    }
    P1=0xfb;//小灯闪烁
    delay(50);
    P1=0xff;
    delay(50);
    return (key_value);
}
void main()
{
    scon_crol();        
    while(1)
    {
        SBUF =keypro();
        while(!TI);
        TI=0;         
    }
}


回复

使用道具 举报

ID:844772 发表于 2021-4-19 21:01 | 显示全部楼层
传输完数据,硬件将TI置1的,跟你按键没关系,自然LED会闪烁了
回复

使用道具 举报

ID:903513 发表于 2021-4-19 21:09 | 显示全部楼层
glinfei 发表于 2021-4-19 21:01
传输完数据,硬件将TI置1的,跟你按键没关系,自然LED会闪烁了

那如果是因为这个原因,在我没按下按键时,SBUF会被重复赋a的初值0x00,但我在串口助手上并没有看到这种情况?
回复

使用道具 举报

ID:844772 发表于 2021-4-19 22:15 | 显示全部楼层
sql_123 发表于 2021-4-19 21:09
那如果是因为这个原因,在我没按下按键时,SBUF会被重复赋a的初值0x00,但我在串口助手上并没有看到这种 ...

ASCII有33个不能显示的哦,0x00排名第一;另外,我没看到哪有a的初值,你两处都不赋初值,过于依赖编译器了。
回复

使用道具 举报

ID:903513 发表于 2021-4-19 23:09 | 显示全部楼层
glinfei 发表于 2021-4-19 22:15
ASCII有33个不能显示的哦,0x00排名第一;另外,我没看到哪有a的初值,你两处都不赋初值,过于依赖编译器 ...

懂了懂了,谢谢大佬啦
回复

使用道具 举报

ID:390416 发表于 2021-4-20 09:23 | 显示全部楼层
串口1打印程序 可以打印3个十六位的变量 波特率9600 http://www.51hei.com/bbs/dpj-201660-1.html

串口发送 不需要while死等 串口接收执行软件复位 http://www.51hei.com/bbs/dpj-200927-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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