PIC C语言编程_PICC中的变量定义

发布者:自在逍遥最新更新时间:2020-02-24 来源: eefocus关键字:PIC  C语言编程  PICC中  变量定义 手机看文章 扫描二维码
随时随地手机看文章

简介:PIC C语言编程_PICC中的变量定义


1)PICC中的基本变量类型


PICC支持的基本变量类型见表1。PICC遵循Little-endian标准,多字节变量的低字节放在存储空间的低地址,高字节放在高地址。

表1:PICC支持的基本变量类型

表1:PICC支持的基本变量类型


2)PICC中的高级变量


基于表1的基本变量,除了bit型位变量外,PICC完全支持数组、结构和联合等复合型高级变量,这和标准的C语言所支持的高级变量类型没有什么区别。例如:


数组:unsignedintdata[10];


结构:structcommInData{


unsignedcharinBuff[8];


unsignedchargetPtr,putPtr;


};


联合:unionint_Byte{


unsignedcharc[2];


unsignedinti;


};


3)PICC中的局部变量


PICC把所有函数内部定义的auto型局部变量放在bank0。为节约宝贵的存储空间,它采用了一种被叫做“静态覆盖”的技术来实现局部变量的地址分配。其大致的原理是在编译器编译原代码时扫描整个程序中函数调用的嵌套关系和层次,算出每个函数中的局部变量字节数,然后为每个局部变量分配一个固定的地址,且按调用嵌套的层次关系各变量的地址可以相互重叠。利用这一技术后所有的动态局部变量都可以按已知的固定地址地进行直接寻址,用PIC汇编指令实现的效率最高,但这时不能出现函数递归调用。PICC在编译时会严格检查递归调用的问题并认为这是一个严重错误而立即终止编译过程。既然所有的局部变量将占用bank0的存储空间,因此用户自己定位在bank0内的变量字节数将受到一定的限制,在实际使用时需注意。


4)PICC中的位变量


bit型位变量只能是全局的或静态的。PICC将把定位在同一bank内的8个位变量合并成一个字节存放于一个固定地址。因此所有针对位变量的操作将直接使用PIC单片机的位操作汇编指令高效实现。基于此,位变量不能是局部自动型变量,也无法将其组合成复合型高级变量。


PICC对整个数据存储空间实行位编址,0x000单元的第0位是位地址0x0000,以此后推,每个字节有8个位地址。编制位地址的意义纯粹是为了编译器最后产生汇编级位操作指令而用,对编程人员来说基本可以不管。但若能了解位变量的位地址编址方式就可以在最后程序调试时方便地查找自己所定义的位变量,如果一个位变量flag1被编址为0x123,那么实际的存储空间位于:


字节地址=0x123/8 =0x24


位偏移=0x123%8=3


即flag1位变量位于地址为0x24字节的第3位。在程序调试时如果要观察flag1的变化,必须观察地址为0x24的字节而不是0x123。


PIC单片机的位操作指令是非常高效的。因此,PICC在编译原代码时只要有可能,对普通变量的操作也将以最简单的位操作指令来实现。假设一个字节变量tmp最后被定位在地址0x20,那么


tmp|=0x80 =>bsf 0x20,7


tmp&=0xf7 =>bcf 0x20,3


if(tmp&0xfe)=>btfsc0x20,0


即所有只对变量中某一位操作的C语句代码将被直接编译成汇编的位操作指令。虽然编程时可以不用太关心,但如果能了解编译器是如何工作的,那将有助于引导我们写出高效简介的C语言原程序。在有些应用中需要将一组位变量放在同一个字节中以便需要时一次性地进行读写,这一功能可以通过定义一个位域结构和一个字节变量的联合来实现,例如:


union{


struct{


unsignedb0:1;


unsignedb1:1;


unsignedb2:1;


unsignedb3:1;


unsignedb4:1;


unsignedb5:1;


unsigned:2;//最高两位保留


}oneBit;


unsignedcharallBits;


}myFlag;


需要存取其中某一位时可以


myFlag.oneBit.b3=1;//b3位置1


一次性将全部位清零时可以


myFlag.allBits=0;//全部位变量清0


当程序中把非位变量进行强制类型转换成位变量时,要注意编译器只对普通变量的最低位做判别:如果最低位是0,则转换成位变量0;如果最低位是1,则转换成位变量1。而标准的ANSI-C做法是判整个变量值是否为0。另外,函数可以返回一个位变量,实际上此返回的位变量将存放于单片机的进位位中带出返回。

关键字:PIC  C语言编程  PICC中  变量定义 引用地址:PIC C语言编程_PICC中的变量定义

上一篇:PIC单片机C语言编程的基本框架
下一篇:PIC C语言编程_PICC中的指针

推荐阅读最新更新时间:2024-11-05 17:59

PIC18F85J90实现电子血压计设计
  家用电子血压计是典型的家庭医疗检测设备之一,电子式血压计使用简易,可一人独自操作,测量值便于记录,体积轻巧便于携带,越来越受到普通家庭的欢迎。本血压计设计以PIC18F85J90为控制核心辅以气压传感器BP01和用作传感器与MCU之间模拟信号处理的Intersil ISL28413/ISL28196模拟电路以及LCD驱动芯片ZJM12864BSBD、语音提示ISD2560。 电子血压计工作原理   系统框图如图1所示。系统由压力传感器(BP01型压力传感器),恒流源(ISL28413×1),差分放大(ISL28413×3),0.8 Hz二阶高通滤波(ISL28413×1),200倍放大(ISL28413×2),38Hz二阶
[医疗电子]
PIC单片机编译器的问题
如果是编译PIC10、PIC12、PIC16系列单片机,用CCS最好。而PIC18/PIC24/dsPIC/PIC32系列,用MCC最好。 PIC单片机的C编译器只有HI-TECH公司出品PICC编译器,和CCS公司的CCS编译器。还有PIC的生产商Microchip公司自行生产的只针对PIC18/PIC24/dsPIC/PIC32系列单片机的C语言编译器MCC(MCC18 / MCC30 / MCC32)。 IAR软件不能编译PIC的C语言或汇编语言。 要注意的一点是,CCS虽然也是C语言,但因为头文件不同,所以它的程序和PICC,MCC都不一样,三者的程序不能混着编译,比如针对CCS编写的程序只能用CCS的编译器编
[单片机]
PIC8位单片机的分类和特点
    由美国Microchip公司推出的PIC单片机系列产品,首先采用了RISC结构的嵌入式微控制器,其高速度、低电压、低功耗、大电流LCD驱动能力和低价位OTP技术等都体现出单片机产业的新趋势。现在PIC系列单片机在世界单片机市场的份额排名中已逐年升位,尤其在8位单片机市场,据称已从1990年的第20位上升到目前的第二位。PIC单片机从覆盖市场出发,已有三种(又称三层次)系列多种型号的产品问世,所以在全球都可以看到PIC单片机从电脑的外设、家电控制、电讯通信、智能仪器、汽车电子到金融电子各个领域的广泛应用。现今的PIC单片机已经是世界上最有影响力的嵌入式微控制器之一。     PIC 8位单片机的分类     PIC
[单片机]
基于PIC12C508单片机的LED显示电路
   0 引 言   LED显示以其使用方便,价格低廉等优点而得到广泛应用。它的显示接口按驱动方式可分为静态显示和动态显示两种。静态显示虽然亮度高,无闪动,但具有功耗大,占I/O口多,成本高等缺点。在I/O口紧张的情况下大多采用动态显示方式。目前,市场上有许多专用的动态显示接口芯片可供选择。但是,这些芯片价格普遍较高,而不适合在廉价系统中应用。有些专用芯片(如MC14489)采用硬件译码方式,显示的信息量有限,难以满足各种要求,影响了它的应用。在此介绍一种价格低廉,效果良好的LED动态显示电路,通过软件译码,串行显示方式,节省大量I/O线,不仅能显示数字,而且可以显示大部分英文字母。    1 硬件说明及工作原理   主要硬
[单片机]
Microchip加倍LCD PIC18单片机闪存及RAM容量以降低成本
PIC18F85J90系列单片机可提供集成的LCD模块、32 KB闪存及内部电压控制器,瞄准成本敏感的嵌入式显示应用 全球领先的单片机和模拟半导体供应商——Microchip Technology Inc.(美国微芯科技公司)推出6款集成了液晶显示器(LCD)模块的8位PIC单片机系列新产品。PIC18F85J90系列的闪存及RAM存储器容量比现有的64及80引脚系列器件增加了1倍,适用于需要嵌入式控制的高成本效益的人机接口应用,包括恒温器、民用表具及医疗仪器。存储容量的增加有助于用户增加更多诸如语音回放的复杂功能,拥有更多的自编程存储器分配,同时利用3V PIC18 J系列的制造工艺技术节省了成本。 具有片上LCD模块的PI
[单片机]
PIC硬件堆栈与软件堆栈
硬件堆栈:或许也可以称作系统堆栈,是位于片内RAM区。有人说,只要能使用PUSH,POP指令的单片机,都可以说含有硬件堆栈。这样的说法我个人觉得 不是很全面。通过指令进行压栈和出栈操作只是系统堆栈中的一种操做。系统堆栈还可以被隐含调用。例如,当调用子程序时,系统会主动把断点压入堆栈,并不需 要用户通过指令操作。系统堆栈可以用来保存数据,或在任务子程序间传递数据。通常,栈底设在内存的高端,也就是把内存的最高一段空间划作栈区。这些都是向下生长栈。栈指针可能是专用的寄存器,也可能借用一通用寄存器。也有单片机是在数据区里划一块作栈区,可能是向上生长,也可能是向下生长。 软件栈是你自己通过编码实现的。你在内存里划一块作栈区,用一个变量作栈指针
[单片机]
武林教你学PIC32(五)定时器
今天我们用定时器实现LED灯的1s闪烁。 首先我们看看要用的几个库函数: 1 OpenTimer1配置16位定时器函数,函数定义为: void OpenTimer1(unsigned int config,unsigned int period); 参数有: Timer Module On/Off Tx_ON Tx_OFF (These bit fields are mutually exclusive) Asynchronous Timer Write Disable T1_TMWDIS_ON T1_TMWDIS_OFF (These bit fields are mutually exclusive) Timer Module
[单片机]
武林教你学<font color='red'>PIC</font>32(五)定时器
基于PIC16C72单片机的空调控制系统的研制
    摘要: 提出一种基于单片机PIC16C72的热泵式分体壁挂空调控制系统的设计方案。设计出系统硬件结构的主要组成部分电路;简述其工作原理;给出软件设计思想和主控程序软件框图。     关键词: PIC单片机 空调 控制 热泵式分体壁挂空调以其优越的性能,已越来越被广大家庭所选用,其功能更是日新月异,而对其功能的提高起核心作用的其控制系统。本文介绍一种基于PIC16C72控制的空调控制系统设计方法。 该系统具有制冷、制热、除湿、自动4种工作模式,包括定时、睡眠、风向、智能化霜、应急运转、试运转以及5种可调室内风速等控制功能;在定时开机时,可根据访间温度作智能判断,自动调整定时开机时间,避免开机时太冷或太
[应用]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved