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()是在父 ...
随机推荐
- Linux查看当前系统32位还是64位
getconf LONG_BIT 此方法会直接返回32或64
- 01背包第k最优解
附题目链接:Bone Collector II Input The first line contain a integer T , the number of cases.Followed by T ...
- PAT T1008 Airline Routes
用tarjan算法缩点~ #include<bits/stdc++.h> using namespace std; ; vector<int> g[maxn]; int N,M ...
- AI基础概念
基础概念 epoch:使用训练的全部数据对模型进行一次完整的训练,被成为“一代训练”.当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次epoch.(也就是说,所有训练样本在神经网络 ...
- 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数
Scala高级特性 1. 课程目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- 从七牛服务下载PDF文件
/** * 从七牛下载PDF文件 * @param request * @param response * @param exhiId * @throws MalformedURLException ...
- C++11通过拷贝构造器拷贝const字段(待解决)
问题梗概如标题所述. 在今天实现Token类的时候,遇到的问题. 我希望将Token类设定为immutable属性的,这样实现的方式是将这个类内的所有字段均设置为const型,同时每个字段均为publ ...
- Ubuntu18.04-MySQL8.0-表名大小写敏感-远程连接
1.卸载 停止服务 sudo service mysql stop 删除mysql服务 sudo apt-get remove mysql-server 删除其他组件 sudo apt-get aut ...
- js图片瀑布流效果
要实现图片瀑布流效果,首先得准备几张图片. html的部分比较简单就是将图片加载到浏览器就可以了 代码如下(注意放的图片多一点要不然之后无法滑动鼠标就无法达到瀑布流效果): <!DOCTYPE ...
- Codeforces1301D
其实感觉这道题在D简单了(但我都没做到这一题,路径最多的方式只有一种,将所有的边都走一遍,从第一行开始,向右走到头,然后向左回来,向下一格,向右走到头,然后上下左重复直到第一列,如此重复直到最后一行, ...