在使用單片機中,unsigned int 占2個字節(jié),unsigned char 占一個字節(jié)。而單片機是實行的字節(jié)尋址。16字節(jié)的bit尋址實在是不好用,
不好用在不能建數(shù)組。
在實際的開發(fā)過程中,要使用DPTR,還有定時器的TL0,TH0 的高低字節(jié)等。
需要我們先定義一個int類型的可以用來賦值什么的比較自然。
然后和0xff與得到低8,一個字節(jié)。可以放入DPTR的低字節(jié)或定時器的低字節(jié)。
將int類型的左移8位后,再和0xff與得到int的高8位,一個字節(jié),移入到DPTR的高字節(jié)或定時器的高字節(jié)。
這樣很麻煩。
實際上,我們可以通過struct和union方便的直接一步到位的得到int 類型的高字節(jié)和低字節(jié),同時也能觀察到51單片機中int類型是如何存儲的。
可以發(fā)現(xiàn),在51單片機中int的兩個字節(jié)是連續(xù)的,高字節(jié)存放在低地址,低字節(jié)存放在高地址。哈哈
具體的實現(xiàn)是:

首先定義一個 INT_BYTE的結構體,里邊是兩個unsigned char
然后定義一個union 是 一個無符號的int,和上邊的定義的兩個字節(jié)。
我們指導union里的變量間是共享內存的。也就是 num,和 byte 兩個變量所在的首地址是相同的!
而 num,byte都是兩個字節(jié),那么byte中的兩個字節(jié)h,l就是對應的num中的高,低字節(jié)。
實驗驗證一下:

我們定義了一個U16的變量hl ,給hl的num給了0xff0f 這個數(shù)值。
然后我們給P0口給了低字節(jié),P1口給了高字節(jié)。
調試程序,打開端口,運行后:

太好了,很輕松的就得到了int類型的高低8位。當然,把hl變量加入到
watch窗口就更一目了然了!

同樣的道理,我們可以實驗unsigned long 類型,他占有4個字節(jié)。同樣高字節(jié)在低地址。
這就是小端數(shù)據(jù)保存,python中struct解析時就有用到啊。記得好像時用 '<','>' 來標識的,
看來學習單片機還能解疑釋惑。
最后,我們可以將這個自建為代碼庫,以提供復用。最后,放上代碼:
#include#include "stc89.h" /* This code is written by H.W. at 12969722 at qq.com */ struct INT_BYTE { unsigned char h; unsigned char l; }; typedef union UINT16 { unsigned int num; struct INT_BYTE byte; } U16; struct BYTE_BIT { unsigned char a1; unsigned char a2; unsigned char a3; unsigned char a4; }; typedef union UBYTE { unsigned long byte; struct BYTE_BIT b; } U8; void main(void){ U16 hl; U8 ubit; hl.num=0xff0f; P0=hl.byte.l; P1=hl.byte.h; ubit.byte=0xf0f1f2f3; }
電子發(fā)燒友App












評論