8051单片机中访问int中字节的方法
在使用单片机中,unsigned int 占2个字节,unsigned char 占一个字节。而单片机是实行的字节寻址。16字节的bit寻址实在是不好用,
不好用在不能建数组。
在实际的开发过程中,要使用DPTR,还有定时器的TL0,TH0 的高低字节等。
需要我们先定义一个int类型的可以用来赋值什么的比较自然。
然后和0xff与得到低8,一个字节。可以放入DPTR的低字节或定时器的低字节。
将int类型的左移8位后,再和0xff与得到int的高8位,一个字节,移入到DPTR的高字节或定时器的高字节。
这样很麻烦。
实际上,我们可以通过struct和union方便的直接一步到位的得到int 类型的高字节和低字节,同时也能观察到51单片机中int类型是如何存储的。
可以发现,在51单片机中int的两个字节是连续的,高字节存放在低地址,低字节存放在高地址。哈哈
具体的实现是:

首先定义一个 INT_BYTE的结构体,里边是两个unsigned char
然后定义一个union 是 一个无符号的int,和上边的定义的两个字节。
我们指导union里的变量间是共享内存的。也就是 num,和 byte 两个变量所在的首地址是相同的!
而 num,byte都是两个字节,那么byte中的两个字节h,l就是对应的num中的高,低字节。
实验验证一下:

我们定义了一个U16的变量hl ,给hl的num给了0xff0f 这个数值。
然后我们给P0口给了低字节,P1口给了高字节。
调试程序,打开端口,运行后:

太好了,很轻松的就得到了int类型的高低8位。当然,把hl变量加入到
watch窗口就更一目了然了!

同样的道理,我们可以实验unsigned long 类型,他占有4个字节。同样高字节在低地址。
这就是小端数据保存,python中struct解析时就有用到啊。记得好像时用 '<','>' 来标识的,
看来学习单片机还能解疑释惑。
最后,我们可以将这个自建为代码库,以提供复用。最后,放上代码:
#include <intrins.h>
#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;
}

8051单片机中访问int中字节的方法的更多相关文章
- 一个解决在非UI线程中访问UI 异常的小方法
写 WPF 的童鞋可能都会碰到 在非UI线程中访问 UI 异常的问题.这是为了防止数据不一致做的安全限制. 子线程中更新UI还要交给主线程更新,引用满天飞,实在是麻烦. 接下来,我们推出一个可以称之为 ...
- ASP.NET内容页中访问母版页中的对象
在ASP.NET2.0开始,提供了母版页的功能.母版页由一个母版页和多个内容页构成.母版页的主要功能是为ASP.NET应用程序中的页面创建相同的布局和界面风格.母版页的使用与普通页面类似,可以在其中放 ...
- 局域网中访问mac中的linux虚拟机服务
然后到虚拟机的linux系统上面执行ifconfig查看linux系统的IP地址,访问这个地址就能访问mac里面的虚拟机
- Android: 在native中访问assets全解析
本文总结在Android Native C++开发中访问APK中的assets资源的方法 在CMake中添加相关NDK LIB的 依赖 因为我们接下来用到的一些函数实现在NDK库libandroid. ...
- 041. asp.net中内容页访问母版页中的控件
母版页运行机制: 用户通过输入内容也的URL来请求某个页面, 获取该页面后, 读取@Page指令, 如果该指令引用了一个母版页, 则也读取该母版页, 如果也是第一次请求这两个页面, 则母版页和被请求的 ...
- 访问 HTML中元素的方法
http://www.w3school.com.cn/jsref/index.asp 1.document.getElementbyId("id1"),Html中,名称是id1 ...
- Ruby中访问控制符public,private,protected区别总结
重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, “private” 意为 “private to this cla ...
- Ajax中解析Json的两种方法
eval(); //此方法不推荐 JSON.parse(); //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: var jsonDate = '{ "name" ...
- iframe里访问父级里的方法属性
window.parent.attributeName; // 访问属性attributeName是在父级窗口的属性名 window.parent.Func(); // 访问属性Func()是在父 ...
随机推荐
- 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程
问题背景 对于 MySQL 的 JOIN,不知道大家有没有去想过他的执行流程,亦或有没有怀疑过自己的理解(自信满满的自我认为!):如果大家不知道怎么检验,可以试着回答如下的问题 驱动表的选择 MySQ ...
- nginx的负载介绍
指定上游服务器的upstream与server指令 指令介绍 Syntax: upstream name { ... } Default: — Context: http Syntax: server ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:设定文本小写
<!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...
- 实用类-<装箱与拆箱>
装箱:把基本数据类型装换为对应的对象类 作用:1.在需要使用对象类型的时候,装换成对应的对象类型(集合里面) 2.转换完成以后,拥有相应的属性和方法,方便咱们的数据操作 拆箱 Integer intO ...
- $.fn.exted({})与$.extend({})区别
$.fn.extend({}) $.fn.extend({ aaa:function(){ alert(1); } }); 可以通过对象调用方法 $('.aaa').aaa(); $.extend({ ...
- Django 执行 manage 命令方式
本人使用的Pycharm作为开发工具,可以在顶部菜单栏的Tools->Run manage.py Task直接打开manager 命令控制台 打开后在底部会有命令窗口: 或者,也可以在Pytho ...
- 设置npm源的几种方式
设置npm源的几种方式 原始源 # the original source https://registry.npmjs.org/ 方案: 使用nrm 安装 npm install -g nrm 列出 ...
- Py西游攻关之基础数据类型(六)-文件操作
Py西游攻关之基础数据类型 - Yuan先生 https://www.cnblogs.com/yuanchenqi/articles/5782764.html 九 文件操作 9.1 对文件操作流程 打 ...
- 一文解读SDN (转)
一. 什么是SDN? SDN字面意思是软件定义网络,其试图摆脱硬件对网络架构的限制,这样便可以像升级.安装软件一样对网络进行修改,便于更多的APP(应用程序)能够快速部署到网络上. 如果把现有的网络看 ...
- 《编写高质量iOS与OS X代码的52个有效方法》书籍目录
一.熟悉Objective-C 1.了解Objective-C语言的起源 2.在类的头文件中尽量少引入其他头文件 3.多用字面量语法,少用与之等价的方法 4.多用类型常量,少用#define预处理指令 ...