久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

序效率大比拼,位翻轉程序

作者:佚名   來源:本站原創   點擊數:  更新時間:2010年05月19日   【字體:

   在單片機控制程序中,往往會用到位翻轉程序,例如點陣的控制,圖形的處理,FFT運算等。那么,在C語言中如何才能寫出高效率的程序呢?今日在keil的論壇中看到有網友提及這個程序,又在ourdev論壇搜索了一下,將老外寫的,網友寫的,我自己寫的程序做了一個全方位的測試,結果如下所示:

    首先是老外的程序:

    作者:Concepcion Marco Valero

#include <reg52.h>
unsigned char mr;
unsigned char invertir_byte (mr) {
  mr = (mr & 0x0F) << 4 | (mr & 0xF0) >> 4;
  mr = (mr & 0x33) << 2 | (mr & 0xCC) >> 2;
  mr = (mr & 0x55) << 1 | (mr & 0xAA) >> 1;
  return (mr);
}

void main()
{
while(1)
  {
  P1=invertir_byte(0x33);
  }
}

Program Size: data=10.0 xdata=0 code=123
完成位交換需要 121 個時鐘周期。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

第二個程序:我寫的

#include <reg52.h>
unsigned char mr;

unsigned char invertir_byte (mr) {
unsigned char temp;
if(mr&0x80){temp=temp|0x01;}
if(mr&0x40){temp=temp|0x02;}
if(mr&0x20){temp=temp|0x04;}
if(mr&0x10){temp=temp|0x08;}
if(mr&0x08){temp=temp|0x10;}
if(mr&0x04){temp=temp|0x20;}
if(mr&0x02){temp=temp|0x40;}
if(mr&0x01){temp=temp|0x80;}
return (temp);

}

void main()
{
while(1)
  {
  P1=invertir_byte(0x33);
  }
}

Program Size: data=10.0 xdata=0 code=85
完成位交換需要 42 個時鐘周期。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


 

第三個程序:還是我寫的

 

#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()
{
while(1)
  {
  P1=invertir_byte(0x33);
  }
}

//cost 26 machine cycle
//Program Size: data=9.0 xdata=0 code=63

完成位交換需要 26 個時鐘周期

 

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

第八個程序:來自ourdev網友

#include<AT89X51.H> 
unsigned char byte_bit_swap(unsigned char a)
{
a = ((a & 0x0F) << 4) | ((a & 0xF0) >> 4);  
a = ((a << 2) & 0xcc) | ((a>> 2) & 0x33);  
a = ((a << 1) & 0xaa) | ((a>> 1) & 0x55); 
return(a);
}
void main(void) 

while(1)
  {
  P1=byte_bit_swap(0x33); 
  }
}

Program Size: data=9.0 xdata=0 code=66
完成位交換需要 37 個時鐘周期

關閉窗口

相關文章

主站蜘蛛池模板: 91久久久久久 | 操操日| 国产一级片免费在线观看 | 一区二区三区免费网站 | 精品久久久久久国产 | 欧美日韩精品专区 | 免费能直接在线观看黄的视频 | 亚洲成人黄色 | 久久只有精品 | 久草热播| 久久夜夜| 久久精品欧美一区二区三区不卡 | 中文字幕一区二区三区在线观看 | 国产一级在线观看 | 欧美电影免费观看高清 | 中文av在线播放 | 在线视频日韩 | 国产人成精品一区二区三 | 精品免费国产一区二区三区四区介绍 | 美女中文字幕视频 | 免费国产一区二区视频 | 黄色a三级| 国产一区免费 | 日韩在线不卡视频 | 亚洲欧美自拍偷拍视频 | 四虎最新视频 | 国产精品美女久久久 | 免费一级欧美在线观看视频 | 中国三级黄色录像 | 日韩一级精品视频在线观看 | 国产美女视频黄a视频免费 国产精品福利视频 | 精品国产一区二区三区久久影院 | 中文字幕成人av | 色婷婷综合久久久中字幕精品久久 | 中文字幕高清av | 人干人人 | 国产精品高清在线 | 亚洲福利| 欧美一级二级三级视频 | 一级毛片视频 | 欧美一卡二卡在线观看 |