在8位單片機(jī)中沒(méi)有16位數(shù)的操作指令,所有的int型數(shù)據(jù)都要通過(guò)兩個(gè)字節(jié)分開(kāi)操作,使用的方法不用,生成的代碼也不相同,當(dāng)然效率也不一樣,通過(guò)指針對(duì)16位數(shù)進(jìn)行操作可以得到高效的代碼。
比如通過(guò)串行口接收數(shù)據(jù),或者從串行的EEPROM中讀取的數(shù)據(jù),或者從大于8位的A/D讀取的數(shù)據(jù),由于8位單片機(jī)的數(shù)據(jù)線是8位的,高于8位的數(shù)據(jù)都要分成兩個(gè)字節(jié)分別讀取,然后寫(xiě)入到RAM中去再進(jìn)行計(jì)算,或者把16位的int型數(shù)據(jù)從RAM中讀出再分別把高低字節(jié)存到EEPROM或者送到D/A,或者通過(guò)串行口發(fā)送出去,方法有很多種,下面用多種方法進(jìn)行實(shí)現(xiàn)該操作,這里只演示寫(xiě)入到16位的情況,讀取的情況非常相似,不贅述。
(1)使用聯(lián)合 (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;此時(shí)d = 0x1122;
(2) 使用移位指令
數(shù)據(jù)定義與前面相同d = ((unsigned int)dH) 或者d = dH;d d |= dL; // or: d = d | dL; 后者編譯的代碼可能不是最簡(jiǎn)的
(3)使用指針
unsigned char *cptr;cptr = (unsigned char*)(&d);cptr[0] = dH;cptr[1] = dL;
(4)強(qiáng)制指針類(lèi)型轉(zhuǎn)換
*((unsigned char*)(&d)) = dH;*((unsigned char*)(&d)+1) = dL;或((unsigned char*)(&d))[0] = dH;((unsigned char*)(&d))[1] = dL;
這兩種方式看似相同但由Keil編譯出的代碼是不用的,前都有一次加法運(yùn)算,而后者沒(méi)有,后者生成的代碼更簡(jiǎn)潔,這種方式與用聯(lián)合成生的代碼是完全一樣的。
在這幾種方法中第(1)與第(4)的第二種生成的代碼是最乘潔的,是推薦使用的,從軟件工程的角度出發(fā),推薦使用方法(1),這樣沒(méi)有強(qiáng)制類(lèi)型轉(zhuǎn)換,沒(méi)有用到指針,更不容易出錯(cuò)。從書(shū)寫(xiě)的代碼來(lái)講,第(4)的第二種方法是最好的,代碼簡(jiǎn)潔而且效率最高,但語(yǔ)法有點(diǎn)兒復(fù)雜。
-
單片機(jī)
+關(guān)注
關(guān)注
6076文章
45495瀏覽量
670376 -
串行接口
+關(guān)注
關(guān)注
3文章
520瀏覽量
45228 -
數(shù)據(jù)轉(zhuǎn)換
+關(guān)注
關(guān)注
0文章
101瀏覽量
18517 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
71853
原文標(biāo)題:8位單片機(jī)操作16位INT型數(shù)據(jù)的方法你想到了幾種?
文章出處:【微信號(hào):Mouser-Community,微信公眾號(hào):貿(mào)澤電子設(shè)計(jì)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
單片機(jī)位數(shù)的思考(8位、16位、32位)
51單片機(jī)編寫(xiě)的6位數(shù)顯頻率計(jì)數(shù)器
如何在KEIL單片機(jī)編程環(huán)境下實(shí)現(xiàn)隨機(jī)的6位數(shù)驗(yàn)證碼?
對(duì)單片機(jī)IO口進(jìn)行位定義
基于單片機(jī)的單通道16位數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)
[轉(zhuǎn)載]Freescalenbsp;16位單片機(jī)…
16位單片機(jī)有哪些
89C51單片機(jī)16位數(shù)據(jù)傳送指令的執(zhí)行過(guò)程
使用51單片機(jī)把4位16進(jìn)制數(shù)轉(zhuǎn)成10進(jìn)制數(shù)的方法和程序免費(fèi)下載
如何使用8位單片機(jī)對(duì)16位INT型數(shù)據(jù)進(jìn)行操作
單片機(jī)開(kāi)發(fā)小程序
8位、16位、32位單片機(jī)中的“XX位”指什么?
8位、16位、32位單片機(jī)(MCU)
單片機(jī)開(kāi)發(fā)設(shè)計(jì),如何通過(guò)指針對(duì)16位數(shù)進(jìn)行操作
評(píng)論