首页 > 技术文章 > 数码管显示程序下的串口发送注意事项

logicexpression 2020-08-16 16:27 原文

      数码管显示原理,简单的讲就是类似PWM调光调电流,快速的扫描多个段数码管,利用人眼会残留影像的原理,显示完整静态的画面。通俗讲是依次显示A,B,C,B管,而不是同一时间显示,保证显示各管的时间基本相同,间隔相同,帧画面频率在75hz以上,人眼基本看不到抖动。

      程序流程总时间不超过,1/75 S,才能保证刷新频率高于对帧画面频率的要求,实时上对数码管的操作是一瞬间的事情,在数码管保持期间可以运行主程序,这就需要保证,不会有不可打断的长时间进程出现在程序运行中,比如uart发送或者接收,按键检测等。

     尽可能的提高主程序运行效率,减少不必要的延迟。

if(swDisplay == 0)
                 {
                     Sys_Scan();                //exKeyValueFlag存放在该变量中    10ms    1次
                    
                     if(enTran)
                     {
                         TrUart(trIntruct,trCdata);
                         enTran = 0;
                     }
                 }
                 else
                 {
                     if(runState)
                     {
                         //显示数码管
                         if(timCountMin > 5)        //总体20ms刷新完成
                         {
                             timCountMin = 0;
                             displayFlash();
                         }   
                     }
                 }

其他程序;
  把长进程与段扫描拆时序上分开。串口发送做成中断的方式。

//串口里执行里中断            //定时扫描发送使能位触发串口发送

if(TI)
     {
         TI = 0;
         uartTx0Flg = 1;
         trStep++;
         if(trStep == 1)
         {
             trData = 0xaa;
             SBUF = trData;
         }
         else if(trStep == 2)
         {
             SBUF = trIntruct;
         }
         else if(trStep == 3)
         {
             SBUF = trCdata;
         }
         else if(trStep == 4)
         {
             trData = 0xfa;
             SBUF = trData;
         }
         else if(trStep == 5)
         {
             trStep = 0;
         }

//需要触发中断直接调用即可

void TrUart(unsigned char instruct,unsigned char cdata)
{
     trIntruct = instruct,
     trCdata = cdata;
    
     trData = 0x55;
     SBUF = trData;

}

优点是,实时性好,不影响主进程运行。

SaiOneC -mcu交流群群二维码

项目合作,吹牛扯淡,交朋友,请联系18665321219

推荐阅读