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
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮