色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

          PICC編程的位操作示例程序

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


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

          評論


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

          關(guān)閉