吳鑒鷹單片機開發板地址
在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)的第二種方法是最好的,代碼簡潔而且效率最高,但語法有點兒復雜。
-
串口通信
+關注
關注
34文章
1635瀏覽量
56537 -
數模轉換
+關注
關注
3文章
114瀏覽量
29311
原文標題:8位單片機中如何對16位INT型數據進行操作?
文章出處:【微信號:wujianying_danpianji,微信公眾號:單片機精講吳鑒鷹】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
SN65HVS880是不是在CLK的上升沿發送數據出去的?
為什么ADS1x9x在接收到數據后會舍棄高4位和低4位?
AIC23采集到的數據是應該用什么數據類型來接收?int還是unsigned int?
串行口的四種工作方式各有什么特點
如何設置I2S寄存器以接收32位字的24位音頻數據?
SN65LVDS314可編程27位串行至并行接收器數據表

DAC8812雙通道、串行輸入16位乘法數模轉換器數據表

ADS7809 16位10us串行CMOS采樣模數轉換器數據表

使用激光測距傳感器和esp32進行can通信,為什么esp32只能接收到6組數據?
SN74LVC16374 16位邊沿觸發D型觸發器數據表

評論