在单片机控制程序中,往往会用到位翻转程序,例如点阵的控制,图形的处理,FFT运算等。那么,在C语言中如何才能写出高效率的程序呢?今日在keil的论坛中看到有网友提及这个程序,又在ourdev论坛搜索了一下,将老外写的,网友写的,我自己写的程序做了一个全方位的测试,结果如下所示:
首先是老外的程序:
第三个程序:还是我写的
#include <reg52.h> unsigned char mr;
unsigned char invertir_byte (mr) { bit tempb; unsigned char count,temp; for(count=8;count;count--) { tempb=mr&0x01; mr>>=1; temp<<=1; temp=temp|tempb; } return (temp);
}
void main() { while(1) { P1=invertir_byte(0x33); } }
Program Size: data=12.1 xdata=0 code=64 完成位交换需要 175 个时钟周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第三个程序:还是我写的
#include <reg52.h> unsigned char mr;
unsigned char invertir_byte (mr) { bit tempb; unsigned char count,temp; for(count=8;count;count--) { tempb=mr&0x01; mr>>=1; temp<<=1; temp=temp|tempb; } return (temp);
}
void main() { while(1) { P1=invertir_byte(0x33); } }
Program Size: data=12.1 xdata=0 code=64 完成位交换需要 175 个时钟周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第四个程序:还是我写的
#include <reg52.h> unsigned char bdata temp; sbit D0=temp^0; sbit D1=temp^1; sbit D2=temp^2; sbit D3=temp^3; sbit D4=temp^4; sbit D5=temp^5; sbit D6=temp^6; sbit D7=temp^7;
unsigned char invertir_byte (unsigned char mr) { D7=mr&0x01; D6=mr&0x02; D5=mr&0x04; D4=mr&0x08; D3=mr&0x10; D2=mr&0x20; D1=mr&0x40; D0=mr&0x80; return (temp); }
void main() { while(1) { P1=invertir_byte(0x33); } }
Program Size: data=10.0 xdata=0 code=59 完成位交换需要 35个时钟周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第五个程序:Jon Ward
##include <reg52.h> unsigned char bdata src; sbit S0=src^0; sbit S1=src^1; sbit S2=src^2; sbit S3=src^3; sbit S4=src^4; sbit S5=src^5; sbit S6=src^6; sbit S7=src^7;
unsigned char bdata dst; sbit D0=dst^0; sbit D1=dst^1; sbit D2=dst^2; sbit D3=dst^3; sbit D4=dst^4; sbit D5=dst^5; sbit D6=dst^6; sbit D7=dst^7;
unsigned char invertir_byte (unsigned char mr) { src=mr; D0=S7; D1=S6; D2=S5; D3=S4; D4=S3; D5=S2; D6=S1; D7=S0; return(dst); }
void main() { while(1) { P1=invertir_byte(0x33); } }
//cost 35 machine cycle
//Program Size: data=11.0 xdata=0 code=61 完成位交换需要 35个时钟周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第六个程序:来自Ourdev论坛的网友
#include <reg52.h> unsigned char invertir_byte (unsigned char val) { unsigned char dat_b ,i; dat_b=0x00; for(i=0;i<=7;i++) { dat_b=dat_b|((val>>i)&0x01); if(i==7)break; dat_b=dat_b<<1; } val=dat_b; return(val); }
void main() { while(1) { P1=invertir_byte(0x33); } }
287 cycle
Program Size: data=9.0 xdata=0 code=57
完成位交换需要 287个时钟周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第七个程序:来自ourdev论坛的网友
#include <reg52.h> unsigned char code tab[16]={0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e, 0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x0f}; unsigned char invertir_byte (unsigned char dat) { dat = tab[(dat & 0xf0)>>4] | (tab[dat & 0x0f]<<4); return dat; }
void main() { wh