在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(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)閉