历史上的今天
今天是:2024年11月20日(星期三)
2018年11月20日 | 8位单片机中如何对16位INT型数据进行操作?
2018-11-20 来源:eefocus
在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)的第二种方法是最好的,代码简洁而且效率最高,但语法有点儿复杂。
上一篇:STC单片机程序下载失败问题总结
下一篇:单片机中的一些常见电路
史海拾趣
|
声明:这是别人的帖子,看了颇有感触,故转帖于此。 电子设计中,细节问题往往会导致严重的后果,所以我们一定要注意细节, [教训分享] 一分钱的疏忽造成数万元的损失 小弟去年给外面公司设计了一台智能型阀门伺服控制器,在本地几个小站现场工作都 ...… 查看全部问答> |
|
求助:H桥电路中桥臂直通的问题! 在H桥电路中,即使驱动电路设置了死区,但如果工作频率很快,也会引起H桥的桥臂直通,进而烧坏mos管。请问哪位大侠知道解决的办法,小弟在这里谢了先!… 查看全部问答> |
|
【EEWORLD带你DIY】示波器V2.0信号板及人机界面板打样归来~~ 活动介绍:使用Altera Cyclone III FPGA Stater 进行DIY示波器进程: https://www.eeworld.com.cn/zhuanti/20100703altera/20100703altera.html 信号板及人机界面板打样归来,上图 … 查看全部问答> |
|
一个简单程序(UART),不晓得问题出在那里,请大家帮哈忙! 以下代码是UART0操作:收到上位机的字符然后转送回去。结果是能收到,但是是错误的,如发 01 收到 C0,请大家看看是那里出错了,小弟刚开始用430。 /**************************************************** 说明:串口测试程序 波特率:9600bps ...… 查看全部问答> |
|
对于电子产品来说,印制线路板设计是其从电原理图变成一个具体产品必经的一道设计工序,其设计的合理性与产品生产及产品质量紧密相关,而对于许多刚从事电子设计的人员来说,在这方面经验较少,虽然已学会了印制线路板设计软件,但设计出的印制 ...… 查看全部问答> |




