关于单片机读写寄存器的问题

请教,下面代码 不用中断处理,按逻辑一步步推进是可行的,但实际情况是,复位后灯亮,再发任何数据LED灯灭,重新写入数据根本不起作用,请问是什么原因。

#include 
void URET_TX(unsigned int key)
{      
    
    
           while(TI==0)//判断信号是否接收完成
                      
                 {P2_3=SBUF;//读取寄存器中所写入的0,LED灯亮
                  
            }
                  TI=0;//重置信号完成标志位,重新进入上一个while循环
                
                
                
}


void URET_Tu(void)
 
{     
  PCON |= 0x80;        //使能波特率倍速位SMOD
    SCON = 0x50;        //8位数据,可变波特率
    TMOD &= 0x0F;        //设置定时器模式
    TMOD |= 0x20;        //设置定时器模式
    TL1 = 0x15;        //设置定时初值
    TH1 = 0x15;        //设置定时重载值
    TF1 = 0;        //清除TF1标志
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;         //允许止定时器1中断
  ES=1;      //串口中断
     
}
unsigned char word;
void main(void)
{ int n;
    URET_Tu();//初始化串口


    while(1)
    
 { URET_TX(SBUF);//写入数值0
      P2_3=1;//LED灯重新置地脚为高电位,完成后重新进入第一步,写入值
 }

        
    }

参考GPT和自己的思路:

根据你提供的代码,问题可能出现在URET_TX函数的while循环中。如果TI=0,则表明串口尚未完成数据传输,此时读取SBUF中的数据可能会导致未定义的行为。建议将while循环改为等待TI=1时再读取SBUF中的数据,同时在函数最后将TI重新置为0,以确保下一次数据传输时TI为0。另外,与该函数配套使用的URAT_Tu函数中也需要将TI初始值置为0。

调试下你的GPIO的信号。