历史上的今天
返回首页

历史上的今天

今天是:2025年03月14日(星期五)

正在发生

2020年03月14日 | PIC头文件——寄存器位地址定义代码解析

2020-03-14 来源:eefocus

编译工具:MPLAB X IDE v4.15


单片机型号:PIC16F1938


MPLAB开发环境中,包含各种PIC系列单片机的头文件,我在理解头文件中关于寄存器位地址定义时绕了些弯路,所以特意写出来加强记忆。


以LATA寄存器为例:在pic16f1938.h头文件中,关于LATA寄存器的定义如下


// Register: LATA

volatile unsigned char           LATA                @ 0x10C;

// bit and bitfield definitions

volatile bit LATA0               @ ((unsigned)&LATA*8)+0;

volatile bit LATA1               @ ((unsigned)&LATA*8)+1;

volatile bit LATA2               @ ((unsigned)&LATA*8)+2;

volatile bit LATA3               @ ((unsigned)&LATA*8)+3;

volatile bit LATA4               @ ((unsigned)&LATA*8)+4;

volatile bit LATA5               @ ((unsigned)&LATA*8)+5;

volatile bit LATA6               @ ((unsigned)&LATA*8)+6;

volatile bit LATA7               @ ((unsigned)&LATA*8)+7;


一、代码解析

1. “@”符号

    在很多嵌入式编译环境中,"@"符号表示“将符号左边的变量钳制在符号右边的地址” 。


    C语言中本来是没有“@”符号的,但在MPLAB编译环境里,“@”相当于汇编中的“EQU”伪指令,即


    C语言代码:


    LATA @ 0x10C   


    等价于汇编指令:


    LATA    EQU    0x10C


    用自然语言表述,就是:char型变量LATA的值,存放在字节地址为“0x10C”的内存空间。 


2. “LATA0   @ ((unsigned)&LATA*8)+0”语句

    ① 在C语言中,“unsigned”是“unsigned int”的简写, 在这句代码中的作用是强制类型转换,即:将“&LATA*8”的结果强制类型转换为无符号整型;


    ② “&LATA*8”语句,由于取地址符“&”的优先级高于乘号“*”,所以这句代码的意思是:取LATA的地址“0x10C”,并将这个值乘以8。从二进制角度来看,就是将“00 0001 0000 1100”左移3位。(其中的二进制数,是由“0x10C”转换而来,由于PIC16F1938的地址总线宽度是14位的,所以该二进制数只能有14位。) 左移之后,结果是“00 1000 0110 0000”(0x860);


    于是,“((unsigned)&LATA*8)+0”语句的运算结果就是“0x860”。


    用自然语言表述该语句的执行结果:bit型变量LATA0的值,存放在位地址为“0x860”的内存空间。


二、验证

    接下来,就该验证一下LATA0的位地址是不是“0x860”了。


    既然已经知道了LATA寄存器的字节地址是0x10C,那只要计算一下它的位地址就好:


        十六进制(0x10C)—> 十进制(268)


        十进制(268 × 8 = 2144) —> 十六进制(0x860)


    即LATA0的位地址是“0x860”,和代码的执行结果一致。


至此,位地址定义代码解析结束,重点是要了解位地址的计算方法。

推荐阅读

史海拾趣

Advanced_Linear_Devices_Inc.公司的发展小趣事

随着全球市场的不断扩大,ALD积极推进国际化战略。公司通过与全球各地的OEM制造商建立合作关系,将产品销往世界各地。同时,ALD还积极参与国际电子展会和论坛,展示其最新技术和产品,与全球同行交流合作。这些举措不仅提升了ALD的国际知名度,还为公司带来了更多的商机和发展空间。

Crocus Technology公司的发展小趣事

近年来,随着电流传感需求的持续增长和应用场景的不断拓展,市场对精确、经济高效的电流传感器的需求日益显著。Crocus Technology敏锐地捕捉到了这一市场趋势,并成功推出了TMR电流传感平台。这一平台凭借其高性能、低成本的优势,迅速获得了市场的认可和客户的青睐。

博众电气(BOZHONG ELECTRIC)公司的发展小趣事

博众电气自创立之初,就明确了自己的市场定位和发展方向。作为一家致力于成为一站式电子物料供应企业的公司,博众电气从一开始就注重技术研发和产品质量。公司创始人凭借对电子行业的深刻理解和敏锐的市场洞察力,为博众电气奠定了坚实的基础。

在初创期,博众电气通过引进国内外先进的生产设备和检测设备,不断提升产品的性能和质量。同时,公司还注重与国内外知名同行的技术交流和协作,积极吸收和借鉴先进的生产和管理经验。这些举措使得博众电气在激烈的市场竞争中逐渐脱颖而出。

Hexawave公司的发展小趣事

随着企业实力的不断增强和产品质量的不断提升,博众电气开始积极寻求市场扩张的机会。公司凭借优质的产品和服务,成功开拓了多个国内外市场,并与众多知名企业建立了长期稳定的合作关系。

同时,博众电气还注重品牌建设和推广。公司积极参与各类行业展会和论坛,展示公司的最新产品和技术成果;还通过广告宣传、社交媒体等多种渠道提升品牌知名度和影响力。这些举措使得博众电气的品牌形象和市场地位得到了进一步提升。

以上只是博众电气在电子行业发展的几个可能的关键阶段和事实的概括性描述。实际上,博众电气的发展历程可能远比这复杂和丰富。作为一家在电子行业中崭露头角的企业,博众电气未来的发展值得期待。

A1 PROS公司的发展小趣事

在竞争激烈的电子行业中,A1 PROS始终保持对技术创新的追求。公司不断投入研发资金,引进先进的生产设备和技术人才,致力于开发更高性能、更环保、更节能的产品。同时,A1 PROS还积极关注行业动态和市场需求变化,不断调整和优化产品结构和市场策略。正是凭借这种持续创新的精神和对市场变化的敏锐洞察,A1 PROS得以在电子行业中保持领先地位,并引领着行业的发展方向。

以上便是关于A1 PROS公司在电子行业里发展起来的五个故事。这些故事展示了A1 PROS从初创期的黑白CCD业务起步,到成功研发彩色CCD传感器、获得技术认可、拓展国际市场以及持续创新引领行业发展的全过程。虽然这些故事是基于虚构的,但它们反映了电子行业发展的一般规律和趋势,也展现了A1 PROS作为一家优秀电子企业在行业中的成长轨迹和贡献。

ARCOL公司的发展小趣事

品质是ARCOL公司的核心竞争力。公司始终坚持以质量为核心,建立了严格的质量管理体系。从原材料的采购到产品的出厂,每一个环节都经过严格把关,确保产品的质量和性能达到最高标准。同时,ARCOL还注重品牌建设,通过不断提升产品质量和服务水平,树立了良好的企业形象和口碑。

问答坊 | AI 解惑

dsp2812电机驱动与控制

翼志工作室  致力于交直流电机驱动与控制 网址:www.wingzstudio.net YZ-2812 DSP电机控制开发系统本系统系统专为交流电机控制,高性能数字运动控制系统(DMC)和逆变电源而设计。整套DSP电机控制开发系统由YZ-2812-Ctrl板(DSP数 ...…

查看全部问答>

lcd显示发现字在点击后变模糊

我的硬件平台: cpu arm9200, 2m 现存,外扩的1355 lcd 控制器, 触摸屏 软件: linux 2.4.27 + minigui 1.3 我启动了minigui的应用程序,这个界面上有按钮和文字,当我点击文字的时候,发现文字会变模糊,敲击越多越明显,这是怎么回事啊,是驱 ...…

查看全部问答>

请问在索尼爱立信这种手机开发外企都干些什么工作啊?

如题,不知道在手机开发外企都作什么,是否有技术含量。和赛门铁克比哪个公司更好呢? 谢谢大侠们的指点…

查看全部问答>

ARM常用汇编指令集使用手册

上传一本ARM指令集的简介,供大家学习使用......…

查看全部问答>

【低功耗】关于Xilinx Spartan-3E FPGA开发资料---持续更新

正巧碰上活动,把关于Xilinx Spartan-3E FPGA低功耗和非低功耗的资料都奉献上来!~第一季:petalinux-v0.40-final…

查看全部问答>

转行了出些芯片电子料件

不做电子了,手头上有不少芯片以及电子相关的料件,整理了部分: 1. AD623BR SOP8 数量25 价格10/PCS 2.CS4345 10-pin, 24-Bit, 192 kHz Stereo D/A Converter 数量2209 价格1/PCS 3.UTC 78L05L SOP8数量20 整出价格10 4.ON 78L05A SOP8数量180 ...…

查看全部问答>

Zstack中End Device设备失去父节点时的重新入网处理方法

Zstack中End Device设备失去父节点时的重新入网处理方法(By kennan,2012.8.12)在TI的Zstack协议栈中,End Device(ED)在失去父节点的时候就不会重新入网了,那么我们该如何处理才能够让ED重新入网呢?我所能想到的办法有以下几种:1、 入网之后,通 ...…

查看全部问答>

定时器A捕获脉冲求助

使用P2.1口捕获脉冲,算的的数值一直不对,帮忙看看哪里出问题了,非常感谢 #include \"msp430g2553.h\" #include \"LQ12864.h\" #include \"math.h\" unsigned char S1=0,S2=0; int dis=0; unsigned int i,n=0; long int en0,overflow, nu ...…

查看全部问答>

收个能跑linux的开发板

帮小白收一个,目标是各位手上放着长期吃灰的开发板,屏可以不要,价格控制在200左右,所以可能一些比较老的ARM9、ARM11开发板比较合适,Cortex-Ax也可以,但价格抬不起来太多,各位有意向可以来报个价…

查看全部问答>