这份驱动代码是我运行在锦锐的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