PIC 的的 C 语言使用(一)语言使用(一) 在在 MPLAB-IDE 中使用中使用 HitechC 编译器编译器 一、装入编译器: 1、启动 MPLAB-IDE,如下图所示选择 Project-》Install Language Tool一、装入编译器: 1、启动 MPLAB-IDE,如下图所示选择 Project-》Install Language Tool 2、在弹出的安装语言工具对话框里、在弹出的安装语言工具对话框里“Language Suite”选项现在显示的是选项现在显示的是 Microchip,点击后面的箭头 来选择语言点击后面的箭头 来选择语言 我使用的工具是 HI-TECH PICCME,所以选择为“HI-TECH PICC”我使用的工具是 HI-TECH PICCME,所以选择为“HI-TECH PICC” 3、接下来在“Tool Name”里选择编译器组件的调用路径,这里有“PICC Compiler”(C 编译器)、 3、接下来在“Tool Name”里选择编译器组件的调用路径,这里有“PICC Compiler”(C 编译器)、“PICC Assembler”(汇编器)和“PICC Linker”(链接器)3 项都需要设置。
“PICC Assembler”(汇编器)和“PICC Linker”(链接器)3 项都需要设置 用“Browse”来选择调用路径,把上述 3 项组件的调用文件都设为 PICC.EXE点“OK”后完成设 置 用“Browse”来选择调用路径,把上述 3 项组件的调用文件都设为 PICC.EXE点“OK”后完成设 置 二、选用编译器: 1、新建一个项目,编辑项目对话框的“Language Tool Suite”栏目默认是“Microchip”, 它改为“HI-TECH PICC” 2、在项目文件框里点“flasha[.hex]”,这时“Node Properties”(节点属性)按钮将会亮起来点击进入 3、设置节点属性由于 FLASHA.C 还有其他相关连的源程序需要加进来,所以在“Language Tool”栏里应该 择“PICC Linker”(链接器) 通常我们可以选择: 1)Generate debug info:显示 debug 信息; 2)Create map file:选择该项后我们将看到 ROM、RAM 的使用情况; 3)Error file:显示错误信息; 4)Compile for MPLAB ICD:如果不使用 ICD,就不必选择这个项目了。
4、设置完成之后点“Add Node”来添加节点 这个项目有两个节点:fla.c 和 flasha.c,选择节点后点击“Node Properties”或直接双 节点来进入节点属性设置 5、节点文件的工具这时应该选择为“PICC Compiler”(C 编译器) ,蓝色圈子里的 4 项依次是:1)显示 deb 信息;2)局部优化;3)全局优化;4)ICD 编译配件选择优化将使程序代码比较合理,会使资源的使用量相 小一些同样的,如果不是使用 ICD 则第 4 项不应该选上 6、以上都设置完之后即可以进行编译,下图是编译的界面 以下是编译成功的界面:蓝框里是编译成功信息;红框是资源的使用情况显示 第 5 章 PIC16F877 的外围功能模块 第 5 章 PIC16F877 的外围功能模块 5.1.2 简单应用实例 5.1.2 简单应用实例 该例用于令与 PORTD 口相连的 8 个发光二极管前 4 个点亮,后 4 个熄灭在调试程序 前,应使与 PORTD 口相连的 8 位拔码开关拔向相应的位置 例例 5.1 PORTD 输出输出 #include main() { TRISD=0X00; /*TRISD 寄存器被赋值,PORTD 每一位都为输出*/ while(1); /*循环执行点亮发光二极管的语句*/ { PORTD=0XF0; /*向 PORTD 送数据,点亮 LED(由实验模板*/ /*的设计决定相应位置低时 LED 点亮) 。
/ } } 5.2.1 MSSP 模块 SPI 方式功能简介 5.2.1 MSSP 模块 SPI 方式功能简介 下面是一段简单的 SPI 初始化例程,用于利用 SPI 工作方式输出数据的场合 例例 5.2 SPI 初始化程序初始化程序 /*spi 初始化子程序*/ void SPIINIT() { PIR1=0; /*清除 SPI 中断标志*/ SSPCON=0x30; /* SSPEN=1;CKP=0 , FOSC/4 */ SSPSTAT=0xC0; TRISC=0x00; /*SDO 引脚为输出,SCK 引脚为输出*/ } 5.2.3 程序清单 5.2.3 程序清单 下面给出已经在实验板上调试通过的一个程序,可作为用户编制其它程序的参考 #include /*该程序用于在 8 个 LED 上依次显示 1~8 等 8 个字符*/ static volatile int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff}; volatile unsigned char data; #define PORTAIT(adr,bit) ((unsigned)( initial(); /*系统初始化*/ SPIINIT() ; /*SPI 初始化*/ for(i=8;i>0;i--) /*连续发送 8 个数据*/ { data=table[i]; /*通过数组的转换获得待显示的段码*/ SPILED(data); /*发送显示段码显示*/ } PORTA_5=1; /*最后给锁存信号,代表显示任务完成*/ } 5.3.3 程序清单 5.3.3 程序清单 下面给出已经在实验板上调试通过的程序, 可作为用户编制其它程序的参考。
有关 显示部分的 SPI 初始化,请读者参考 5.2 节 #include /*该程序用于按下相应的键时,在第一个 8 段 LED 上显示相应的 1~4 的字符*/ #define PORTAIT(adr,bit) ((unsigned)(;){ printf(“\t\tsend data or receive data: (s or r?)\n\n\n“); c=getchar(); switch(c) { case 's': case 'S': { while(!(inportb(port+5) // SPI 发送或接收数据寄存器 int b[8]; // 发送或接收的数据 int c[8]; // 发送或接收的数据 int i; // 临时变量 int count; // 发送接收计数器 int count1=0; // for test int RecID_H=0; int RecID_L=0; int DLC=8; void SPIINT(); void TMR1INT(); void CCP1INT(); void SPIEXCHANGE(int count); void WAIT_SPI(); void RESET2510(); int RD2510(int adress,int n); void WR2510(int adress,int n); void RTS2510(int RTSn); int GETS2510(); void BM2510(int adress,int mask,int data); void SETNORMAL(); void TXCOMPLETE(int adress); void TXMSG(int DLC); int RXMSG(); void INIT2510(); void INIT877(); void INITSPI(); void ACK(); void wait(); // ========主程序======= main(void) { int l,detect=0; SSPIE=1; TMR1IE=1; CCP1IE=1; CCP2IE=1; PEIE=1; ei(); // 开中断 INIT877(); // 初始化 PIC16F877 芯片 INITSPI(); // 初始化 SPI 接口 INIT2510(); // 初始化 MCP2510 芯片 flag1=0; flag2=0; CCP1CON=0x05; CCP2CON=0x04; while(1) { RXMSG(); TXMSG(8); } } // ========中断服务程序======= // SPI 中断服务子程序 void SPIINT() { SSPIF=0; a[i++]=SSPBUF; // 数据暂存 a[]中 count-=1; if(count>0) SSPBUF=a[i];// 未发送完,继续 else RE2=1; // 否则,片选信号置高电平 return; } // TMR1 中断服务子程序 void TMR1INT() { TMR1IF=0; T1CON=0; if(!flag1){ TMR1H=0xfe; // 512 μs 脉冲宽度 TMR1L=0x00; T1CON=0x01; PORTD=0xff; // 输出所有通道 flag1=1; } else { flag1=0; PORTD=0; T1CON=0; } return; } // CCP1 中断服务子程序 void CCP1INT() { CCP1IF=0; T1CON=0x01; return; } // CCP2 中断服务子程序 void CCP2INT() { CCP2IF=0; T1CON=0x01; return; } // 中断入口,保护现场,判中断类型 void interrupt INTS() { di(); if(TMR1IF) TMR1INT(); // 定时器 TMR1 中断 else if(CCP1IF) CCP1INT(); // 电压过零捕捉中断 1 else if(CCP2IF) CCP2INT(); // 电压过零捕捉中断 2 else if(SSPIF) SPIINT(); // SPI 接口中断 ei(); } // ========子程序======= // 启动 SPI 传送 void SPIEXCHANGE(count) int count; { if(count>0) { // 有数据可送? i=0; RE2=0; // 片选位置低电平 SSPBUF=a[i]; // 送数 } else ; // 否则,空操作,并返回 return; } // 等待 SPI 传送完成 void WAIT_SPI() { do{ ; }while(count>0); // 当 count!=0 时,等待 to add “CLRWDT“ return; } // 对 MCP2510 芯片进行复位 void RESET2510() { a[0]=RESET; count=1; SPIEXCHANGE(count); // 送复位指令 WAIT_SPI(); return; 。