<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 序效率大比拼,位翻轉(zhuǎn)程序

          序效率大比拼,位翻轉(zhuǎn)程序

          作者: 時間:2012-10-24 來源:網(wǎng)絡(luò) 收藏

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

          首先是老外的程序:

          作者: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(mr0x80){temp=temp|0x01;}
          if(mr0x40){temp=temp|0x02;}
          if(mr0x20){temp=temp|0x04;}
          if(mr0x10){temp=temp|0x08;}
          if(mr0x08){temp=temp|0x10;}
          if(mr0x04){temp=temp|0x20;}
          if(mr0x02){temp=temp|0x40;}
          if(mr0x01){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=mr0x01;
          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=mr0x01;
          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=mr0x01;
          D6=mr0x02;
          D5=mr0x04;
          D4=mr0x08;
          D3=mr0x10;
          D2=mr0x20;
          D1=mr0x40;
          D0=mr0x80;
          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個時鐘周期

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

          第六個程序:來自O(shè)urdev論壇的網(wǎng)友

          #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_b1;
          }
          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論壇的網(wǎng)友

          #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網(wǎng)友

          #includeAT89X51.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 個時鐘周期



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();