描述

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

打开APP精彩内容

点击阅读全文

max7456 C语言,如何使用8位单片机对16位INT型数据进行操作相关推荐

  1. 什么是32位单片机?32位单片机有哪些优点和缺点?8位,16位,32位是什么区别?

    一.什么是32位单片机 单片机有8位单片机.16位单片机.32位单片机等多种,这里位指的是数据处理一次能的够处理的数据的位宽,32位单片机,就是指一次能够处理的数据的位宽是32个比特位的单片机.简单地 ...

  2. 32位单片机 一个32位地址代表一个字节而不是4个字节(32位)

    在数据手册上,BSRR的偏移地址为0X18,然后手册讲完BSRR后直接讲LCKR了,并且LCKR的偏移地址是 OX1C .所以根据 OX1C-0X18=0X04 就知道BSRR是32位寄存器了.因为一 ...

  3. c语言编程TLC2543AD采集,51单片机驱动12位AD转换TLC2543电路图+程序

    51单片机驱动12位AD转换TLC2543电路图+程序 2015-06-18 16:51:15   来源:51hei void resultvolt() { volt=volt*5000.0/4334 ...

  4. C语言合并8位数据为16位数据

    uint8_t a uint8_t b uint16_t c c=a*256+b C语言:8位.16位.32位数据转换

  5. YX133具有12位ADC与16位PWM的8位OTP单片机,SOP和QFN小封装单片机适合电子烟等便携产品使用

    1.1 产品描述 YX133 是一款以OTP程序为基础的8位微处理器,集成高精准度的8(6+2)通道12位的ADC(VREFHmin=1V),6个8位PWM(或3个16位PWM)生成器,1个硬件比较器 ...

  6. C语言:8位数据、16位数据、32位数据相互之间如何合并和拆分?

    一.将两个8位数据合并成一个16位数据. 一个8位数据不管往左移还是往右移,移完后还是8位.所以从一开始要把这个8位的数定义为16位的数. unsigned  short int a: unsigne ...

  7. 24位AD和16位DA超高精度PID串级控制器在张力控制中的应用

    摘要:针对目前张力控制器中普遍存在测量控制精度较差和无法实现串级控制这类高级复杂控制的问题,本文介绍了具有超高精度和多功能的新一代张力控制器.这种新一代张力控制器具有24位AD模数转换.16位DA数模 ...

  8. java pcm16位_Java – 将16位带符号的pcm音频数据数组转换为双数组

    我正在从事涉及音频处理的项目. 我从一个文件中取出一段音频,然后想对它进行一些处理.问题是我将音频数据作为字节数组,而我的处理是在双数组上(稍后在复杂数组上--). 我的问题是,如何正确地将我收到的字 ...

  9. 24位RGB转16位RGB原理

    有许多朋友第一次使用16位彩色显示屏会遇到如何将24位RGB颜色转换为对应的16位RGB颜色的问题,通过查阅相关资料,就写一下其中的转换原理吧,希望对大家会有所帮助. 我们知道24位RGB是分别由8位 ...

最新文章

  1. Ubuntu上使终端显示Git分支(oh-my-zsh)
  2. ctags: 提示错误ctags: unrecognized option '--format=2'
  3. mysql单用户赋予多库权限
  4. 不是开发者也能玩得high!科大讯飞1024开发者节,看AI如何改变你的生活
  5. Win64 驱动内核编程-31.枚举与删除映像回调
  6. Java线程详解(7)-线程的调度
  7. 苹果7手机html5测试,HTML5 基础测试题
  8. python中0、1、True、False、if条件
  9. Spark中如何管理Spark Streaming消费Kafka的偏移量
  10. ES6 类继承 和 super的使用
  11. tensorflow版PSENet 文本检测模型训练和测试
  12. 2.9.PHP7.1 狐教程-【控制语句 循环】
  13. 文件的创建、删除、移动和查找
  14. LANP+KEEPALIVED集群(一)
  15. dell服务器型号t310,Dell T110/R210/T310/R310服务器 For Windows驱动程序
  16. 【备忘录】浏览器不能上网但是微信能收到消息的一个解决办法
  17. java string.concat_Java String concat() 使用方法及示例
  18. python在程序中模拟键盘鼠标操作
  19. android 地铁地图api,百度地铁图JS API使用
  20. Lua Profiler——快速定位Lua性能问题

热门文章

  1. java接入支付宝支付api
  2. 根据经纬度定位百度地图(带图片的)
  3. Huffman树(哈夫曼树)
  4. 让研发团队找准市场需求
  5. Unity 彩色打印日志信息
  6. oracle+omf+格式,oracle omf
  7. 【Unity3D小技巧】Unity3D中Animation和Animator动画的播放、暂停、倒放控制
  8. 从各大APP年度报告看用户画像——标签,比你更懂你自己
  9. 云服务器Linux 安装SVN
  10. html页面发送微信朋友圈,【源码分享】分享一个基于官方share.html简化的分享js代码(微信,朋友圈,QQ)...