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
相关推荐
d111111111d2 小时前
STM32 电源管理模式全解析:低功耗场景该如何选型?
笔记·stm32·单片机·嵌入式硬件·学习
M158227690552 小时前
串口设备联网利器!SG-TCP232-110 单通道串口服务器,让老旧设备秒变智能终端
运维·服务器·单片机
雅欣鱼子酱3 小时前
Type-C受电端芯片ECP5702演示:串口发送电压电流,给外部MCU读取
c语言·人工智能·单片机·嵌入式硬件·芯片·电子元器件
文sir.3 小时前
任务管理--FreeRTOS
单片机·嵌入式硬件·freertos
谁刺我心3 小时前
stm32cubemx外部中断按钮测试
stm32·单片机·嵌入式硬件
DIY机器人工房4 小时前
简单理解:M483SIDAE这款 MCU(微控制器)的核心规格参数
单片机·嵌入式硬件·嵌入式·diy机器人工房·m483sidae
czhaii4 小时前
基于AI8051U的无人机/四轴飞行器 | 全部开源,源程序,SCH/PCB
单片机
西城微科方案开发5 小时前
精准测温,智护健康——西城微科额温枪方案开发全解析
单片机·嵌入式硬件·方案公司推荐
集芯微电科技有限公司5 小时前
DC-DC|40V/10A大电流高效率升压恒压控制器
c语言·数据结构·单片机·嵌入式硬件·fpga开发