laos_ 2023-12-25 09:17 采纳率: 0%
浏览 57
已结题

STC8G1K08A串口亮灯的问题

STC8G1K08A接收串口过来的数值,如果是A 3-2引脚亮,如果是B 3-3引脚亮,
因为接收的数据是连续的AC,BD,AE,BF等 所以灯会闪(A 和B不会同一时间出现,但是接收到A或B灯肯定要亮),怎么解决LED闪的问题。


#include "stc8.h" 
#include <intrins.h>

char cmd;
void UartInit(void)        
{
    SCON = 0x50;        
    AUXR |= 0x40;        
    AUXR &= 0xFE;        
    TMOD &= 0x0F;        
    TL1 = 0xE0;            
    TH1 = 0xFE;            
    ET1 = 0;            
    TR1 = 1;            
}
 
void main()
{
  P3M0 = 0x00;
  P3M1 = 0x00;         
  P5M0 = 0x00;
  P5M1 = 0x00;
    
UartInit();
while(1){     
 
    if(RI == 1)
    {
    RI = 0;    cmd = SBUF;
    if(cmd == 'A')
    {
    P33=1; P32=0; 
    } 
    if(cmd == 'B')
    {
    P32=1; P33=0; 
    } 
    else    
    {
     P33=1;P32=1;  }
    }
    }
    }
  • 写回答

8条回答 默认 最新

  • 专家-皆知 2023-12-25 10:20
    关注

    引自强大而免费的微信小程序:皆我百晓生

    问题是LED闪烁,这是因为接收到的数据是连续的AB,导致在切换LED状态的时候会有短暂的闪烁。

    为了解决LED闪烁的问题,可以使用一个变量来记录当前 LED 的状态,只有在需要改变状态时才修改LED的状态,而不是每次收到数据都去修改。具体做法如下:

    1. 在main函数外定义一个变量,用来记录LED的状态:
    bit isLedOn = 0; // 初始化为LED关闭状态
    
    1. 修改LED的操作部分:
    if (cmd == 'A')
    {
        if (!isLedOn)
        {
            P33 = 1;
            P32 = 0;
            isLedOn = 1; // 更新LED状态
        }
    }
    else if (cmd == 'B')
    {
        if (isLedOn)
        {
            P32 = 1;
            P33 = 0;
            isLedOn = 0; // 更新LED状态
        }
    }
    

    这样,只有在需要改变LED状态时才会修改LED的引脚状态,而不会频繁地切换LED状态导致闪烁。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月26日
  • 修改了问题 12月25日
  • 修改了问题 12月25日
  • 修改了问题 12月25日
  • 展开全部