新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 在8位單片機中對16位INT型數據的操作

        在8位單片機中對16位INT型數據的操作

        作者: 時間:2016-11-22 來源:網絡 收藏
        在8位單片機中沒有16位數的操作指令,所有的int型數據都要通過兩個字節分開操作,使用的方法不用,生成的代碼也不相同,當然效率也不一樣,通過指針對16位數進行操作可以得到高效的代碼。

        比如通過串行口接收數據,或者從串行的EEPROM中讀取的數據,或者從大于8位的A/D讀取的數據,由于8位單片機的數據線是8位的,高于8位的數據都要分成兩個字節分別讀取,然后寫入到RAM中去再進行計算,或者把16位的int型數據從RAM中讀出再分別把高低字節存到EEPROM或者送到D/A,或者通過串行口發送出去,方法有很多種,下面用多種方法進行實現該操作,這里只演示寫入到16位的情況,讀取的情況非常相似,不贅述。
        (1)使用聯合 (union)
        typedef union{
        unsigned int i;
        unsigned char c[2];
        }u_int;
        unsigned char dH = 0x11, dL=0x22;
        unsigned int d;
        u_int ud;
        ud.c[0] = dH;
        ud.c[1] = dL;
        d = ud.i;
        此時d = 0x1122;
        (2) 使用移位指令
        數據定義與前面相同
        d = ((unsigned int)dH)<<8 + dL;
        或者
        d = dH;
        d <<= 8; // or: d = d<<8; 但后者編譯的代碼可能不是最簡的
        d |= dL; // or: d = d | dL; 后者編譯的代碼可能不是最簡的
        (3)使用指針
        unsigned char *cptr;
        cptr = (unsigned char*)(&d);
        cptr[0] = dH;
        cptr[1] = dL;
        (4)強制指針類型轉換
        *((unsigned char*)(&d)) = dH;
        *((unsigned char*)(&d)+1) = dL;

        ((unsigned char*)(&d))[0] = dH;
        ((unsigned char*)(&d))[1] = dL;
        這兩種方式看似相同但由Keil編譯出的代碼是不用的,前都有一次加法運算,而后者沒有,后者生成的代碼更簡潔,這種方式與用聯合成生的代碼是完全一樣的,
        在這幾種方法中第(1)與第(4)的第二種生成的代碼是最乘潔的,是推薦使用的,從軟件工程的角度出發,推薦使用方法(1),這樣沒有強制類型轉換,沒有用到指針,更不容易出錯。從書寫的代碼來講,第(4)的第二種方法是最好的,代碼簡潔而且效率最高,但語法有點兒復雜。

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 化州市| 田林县| 镇原县| 神农架林区| 南和县| 卫辉市| 通山县| 沂源县| 蕉岭县| 老河口市| 武隆县| 淳化县| 从江县| 内黄县| 昌邑市| 乡宁县| 张家川| 麟游县| 阳春市| 涿鹿县| 青河县| 乐昌市| 上杭县| 奇台县| 平顶山市| 浦城县| 图木舒克市| 罗甸县| 阿城市| 平原县| 寿阳县| 浏阳市| 鲁甸县| 乐亭县| 南漳县| 上思县| 仁怀市| 盈江县| 澄迈县| 十堰市| 临沭县|