PICC_C语言基础和特点

上传人:油条 文档编号:24874152 上传时间:2017-12-08 格式:PPT 页数:114 大小:1.16MB
返回 下载 相关 举报
PICC_C语言基础和特点_第1页
第1页 / 共114页
PICC_C语言基础和特点_第2页
第2页 / 共114页
PICC_C语言基础和特点_第3页
第3页 / 共114页
PICC_C语言基础和特点_第4页
第4页 / 共114页
PICC_C语言基础和特点_第5页
第5页 / 共114页
点击查看更多>>
资源描述

《PICC_C语言基础和特点》由会员分享,可在线阅读,更多相关《PICC_C语言基础和特点(114页珍藏版)》请在金锄头文库上搜索。

1、第二章,PICC C语言基础和特点,基于 PICC 编译环境编写 PIC 单片机C程序的基本方式和标准 C 程序类似,程序一般由以下几个主要部分组成:在程序的最前面用#include 预处理指令引用包含头文件,其中必须包含一个编译器提供的“pic.h”文件,实现单片机内特殊寄存器和其它特殊符号的声明;,2.1 PIC单片机的C语言源程序基本框架,用“_ _CONFIG”预处理指令定义芯片的配置位;声明本模块内被调用的所有函数的类型,PICC 将对所调用的函数进行严格的类型匹配检查; 定义全局变量或符号替换; 实现函数(子程序),特别注意 main 函数必须是一个没有返回的死循环。,下面的例子为

2、一个C源程序的范例:#include/包含单片机内部资源预定义#include “pc68.h” /包含自定义头文件_ _CONFIG (HS /定义芯片工作时的配置位,void SetSFR(void); void Clock(void); void KeyScan(void); void Measure(void); void LCD_Test(void); void LCD_Disp(unsigned char);/声明本模块中所调用的函数类型,unsigned char second, minute, hour; bit flag1,flag2; /定义变量 void main(voi

3、d) /函数和子程序SetSFR( ); PORTC = 0x00; TMR1H += TMR1H_CONST; LED1 = LED_OFF; LCD_Test( );,while(1) asm(“clrwdt”); /清看门狗 Clock(); /更新时钟 KeyScan(); /扫描键盘 Measure(); /数据测量 SetSFR(); /刷新特殊功能寄存器 / /程序工作主循环,注意:PICC不支持C+,这对于习惯了C+的同学还得翻翻C 语言的书。我们在源程序一开始使用了“#include”实现了相关单片机的一些预定义符号的直接引用,但没有具体指明是哪一个型号。,实际上,“pic.

4、h”头文件是很多头文件的集合,是一个简单的管理工具(条件判别),它会按照MPLAB-IDE所选择的特定型号的单片机,把真正对应的头文件包含进来。也就是说:C 编译器在pic.h 中根据你的芯片自动载入相应的其它头文件,这点比汇编好用。,调用真正头文件,调用真正头文件,头文件用记事本打开,载入的头文件中其实是声明芯片的寄存器和一些函数,摘抄一个片段:例如:static volatile unsigned char TMR0 0x01;static volatile unsigned char PCL 0x02;static volatile unsigned char STATUS 0x03;,

5、可以看出和汇编的头文件中定义寄存器是差不多的。如下:TMR0 EQU 0X01;PCL EQU 0X02;STATUS EQU 0X03;都是把无聊的地址定义为大家公认的名字。,2.2.1 PICC 中的基本变量类型 PICC编辑器支持基本的1,2及4B数据。所有多字节数据遵循Little-endian标准,多字节变量的低字节放在存储空间的低地址,高字节放在高地址下表中列出了PICC支持的数据类型及对应的大小和数学表达:,2.2 PICC中的变量定义,Little-endian和Big-endian是表示计算机字节顺序的两种格式。简单的说,Little-endian把低字节存放在内存的低位;而

6、Big-endian将低字节存放在内存的高位。现在主流的CPU,Intel系列的是采用的Little-endian的格式存放数据,而Motorola系列的CPU采用的是Big-endian。,表21 PICC 的基本变量类型,2.2.2 PICC 中的高级变量 基于表2-1的基本变量,除了bit型位变量外,PICC 完全支持数组、结构和联合等复合型高级变量,这和标准的C语言所支持的高级变量类型没有什么区别。例如:联合:union int_Byte unsigned char c2; unsigned int i; ;,数组:unsigned int data10;结构:struct commI

7、nData unsigned char inBuff8; unsigned char getPtr, putPtr; ;,为了使编译器产生最高效的机器码,PICC把单片机中数据寄存器的bank问题交由编程员自己管理,因此在定义用户变量时你必须自己决定这些变量具体放在哪一个bank中。,2.2.3 PICC对数据寄存器bank的管理,如果没有特别指明,所定义的变量将被定位在bank0,例如下面所定义的这些变量:unsigned char buffer32;bit flag1,flag2; float val8;,除了bank0内的变量声明时不需特殊处理外,定义在其它bank内的变量前面必须加上相

8、应的bank序号,例如:bank1 unsigned char buffer32; /变量定位在bank1中bank2 bit flag1,flag2;/变量定位在bank2中bank3 bit float val8;/变量定位在bank3中,注意事项:中档系列PIC单片机数据寄存器的一个bank大小为128字节,刨去前面若干字节的特殊功能寄存器区域,在C语言中某一bank内定义的变量字节总数不能超过可用RAM字节数。如果超过bank容量,在最后链接时会报错,大致信息如下:,Error000 : Cant find 0x12C words for psect rbss_1 in segment

9、 BANK1 链接器告诉你总共有0x12C(300)个字节准备放到bank1中但bank1容量不够。显然,只有把一部分原本定位在bank1中的变量改放到其它bank中才能解决此问题。,虽然变量所在的bank定位必须由编程员自己决定,但在编写源程序时进行变量存取操作前无需再特意编写设定bank的指令,C编译器会根据所操作的对象自动生成对应bank设定的汇编指令;为避免频繁的bank切换以提高代码效率,尽量把实现同一任务的变量定位在同一个bank内;,数据寄存器怎么附值?如对 TMR0 附值,汇编中:MOVLW 200;MOVWF TMR0;当然得保证当前bank在0或2,不然会出错(如在bank

10、1或3)。,C语言中:TMR0=200;无论在任何bank都不会出错,可以看出来C是很直接了当的。并且最大好处是操作一个寄存器时候,不用考虑bank的问题,一切由C编译器自动完成。,2.2.4 PICC 中的局部变量PICC把所有函数内部定义的auto型局部变量放在bank0。为节约宝贵的存储空间,它采用了一种被叫做“静态覆盖”的技术来实现局部变量的地址分配。,其大致的原理是:在编译器编译源代码时扫描整个程序中函数调用的嵌套关系和层次,算出每个函数中的局部变量字节数;然后为每个局部变量分配一个固定的地址,且按调用嵌套的层次关系各变量的地址可以相互重叠。,利用这一技术后所有的动态局部变量都可以按

11、已知的固定地址进行直接寻址,但这时不能出现函数递归调用。PICC在编译时会严格检查递归调用问题并认为这是一个严重错误而立即终止编译过程。所有的局部变量将占用bank0的存储空间,因此用户自己定位在bank0内的变量字节数将受到一定的限制,在实际使用时需注意。,2.2.5 PICC中的位变量 bit型位变量只能是全局的或静态的。PICC将把定位在同一bank内的8个位变量合并成一个字节存放于一个固定地址。PIC单片机的位操作指令是非常高效的。因此,PICC在编译源代码时只要有可能,对普通变量的操作也将以最简单的位操作指令来实现。,假设一个字节变量tmp最后被定位在地址 0x20,那么:tmp=0

12、x80 =bsf 0x20,7tmp &=0xf7 =bcf 0x20,3if(tmp&0x01) =btfsc 0x20,0,通过以上内容可以看出,所有只对变量中某一位操作的C语句代码将被直接编译成汇编的位操作指令。虽然编程时可以不用太关心,但如果能了解编译器是如何工作的,那将有助于引导我们写出高效简洁的C语言源程序。,另外,在有些应用中需要将一组位变量放在同一个字节中以便需要时一次性地进行读写,这一功能可以通过定义一个位域结构和一个字节变量的联合来实现,例如:,union struct unsigned b0: 1; unsigned b1: 1; unsigned b2: 1; unsi

13、gned b3: 1; unsigned b4: 1; unsigned b5: 1; unsigned : 2; /最高两位保留 oneBit; unsigned char allBits; myFlag;,需要存取其中某一位时可以:myFlag.oneBit.b3=1; /b3 位置 1一次性将全部位清零时可以 :myFlag.allBits=0; /全部位变量清 0,如何进行位操作?汇编中的位操作是很容易的。在PICC中更简单。C的头文件中已经对所有可能需要位操作的寄存器的每一位都有定义名称:如:PORTA的每一个I/O口定义为:RA0、RA1、RA2、RA3、RA4、RA5 、RA6

14、、RA7 。,可以对其直接进行运算和附值。如:RA0=0;RA2=1;在汇编中是:BCF PORTA,0;BSF PORTA,2;可以看出两者是大同小异的,只是C中不需要考虑bank的问题。,PICC中描述浮点数是以IEEE-754标准格式实现的。此标准下定义的浮点数为 32位长,在单片机中要用4个字节存储。为了节约单片机的数据空间和程序空间,PICC专门提供了一种长度为24位的截短型浮点数,它损失了浮点数的一点精度,但浮点运算的效率得以提高。,2.2.6 PICC中的浮点数,在程序中定义的float型标准浮点数的长度固定为24位,双精度double型浮点数一般也是24位长,但可以在程序编译选

15、项中选择double型浮点数为32位,以提高计算的精度。一般控制系统中关心的是单片机的运行效率,因此在精度能够满足的前提下尽量选择24 位的浮点数运算。,首先必须强调,在用C语言写程序时变量一般由编译器和链接器最后定位,在写程序之时无需知道所定义的变量具体被放在哪个地址;除了bank必须声明,真正需要绝对定位的只是单片机中那些特殊功能寄存器;,2.2.7 PICC 中变量的绝对定位,而这些寄存器的地址定位在PICC编译环境所提供的头文件中已经实现,无需用户操心。编程员所要了解的只是PICC是如何定义这些特殊功能寄存器和其中的相关控制位的名称。,好在PICC的定义标准基本上按照芯片的数据手册中的名称描述进行,这样就秉承了变量命名的一贯性。一个变量绝对定位的例子如下:unsigned char tmpData 0x20; /tmpData定位在地址0x20,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号