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
相关推荐
Q_21932764558 小时前
基于单片机的无线通信报警系统
单片机·嵌入式硬件
布丁oo9 小时前
ESP32智能天气时钟:温湿度气压全掌控
单片机·嵌入式硬件
蝎蟹居9 小时前
GBT 4706.1-2024逐句解读系列(26) 第7.6条款:正确使用符号标识
人工智能·单片机·嵌入式硬件·物联网·安全
F1331689295711 小时前
5G矿山车载监控终端山河矿卡定位监控终端
stm32·单片机·嵌入式硬件·5g·51单片机·硬件工程
vsropy11 小时前
keil5无法注释中文
stm32·单片机
csdn_te_download_00411 小时前
Keil5安装教程 基于C51 安装教程与配置完全指南
stm32·单片机·嵌入式硬件
ベadvance courageouslyミ12 小时前
51单片机相关
单片机·51单片机·定时器·pwm·蜂鸣器·中断·独立按键
送外卖的工程师12 小时前
STM32F103 驱动 BMP280 气压温湿度传感器 + OLED 显示教程
stm32·单片机·嵌入式硬件·mcu·物联网·proteus·rtdbs
2501_9277730712 小时前
嵌入式51单片机——中断
stm32·单片机·嵌入式硬件
玩转以太网12 小时前
WIZnet以太网单片机选型指南
单片机·嵌入式硬件·以太网