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
相关推荐
芯片设计-曾工9 小时前
当精准脉冲遇上清晰视界——CH2205E模块与YL1621的“黄金搭档“
驱动开发·stm32·单片机·51单片机·硬件工程
LCG元14 小时前
STM32 硬件 SPI + DMA 驱动 OLED 显示屏(SSD1306):从原理到 112fps 高速刷新全流程
stm32·单片机·嵌入式硬件
天吾cc15 小时前
RTT-ADC
单片机·嵌入式硬件·学习
qq_4480111615 小时前
C语言中的野指针和空指针
c语言·开发语言·单片机
崇山峻岭之间16 小时前
STM32F407的FOC驱动01
stm32·单片机·嵌入式硬件
Lzh编程小栈21 小时前
【嵌入式硬核精讲】I2C通信协议万字详解(时序帧格式、同步半双工、重复起始、一对多挂载、寄存器、面试必考)
stm32·单片机·嵌入式硬件·面试
十月的皮皮21 小时前
STM32从零到量产开发:四路继电器工业控制模块开发 -上位机 Program.cs 应用程序入口设计说明
c语言·stm32·单片机·stm32cubemx·hal库
LCG元1 天前
STM32F103+MPU6050互补滤波姿态解算与OLED实时显示实战(附完整工程代码)
stm32·单片机·嵌入式硬件
求知喻1 天前
FM33L023D外部中断
单片机·嵌入式硬件
小帽子_1231 天前
STM32+BMS 嵌入式开发:ADC 电压温度采集与总线通信落地教程
stm32·单片机·嵌入式硬件