×
嵌入式 > 技术百科 > 详情

8位单片机中如何对16位INT型数据进行操作?

发布时间:2020-06-17 发布时间:
|

在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)的第二种方法是最好的,代码简洁而且效率最高,但语法有点儿复杂。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
VR十大误区:眼睛离屏幕太近真的会瞎吗?