文档库 最新最全的文档下载
当前位置:文档库 › 关于pic18f4550的c语言编程实例

关于pic18f4550的c语言编程实例

关于pic18f4550的c语言编程实例
关于pic18f4550的c语言编程实例

下面的示例应用程序将使得与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 节“针对处理器的头文件”)。

相关文档