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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PICC編程的位操作示例程序

          PICC編程的位操作示例程序

          作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
          由于PIC 處理器對(duì)位操作是最高效的,所以把一些BOOL 變量放在一個(gè)內(nèi)存的位中,既可以達(dá)到運(yùn)算 速度快,又可以達(dá)到最大限度節(jié)省空間的目的。在C 中的位操作有多種選擇。
          *********************************************
          如:char x;x=x|0B00001000; /*對(duì)X 的4 位置1。*/
          char x;x=x&0B11011111; /*對(duì)X 的5 位清0。*/
          把上面的變成公式則是:
          #define bitset(var,bitno)(var |=1<#define bitclr(var,bitno)(var &=~(1<則上面的操作就是:char x;bitset(x,4)
          char x;bitclr(x,5)
          *************************************************但上述的方法有缺點(diǎn),就是對(duì)每一位的含義不直觀,最好是能在代碼中能直觀看出每一位代表的意思,這樣就能提高編程效率,避免出錯(cuò)。如果我們想用X 的0-2 位分別表示溫度、電壓、電流的BOOL 值可以如下:
          unsigned char x @ 0x20; /*象匯編那樣把X 變量定義到一個(gè)固定內(nèi)存中。*/
          bit temperature@ (unsigned)&x*8+0; /*溫度*/
          bit voltage@ (unsigned)&x*8+1; /*電壓*/
          bit current@ (unsigned)&x*8+2; /*電流*/
          這樣定義后X 的位就有一個(gè)形象化的名字,不再是枯燥的1、2、3、4 等數(shù)字了??梢詫?duì)X 全局修改,也可以對(duì)每一位進(jìn)行操作:
          char=255;
          temperature=0;
          if(voltage)......
          *****************************************************************
          還有一個(gè)方法是用C 的struct 結(jié)構(gòu)來定義:
          如:
          struct cypok{
          temperature:1; /*溫度*/
          voltage:1; /*電壓*/
          current:1; /*電流*/
          none:4;
          }x @ 0x20;
          這樣就可以用
          x.temperature=0;
          if(x.current)....
          等操作了。
          **********************************************************上面的方法在一些簡(jiǎn)單的設(shè)計(jì)中很有效,但對(duì)于復(fù)雜的設(shè)計(jì)中就比較吃力。如象在多路工業(yè)控制上。前端需要分別收集多路的多路信號(hào),然后再設(shè)定控制多路的多路輸出。如:有2 路控制,每一路的前端信號(hào)有溫度、電壓、電流。后端控制有電機(jī)、喇叭、繼電器、LED。如果用匯編來實(shí)現(xiàn)的話,是很頭疼的事情,用C 來實(shí)現(xiàn)是很輕松的事情,這里也涉及到一點(diǎn)C 的內(nèi)存管理(其實(shí)C 的最大優(yōu)點(diǎn)就是內(nèi)存管理)。采用如下結(jié)構(gòu):
          union cypok{
          struct out{
          motor:1; /*電機(jī)*/
          relay:1; /*繼電器*/
          speaker:1; /*喇叭*/
          led1:1; /*指示燈*/
          led2:1; /*指示燈*/
          }out;
          struct in{
          none:5;
          temperature:1; /*溫度*/
          voltage:1; /*電壓*/
          current:1; /*電流*/
          }in;
          char x;
          };
          union cypok an1;
          union cypok an2;
          上面的結(jié)構(gòu)有什么好處呢?
          細(xì)分了信號(hào)的路an1 和an2;
          細(xì)分了每一路的信號(hào)的類型(是前端信號(hào)in 還是后端信號(hào)out):
          an1.in ;
          an1.out;
          an2.in;
          an2.out;
          然后又細(xì)分了每一路信號(hào)的具體含義,如:
          an1.in.temperature;
          an1.out.motor;
          an2.in.voltage;
          an2.out.led2;等
          這樣的結(jié)構(gòu)很直觀的在2 個(gè)內(nèi)存中就表示了2 路信號(hào)。并且可以極其方便的擴(kuò)充。如添加更多路的信號(hào),只需要添加:
          union cypok an3;
          union cypok an4;
          從上面就可以看出用C 的巨大好處一:用位操作來做一些標(biāo)志位,也就是BOOL變量.可以簡(jiǎn)單如下定義:
          bit a,b,c;
          PICC會(huì)自動(dòng)安排一個(gè)內(nèi)存,并在此內(nèi)存中自動(dòng)安排一位來對(duì)應(yīng)a,b,c.由于我們只是用它們來簡(jiǎn)單的 表示一些0,1信息,所以我們不需要詳細(xì)的知道它們的地址\位究竟是多少,只管拿來就用好了.
          二:要是需要用一個(gè)地址固定的變量來位操作,可以參照PIC.H里面定義寄存器.
          如:用25H內(nèi)存來定義8?jìng)€(gè)位變量.
          static volatile unsigned char myvar @ 0x25;
          static volatile bit b7 @ (unsigned)&myvar*8+7;
          static volatile bit b6 @ (unsigned)&myvar*8+6;
          static volatile bit b5 @ (unsigned)&myvar*8+5;
          static volatile bit b4 @ (unsigned)&myvar*8+4;
          static volatile bit b3 @ (unsigned)&myvar*8+3;
          static volatile bit b2 @ (unsigned)&myvar*8+2;
          static volatile bit b1 @ (unsigned)&myvar*8+1;
          static volatile bit b0 @ (unsigned)&myvar*8+0;
          這樣即可以對(duì)MYVAR操作,也可以對(duì)B0--B7直接位操作.但不好的是,此招在低檔片子,如C5X系列上可能會(huì)出問題.還有就是表達(dá)起來復(fù)雜,你不覺得輸入代碼受累么?呵呵
          三:這也是一些常用手法:
          #define testbit(var, bit) ((var) & (1 <<(bit))) //測(cè)試某一位,可以做BOOL運(yùn)算
          #define setbit(var, bit) ((var) |= (1 << (bit))) //把某一位置1
          #define clrbit(var, bit) ((var) &= ~(1 << (bit))) //把某一位清0
          付上一段代碼,可以用MPLAB調(diào)試觀察
          #include
          #define testbit(var, bit) ((var) & (1 <<(bit)))
          #define setbit(var, bit) ((var) |= (1 << (bit)))
          #define clrbit(var, bit) ((var) &= ~(1 << (bit)))
          char a,b;
          void main(){
          char myvar;
          myvar=0B10101010;
          a=testbit(myvar,0);
          setbit(myvar,0);
          a=testbit(myvar,0);
          clrbit(myvar,5);
          b=testbit(myvar,5);
          if(!testbit(myvar,3))
          a=255;
          else
          a=100;
          while(1){;}
          }
          四:用標(biāo)準(zhǔn)C的共用體來表示:
          #include
          union var{
          unsigned char byte;
          struct {
          unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
          } bits;
          };
          char a,b;
          void main(){
          static union var myvar;
          myvar.byte=0B10101010;
          a=myvar.bits.b0;
          b=myvar.bits.b1;
          if(myvar.bits.b7)
          a=255;
          else
          a=100;
          while(1){;}
          }
          五:用指針轉(zhuǎn)換來表示:
          #include
          typedef struct {
          unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
          } bits; //先定義一個(gè)變量的位
          #define mybit0 (((bits *)&myvar)->b0) //取myvar 的地址(&myvar)強(qiáng)制轉(zhuǎn)換成bits 類型的指針
          #define mybit1 (((bits *)&myvar)->b1)
          #define mybit2 (((bits *)&myvar)->b2)
          #define mybit3 (((bits *)&myvar)->b3)
          #define mybit4 (((bits *)&myvar)->b4)
          #define mybit5 (((bits *)&myvar)->b5)
          #define mybit6 (((bits *)&myvar)->b6)
          #define mybit7 (((bits *)&myvar)->b7)
          char myvar;
          char a,b;
          void main(){
          myvar=0B10101010;
          a=mybit0;
          b=mybit1;
          if(mybit7)
          a=255;
          else
          a=100;
          while(1){;}
          }
          六:五的方法還是煩瑣,可以用粘貼符號(hào)的形式來簡(jiǎn)化它.
          #include
          typedef struct {
          unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
          } bits;
          #define _paste(a,b) a##b
          #define bitof(var,num) (((bits *)&(var))->_paste(b,num))
          char myvar;
          char a,b;
          void main(){
          a=bitof(myvar,0);
          b=bitof(myvar,1);
          if(bitof(myvar,7))
          a=255;
          else
          a=100;
          while(1){;}
          }
          有必要說說#define _paste(a,b) a##b 的意思:
          此語句是粘貼符號(hào)的意思,表示把b 符號(hào)粘貼到a 符號(hào)之后.
          例子中是
          a=bitof(myvar,0);--->(((bits *)&(myvar))->_paste(b,0))--->(((bits *)&(var))->b0)可以看出來,_paste(b,0)的作用是把0 粘貼到了b 后面,成了b0 符號(hào).
          總結(jié):C語言的優(yōu)勢(shì)是能直接對(duì)低層硬件操作,代碼可以非常非常接近匯編,上面幾個(gè)例子的位操作代碼是100%的達(dá)到匯編的程度的.另一個(gè)優(yōu)勢(shì)是可讀性高,代碼靈活.上面的幾個(gè)位操作方法任由你選,你不必?fù)?dān)心會(huì)產(chǎn)生多余的代碼量出來.


          關(guān)鍵詞: PICC編程的位操

          評(píng)論


          技術(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); })();