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
相关推荐
普中科技7 小时前
【普中STM32F1xx开发攻略--标准库版】-- 第 45 章 FSMC-外扩 SRAM 实验
stm32·单片机·嵌入式硬件·fsmc·普中科技·外扩sram·is62wv51216
三佛科技-1873661339710 小时前
FT32F103C8AT7兼容GD32F103C8T632 位通用微控制器MCU,替代性分析
单片机·嵌入式硬件
iCxhust10 小时前
8086汇编 word ptr
汇编·单片机·嵌入式硬件·微机原理·8088单板机
嵌入式ZYXC10 小时前
第3篇:《面试题:I2C为什么要加上拉电阻?阻值怎么选?》
stm32·单片机·嵌入式硬件·面试·职场和发展
leo__52011 小时前
C# 虚拟键盘(软键盘)实现
单片机·c#·计算机外设
你疯了抱抱我11 小时前
【STM32】使用 STM32CubeMX 生成项目,LED测试;上位机:STM32F411CEU6
stm32·单片机·嵌入式硬件
今天的你比昨天进步了?13 小时前
单片机程序,keil可以正常编译,VScode编译报错处理
vscode·单片机·嵌入式硬件
崇山峻岭之间15 小时前
单片机汉字显示实验
单片机·嵌入式硬件
guygg8815 小时前
基于C# + Halcon的通用ROI绘制工具
stm32·单片机·c#