下面的示例应用程序将使得与PIC18C452 单片机PORTB 端口相连的LED 闪烁。编译
此应用程序的命令行是:
mcc18 -p 18c452 -I c:\mcc18\h leds.c
c:\mcc18 是安装编译器的目录。这个示例应用程序设计为与PICDEM 2 演示板配合
使用。示例程序包括:
1. 中断处理(#pragma interruptlow、中断向量、中断服务程序和现场保护)
2. 系统头文件
3. 针对处理器的头文件
4. #pragma sectiontype
5. 行内汇编
/* 1 */ #include
/* 2 */ #include
/* 3 */
/* 4 */ #define NUMBER_OF_LEDS 8
/* 5 */
/* 6 */ void timer_isr (void);
/* 7 */
/* 8 */ static unsigned char s_count = 0;
/* 9 */
/* 10 */ #pragma code low_vector=0x18
/* 11 */ void low_interrupt (void)
/* 12 */ {
/* 13 */ _asm GOTO timer_isr _endasm
/* 14 */ }
/* 15 */
/* 16 */ #pragma code
/* 17 */
/* 18 */ #pragma interruptlow timer_isr save=PROD
/* 19 */ void
/* 20 */ timer_isr (void)
/* 21 */ {
/* 22 */ static unsigned char led_display = 0;
/* 23 */
/* 24 */ INTCONbits.TMR0IF = 0;
/* 25 */
/* 26 */ s_count = s_count % (NUMBER_OF_LEDS + 1);
/* 27 */
/* 28 */ led_display = (1 << s_count++) - 1;
/* 29 */
/* 30 */ PORTB = led_display;
/* 31 */ }
/* 32 */
/* 33 */ void
/* 34 */ main (void)
/* 35 */ {
/* 36 */ TRISB = 0;
/* 37 */ PORTB = 0;
/* 38 */
/* 39 */ OpenTimer0 (TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT);
/* 40 */ INTCONbits.GIE = 1;
/* 41 */
/* 42 */ while (1)
/* 43 */ {
/* 44 */ }
/* 45 */ }
第 1 行:这一行包含了一般处理器头文件。通过命令行选项-p 选择正确的处理
器(参阅2.5.1 节“系统头文件”和2.10 节“针对处理器的头文
件”)。
第10 行:对于PIC18 单片机来说,低优先级中断向量位于000000018h。这行
代码将当前代码段从默认代码段更改为地址为0x18 处, 名为
low_vector 的绝对代码段(参阅2.9.1 节“#pragma
sectiontype”和2.9.2.3 节“中断向量”)。
第13 行:此行包含行内汇编,其功能是跳转到中断服务程序(参阅2.8.2 节“行内汇编”和2.9.2.3 节“中断向量”)。
第16 行:此行使编译器返回到默认的代码段(参阅2.9.1 节“#pragma sectiontype”和表2-7)。
第18 行:此行将函数timer_isr 声明为低优先级中断服务程序。为了使编译器为函数timer_isr 生成RETFIE 指令而不是RETURN 指令,上述声
明是必需的。另外,它还能确保特殊功能寄存器PROD 的值得到保存。
(2.9.2 节“#pragma interruptlow fname / #pragma
interrupt fname”和2.9.2.4 节“中断现场保护”)。
第19-20 行:这两行定义了函数timer_isr。请注意:timer_isr 没有参数,也没有返回值(这是中断服务程序的要求)(请参阅2.9.2.2 节“中断
服务程序”)。
第24 行:清除TMR0 的中断标志,以避免程序多次处理同一个中断(参阅2.10 节“针对处理器的头文件”)。
第30 行:示范如何在C 程序中修改特殊功能寄存器PORTB (参阅2.10 节“针
对处理器的头文件”)。
第36-37 行:初始化特殊功能寄存器TRISB 和PORTB (参阅2.10 节“针对处理器
的头文件”)。
第39 行:允许TMR0 中断,把定时器设置为内部16 位时钟。
第40 行:允许全局中断(参阅2.10 节“针对处理器的头文件”)。