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()是在父 ...
随机推荐
- 解决springmvc拦截器拦截静态资源的两种方式
1.是采用<mvc:default-servlet-handler />,(一般Web应用服务器默认的Servlet名称是"default",所以这里我们激活Tomca ...
- Python 基础之正则之二 匹配分组,正则相关函数及表达式修饰符
四.匹配分组 [元字符] 分组符号 a|b 匹配字符a 或 字符b (如果两个当中有重合部分,把更长的那个放前面) (ab) 匹配括号内的表达式 ,将()作为一个分组 num 引用分组 ...
- SpringBoot 集成Log4j、集成AOP
集成Log4j (1)在pom.xml中添加依赖 <!--去掉springboot默认的日志--> <dependency> <groupId>org.spring ...
- 折腾前端条形码(Barcode)扫描识别, 笔记
barcode @zxing/library 方案 本地勉强把 Demo 在 React 里面跑通, 但是不好控制开始结束, API 不明确.实际识别率很低. 我是用手机屏幕放的条形码, 大概也有影响 ...
- 重新理解业务里程碑----HHR计划----以太一堂第二课
---- 理解业务背后的逻辑,抓住创业重点. 第一课:开始学习 1,FA : financial advisor.财务顾问. 2,本节课的目的:抓住创业的重点. 3,预热思考题: (1) 如果把你的整 ...
- nginx 网络层的优化
TCP三次握手四次挥手 系统层的优化,主动建立连接时的重试次数 net.ipv4.tcp_syn_retries = 6 建立连接时本地端口可用范围:手动可以tiaoz net.ipv4.ip_loc ...
- Java中四种遍历Map对象的方法
方法一:在for-each循环中使用entry来遍历,通过Map.entrySet遍历key和value,这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Int ...
- 树莓派4B踩坑指南 - (2)安装系统及初始化
安装系统及初始化 格式化TF卡:SDFormatter 4.0.如果需要换系统,则必须先烧录进一个空img,然后再格式化! 烧录系统:Win32DiskImager-0.9.5 更改默认密码:账号pi ...
- nodejs中this详解
最近在用Nodejs进行APP运维服务管理系统开发时发现,nodejs中的this经常会变,查了下资料后发现this在不同的代码位置中代表不同的涵义,在实际运用过程中可以用var self = thi ...
- Golang mysql数据库
基本操作: Open() – create a DB Close() - close the DB Query() - 查询 QueryRow() -查询行 Exec() -执行操作,update,i ...