PIC编程指导文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PIC-CCS编程教程 内部资料
写在扉页
希望尽我的绵薄之力给你一臂之力!
赠言:
生命因抗争而尊贵!
整理:Frankey 2010-5-1
第一部分:综述
相信通过前面单片机课程和智能电子制作二的学习,大家都已经很熟悉51单片机的编程规则和编程环境了,现在我们又将要接触PIC系列单片机的编程和学习,面对新的开发环境和芯片,有些同学觉得这个转换很难,其实一点都不难,大家都要有信心才行,对于每种芯片和其对应的开发环境,大家只要做到把握里面的规律,学起来是不会难的,在下面的学习中我们对PIC系列单片机选用MPLAB软件编写代码,编译器选用CCS编译器,不管是51单片机系统的开发还是PIC系列单片机的开发,其基础全是C语言(或者汇编语言),所不同的是各个编译器拥有不同的数据类型定义和各种特殊的处理器指令以及预处理指令。
1、CCS编译器定义的数据类型
在编写程序之前,我们首先需要了解CCS编译器支持的数据类型:
2、CCS编译器特有的处理器指令以及预处理指令
这一部分大家可以参看CCS_Microchip_PIC.pdf电子文档中的内容得到详细的结果。在CCS_Microchip_PIC书本的第三章对其进行了详细的讲解。
第二部分:IO端口操作
1、IO端口操作常用函数如下表所示:
上表常用的函数的参数具体使用规则可以通过下面两个途径得到:
(1)芯片的头文件(本材料里面采用的芯片为PIC16f883,所以可以在CCS编译器安装路径中找到PIC16f883.h头文件了解)。
(2)通过MPLAB的帮助键调出CCS编译器的帮助文件进行查找了解。
2、有关IO口操作的最简单的例子
利用芯片A口的第1位(即RA0)来控制LED的点亮。PIC单片机晶振为10M。具体代码如下:
#include "16f883.h" //head file
#fuses HS,NOWDT //set pic
#use delay(clock=10000000) //set clock
#use fast_io(A) //set IO
void main(void){ //main function
set_tris_a(0b00000000); //set io direction
output_high(PIN_A0);
while(1){
output_low(PIN_A0); //LED on
delay_ms(500);
output_high(PIN_A0); //LED off
delay_ms(500);
}
}
最简单的例子的分析:
注意:默认情况下CCS编译器是不区分大小写的!
通过该例子大家可以了解掌握最基本的PIC编程格式,熟悉PIC编程的基本流程,CCS 编译器的基本知识以及MPLAB开发环境。
3、上面LED点亮的另一钟实现形式
程序代码:
#include "16f883.h" //head file
#fuses HS,NOWDT //set pic
#use delay(clock=10000000) //set clock
#use fast_io(A) //set IO
#define PORTA 0x5
#define PORTB 0x6
#define PORTC 0x7
#bit LED=PORTA.0
void main(void){ //main function
set_tris_a(0b00000000); //set io direction
LED=1;
while(1){
LED=0; //LED on
delay_ms(500);
LED=1; //LED off
delay_ms(500);
}
}
注意:对PIC单片机来说,一般IO口都是从0x05地址开始依次递增的!
4、IO口操作的扩展----LED流水灯
使用PIC芯片的C口来点亮LED流水灯,LED共阴极。代码如下:
#include "16f883.h" //head file
#fuses HS,NOWDT //set pic
#use delay(clock=10000000) //set clock
#use fast_io(A) //set IO
#define PORTA 0x5
#define PORTB 0x6
#define PORTC 0x7
void main(void){ //main function
int i,led;
set_tris_c(0b00000000); //set io direction
*PORTC=0x00;
while(1){
led=0x01;
for(i=0;i<8;i++){
*PORTC=led; //对led变量取反
delay_ms(500);
led=led<<1;
}
}
}
第三部分:中断处理
1、基础知识
该部分内容具体参见CCS_Microchip_PIC.pdf电子文档中的第三章第7小节的内容,下面给出重点的摘抄内容,
注意上表中的指令应根据具体的芯片型号来定,具体的芯片不同,上面的资源也不同,具体芯片有什么类型的中断,需要查阅对应的头文件。
在CCS 编译器中,中断没有中断向量号,这点和51是不同的,而且各个中断的级别是一样的,没有优先级的分别,同样在编写中断应用程序时,也是需要打开总中断和各自的中