LED5050驱动程序,高效率

这份驱动代码是我运行在锦锐的CA51M151S3A单片机上的,本来还想用汇编,奈何有点忘,没时间倒腾汇编了就优化C语言的算法,结果效率也是堪比汇编的,也挺满足了代码如下。

复制代码
sbit LED5050_PIN = P2^0;

#define LED_NUM 20
 xdata unsigned char LED_DIS[LED_NUM][3];
void LED5050_All_Write_Data(unsigned char *d, u8 len,u8 enable);

#if 1
/*20颗灯珠实测1.5ms,效率很高,非常nice*/
void LED5050_All_Write_Data(unsigned char *d, u8 len,u8 enable){
  u8 dat = 0;
  u8 mask = 0; 
  if(enable){
    EA=0;
      while(len--){
        dat = *d++;
        for(mask=0x80;mask;mask>>=1){
          if(dat & mask){
             LED_DO = 1;  //待发送数据
            _nop_();   //1个nop约0.125us 1码高电平需要0.7us
            _nop_();  
            _nop_();  
             LED_DO = 0;     
          }
          else{
            LED_DO = 1; 
            LED_DO = 0;   
          }
        } 
      }
    EA=1;
    }
}
#else  
/*20颗灯珠实测900us,效率非常高,非常nice,堪比汇编*/
void LED5050_All_Write_Data(unsigned char *d, u8 len,u8 enable){
  u8 dat = 0;
  if(enable){
    EA=0;
      while(len--){
        dat = *d++;
        if(dat&0x80){
             LED_DO = 1;  
            _nop_();  
            _nop_();  
            _nop_();  
             LED_DO = 0;   
        }
        else{
            LED_DO = 1; 
            LED_DO = 0;    
        }
        if(dat&0x40){
             LED_DO = 1;  
            _nop_();  
            _nop_();  
            _nop_();  
             LED_DO = 0;   
        }
        else{
            LED_DO = 1; 
            LED_DO = 0;    
        }        
        if(dat&0x20){
             LED_DO = 1;  
            _nop_();  
            _nop_();  
            _nop_();  
             LED_DO = 0;   
        }
        else{
            LED_DO = 1; 
            LED_DO = 0;    
        }  
        if(dat&0x10){
             LED_DO = 1;  
            _nop_();  
            _nop_();  
            _nop_();  
             LED_DO = 0;   
        }
        else{
            LED_DO = 1; 
            LED_DO = 0;    
        } 
        if(dat&0x08){
             LED_DO = 1;  
            _nop_();  
            _nop_();  
            _nop_();  
             LED_DO = 0;   
        }
        else{
            LED_DO = 1; 
            LED_DO = 0;    
        }   
        if(dat&0x04){
             LED_DO = 1;  
            _nop_();  
            _nop_();  
            _nop_();  
             LED_DO = 0;   
        }
        else{
            LED_DO = 1; 
            LED_DO = 0;    
        }  
        if(dat&0x02){
             LED_DO = 1;  
            _nop_();  
            _nop_();  
            _nop_();  
             LED_DO = 0;   
        }
        else{
            LED_DO = 1; 
            LED_DO = 0;    
        }   
        if(dat&0x01){
             LED_DO = 1;  
            _nop_();  
            _nop_();  
            _nop_();  
             LED_DO = 0;   
        }
        else{
            LED_DO = 1; 
            LED_DO = 0;    
        }        
      }
    EA=1;
    }
}
#endif
相关推荐
FreakStudio8 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
ifndef10 天前
GPIO同时复用(ADC与TIM)
mcu
✎ ﹏梦醒͜ღ҉繁华落℘13 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
zd84510150013 天前
RS485 总线详解
单片机·嵌入式硬件
✎ ﹏梦醒͜ღ҉繁华落℘13 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展13 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司13 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设
踏着七彩祥云的小丑13 天前
嵌入式测试学习第 37 天:异常场景测试:断电、拔插、干扰、非法指令
单片机·嵌入式硬件·学习
意法半导体STM3213 天前
【官方原创】如何为STM32CubeMX2配置Visual Studio Code配置方案
vscode·stm32·单片机·嵌入式硬件·策略模式·stm32cubemx·嵌入式开发
雾削木13 天前
B语言经典教程现代化重构
java·前端·stm32·单片机·嵌入式硬件