用C语言写PIC程序比汇编效率高多了,XC8是Microchip官方的C编译器,免费版就够用。但PIC的C语言跟电脑上的C不太一样,有很多跟硬件相关的特殊写法。今天整理几个PIC单片机C语言编程的要点,新手少走弯路。
首先是寄存器操作。PIC的特殊功能寄存器(SFR)在XC8里可以直接当变量用,比如TRISA=0x00就是把A口全部设为输出。操作单个位的话,可以用bit位域,比如TRISAbits.TRISA0=0就是把RA0设为输出。也可以用位操作宏,比如#define LED RA0,然后LED=1。推荐用位域的方式,可读性好。
然后是配置位(Configuration Bits)。PIC的配置位决定了时钟源、看门狗、代码保护这些设置,在程序开头用#pragma config来写。比如#pragma config FOSC=HS就是用高速晶振,#pragma config WDTE=OFF就是关看门狗。这些设置必须写对,不然程序可能跑不起来或者跑飞。新手经常忘了关看门狗,程序跑一会儿就复位,查半天查不到原因。
中断写法是PIC C编程的重点。XC8里中断函数用void interrupt isr(void)声明,放在固定地址。进入中断后先判断是哪个中断源(INTCON寄存器的标志位),处理完要清标志位,不然会反复进中断。比如外部中断:if(INTCONbits.INTF){...处理...INTCONbits.INTF=0;}。注意PIC16只有一个中断入口,所有中断都在同一个函数里处理,要自己判断来源。
还有几个实用技巧。一是用volatile声明全局变量,跟中断共享的变量不加volatile编译器可能优化掉。二是延时函数尽量用定时器,别用空循环,空循环的时间不准。三是操作IO口的时候注意读改写问题,PIC的某些寄存器写的时候是读改写,操作位可能影响其他位,用位域操作可以避免。最后,调试的时候善用MCLR复位和ICD在线调试,比反复烧录快得多。
下一篇:没有了