新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > KeilC51下的帶進(jìn)位循環(huán)右移指令是什么

        KeilC51下的帶進(jìn)位循環(huán)右移指令是什么

        作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò) 收藏
        一:C語(yǔ)言實(shí)現(xiàn)循環(huán)移位:

        比如將a=0x45循環(huán)左移二位。a循環(huán)左移n位,即將原來(lái)右面(8-n)位左移n位,而將原來(lái)左端的n位移到最右面n位。

        本文引用地址:http://www.104case.com/article/201611/315471.htm

        實(shí)現(xiàn)步驟:

        1、將a的左端n位先放到b中的高n位中
        b=>>(8-n);
        2、將a左移n位,其右面高n位被補(bǔ)0
        c=<3、將b,c進(jìn)行或運(yùn)算
        a=c|b;
        程序如下:
        main()
        {
        unsigned char a=0x45,b,c;
        unsigned int n=2;
        b=a>>8-n)
        c=a< a=c|b;
        }

        二:Keil C言實(shí)現(xiàn)循環(huán)移位

        在KeilC51中有這樣一個(gè)庫(kù),其頭文件為在C51INC目錄下,有以下幾個(gè)操作,它不是函數(shù),但象函數(shù),它們有入口出口,但是,沒(méi)有返回RET語(yǔ)句,如果有這些操作,用disassembly窗口可以看到是將代碼直接嵌入到你的代碼中,其效率很高,比如一個(gè)空操作,_nop_() 嵌入的代碼就是一個(gè)NOP指令。在這個(gè)庫(kù)中,有如下操作:
        unsigned char _chkfloat_(float val) 檢查浮點(diǎn)數(shù)狀態(tài)
        返回值:0: standard floating-point numbers
        1: Floating-point value 0
        2:+INF (positive overflow)
        3:-INF (Not a number) error status
        unsigned char _crol_( //字節(jié)的多次循環(huán)左移
        unsigned char c, //C左移的字符
        unsigned char b);//b左移的位數(shù)
        unsigned char _cror_( //字節(jié)的多次循環(huán)右移
        unsigned char c, //C右移的字符
        unsigned char b);//b右左移的位數(shù)
        unsigned int _irol_ ( //字的循環(huán)左移
        unsigned int c, //c左移的字
        unsigned char b);//b左移的次數(shù)
        unsigned int _iror_ ( //字的循環(huán)右移
        unsigned int c, //c右移的字
        unsigned char b);//b右移的次數(shù)
        unsigned long _lrol_ ( //4字節(jié)(雙字)的循環(huán)左移
        unsigned long c,//c左移的雙字
        unsigned char b);//b左移的次數(shù)
        unsigned long _lror_ ( //4字節(jié)(雙字)的循環(huán)右移
        unsigned long c,//c右移的雙字
        unsigned char b);//b右移的次數(shù)
        void _nop_ (void); //NOP 8051中的空操作
        bit _testbit_ (bit b);//8051中的JBC指令,測(cè)試b,然后清0,返回b的值。

        下面是我自己以前寫(xiě)的東西
        匯編的移位操作很容易 RR RRC RL RLC
        C51中,移出很容易,<< >> ;移入操作中的左移入也容易,困難在右移入
        一:IC讀寫(xiě)應(yīng)用
        1:送數(shù)
        送兩個(gè)單獨(dú)字節(jié)的數(shù)據(jù)的程序,左送 &0x80 右送 &0x01
        bit out;
        out = low & 0x01;
        low >>= 1;
        low |= (high & 0x01)<<7;
        high >>= 1;

        2:取數(shù)(不管怎么移入,第一次操作之后獲取的那一位數(shù)據(jù)必須在接受數(shù)據(jù)的最高位或者最低位上,從而選擇是先取數(shù)還是先移位) a:如果是先接受高位后接受低位 則先左移一位后接受一位數(shù)據(jù)(i2c總線
        uchar i;
        uchar temp = 0;
        uchar date = 0x82;
        for (i = 0; i < 8; i++)
        {
        temp <<= 1; //左移
        temp |= (bit)(date & 0x80);
        date <<= 1;
        }

        b:如果是先接受低位,后接受高位 則先接受一位數(shù)據(jù)后循環(huán)右移一位
        uchar i;
        uchar temp = 0;
        uchar date = 0x82;
        for (i = 0; i < 8; i ++)
        {
        temp |= (bit)(date & 0x01);
        date >>= 1;
        temp = _cror_(temp,1);
        //循環(huán)右移,應(yīng)用_cror_()需要包含頭文件
        }
        如果不用函數(shù)
        則for循環(huán)應(yīng)該這樣寫(xiě)
        for (i = 0; i < 8; i ++)
        {
        temp >>= 1;
        temp |= (date & 0x01) << 7;
        date >>= 1;

        }
        三:任意一位的置位或者取反運(yùn)算
        置位運(yùn)算
        low |= 0x01; (置最低位為1)
        取反運(yùn)算
        low |= ~low & 0x01;
        四:合并和拆分?jǐn)?shù)據(jù)
        1:合并兩個(gè)單字節(jié)數(shù)據(jù)為一個(gè)雙字節(jié)數(shù)據(jù)
        int len;
        uchar low;
        uchar high;
        Len |= high;
        Len <<= 8;
        Len |= low;
        2: 拆分一個(gè)雙字節(jié)數(shù)據(jù)為兩個(gè)單字節(jié)數(shù)據(jù)
        int len;
        uchar low;
        uchar high;
        low |= len;
        high |= len >> 8;



        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 安达市| 临桂县| 阿巴嘎旗| 神农架林区| 安陆市| 林西县| 平陆县| 墨玉县| 四会市| 昆明市| 广西| 四平市| 平阳县| 西峡县| 开阳县| 文山县| 沽源县| 江阴市| 垣曲县| 新民市| 苗栗县| 河池市| 磐安县| 高碑店市| 突泉县| 沐川县| 沂源县| 大名县| 花垣县| 南和县| 噶尔县| 泽州县| 墨脱县| 汽车| 莱阳市| 宜兰市| 香港| 许昌县| 龙州县| 黔江区| 罗甸县|