PIC单片机入门_C语言编程技术

2019-04-15 11:35发布

1.为什么也是C语言?

用C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高等,因此C 语言编程在单片机系统设计中越来越广泛的运用。PIC 单片机的软件开发,同样可以用C 语言实现。
Microchip 公司没有自行开发PIC单片机的C 语言编译器,但其他公司有开发众多支持PIC 单片机的C 语言编译器,常见的有Hitech、CCS、IAR、Bytecraft 等公司。其中最常用的是Hitech 公司的PICC 编译器,它稳定可靠,编译生成的代码效率高,在用PIC 单片机开发者中得到广泛认可。
Hitech-PICC 编译器基本上符合ANSI C标准,但是不支持函数的递归调用。其主要原因是因为PIC 单片机特殊的堆栈结构。PIC 单片机的堆栈是硬件实现的,其深度已随芯片固定,无法实现需要大量堆栈操作的递归算法。  成的代码效率高,在用PIC 单片机开发者中得到广泛认可。

2.MpLab中配置PIC C编译环境,并进行项目开发

为便于PICC编译器的编译环境设置,应先在MPLAB IDE集成开发环境下创建一个PICC  C编译器的项目。
1.启动MPLAB IDE7.00集成开发环境窗口。选择集成开发环境中的Project->New菜单项,打开如下所示的新项目对话框,在此对话框中设置项目名和项目路径。
在项目名文本框中输入项目名led,在项目路径文本框中输入项目路径D:led,也可以通过单击Browse按钮选择项目名的保存路径。
2.器件选择,其操作过程如下所示。首先在MPLAB集成开发环境中打开Configure菜单,然后单击Select Device菜单项,弹出如下所示的器件选择对话框。此处可以选择PICl6F877A作为开发芯片。
3.设置项目 在创建项目和选定器件后,接下来就可以设置工程的编译环境。首先进行语言组件的设置。
在Active Toolsuite下拉列表框中选择HI-TECH PICC Toolsuite作为开发工具组件,然后在Toolsuite Contents列表框中选择PICCCompiler项,如下图所示。  

3.PICC基本编程

3.1 PICC 中的基本变量类型

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

3.2 PICC 中的高级变量

基于上表的基本变量,除了bit 型位变量外,PICC 完全支持数组、结构和联合等复合型高级变量,这和标准的C 语言所支持的高级变量类型没有什么区别。例如:
数组: unsigned int data[10]; 结构体: struct commInData { unsigned char inBuff[8]; unsigned char getPtr, putPtr; }; 联合体: union int_Byte { unsigned char c[2]; unsigned int i; };

3.3 PICC 对数据寄存器bank 的管理

在PIC单片机编程时,单片机数据寄存器的bank是由编程员管理的,因此在定义变量时必须决定这些变量具体放在哪一个bank 中缺省时,所定义的变量将被定位在bank0中,例如下面所定义的这些变量: unsigned char buffer[32]; bit flag1,flag2; float val[8]; 以上变量都是分布在bank0 中。定义在其它bank 内的变量前面必须加上相应的bank 序号,例如:
bank1 unsigned char buffer[32]; //变量定位在bank1 中 bank2 bit flag1,flag2; //变量定位在bank2 中 bank3 float val[8]; //变量定位在bank3 中

3.4 volatile 修饰词 

PICC 中还有一个特殊的变量修饰词“volatile”,用来说明一个变量的值是会随机变化的,即使程序没有刻意对它进行任何赋值操作。
在单片机中,作为输入的IO 端口其内容将是随意变化的;很多特殊功能寄存器的值也将随着指令的运行而动态改变。所有这种类型的变量必须将它们明确定义成“volatile”类型,例如:
volatile unsigned char STATUS @ 0x03; volatile bit commFlag;

3.5 标准库函数

PICC 提供了较完整的C 标准库函数支持,其中包括数学运算函数和字符串操作函数。在程序中使用这些现成的库函数时需要注意的是入口参数必须在bank0 中。
如果需要用到数学函数,则用 “#include ” 包含头文件;如果要使用字符串操作函数,就需要包含“#include ”头文件。在这些头文件中提供了函数类型的声明。直接查看这些头文件就可以知道PICC 提供了哪些标准库函数。
C 语言中的格式化输出函数“printf/sprintf”用在单片机的程序中时要特别谨慎。printf/sprintf 是一个非常大的函数,一旦使用,你的程序代码长度就会增加很多。 

4.C和汇编混合编程

用C 语言进行单片机应用程序开发时经常要使用汇编语句。比如,单片机的一些特殊指令操作在标准的C 语言语法中没有直接对应的描述,例如PIC 单片机的清看门狗指令“clrwdt”和休眠指令“sleep”。这样,一个项目中就会出现C 和汇编混合编程的情形,我们在此讨论一些混合编程的基本方法和技巧。
在C 原程序中直接嵌入汇编指令是最直接最容易的方法。如果只需要嵌入少量几条的汇编指令,PICC 提供了一个类似于函数的语句:
asm(“clrwdt”)  ;
双引号中可以编写任何一条PIC 的标准汇编指令。例如:for (;;) { asm("clrwdt"); //清看门狗 asm("sleep"); //休眠 asm(“nop”); //空操作延时 }如果需要编写一段连续的汇编指令,PICC 支持另一种语法描述:用“#asm”开始指令段,用“#endasm”结束。 例如下面的一段嵌入汇编指令实现了将0x20~0x7F 间的RAM 全部清零:
#asm movlw 0x20 movwf _FSR clrf _INDF incf _FSR, f btfss _FSR,7 goto $-3 #endasm