Delay() Delay

{ ;此行可加开关中断指令

/*此行可加开关中断指令*/ movlw.10

for (i=0; i《=10; i ) movwf Counter

SLEEP(); Loop1

} Sleep

decfsz Counter

goto Loop1

return

2 注意INTCON中的RBIF位

INTCON中的各中断允许位对中断状态位并无影响。当PORT B配置成输入方式时,RB《7:4》引脚输入在每个读操作周期被抽样并与旧的锁存值比较,一旦不同就产生一个高电平,置RBIF=1。在开 RB中断前,也许RBIF已置“1”,所以在开RB中断时应先清RBIF位,以免受RBIF原值的影响,同时在中断处理完成后最好是清RBIF位。

3 用Mplab-C高级语言写PIC单片机程序时要注意的问题

3.1 程序中嵌入汇编指令时注意书写格式 见例3。

例3

…………

while(1) {#asmwhile(1) {

…… #asm /*应另起一行*/

#endasm ……

}/*不能正确编译*/ #endasm

…… }/*编译通过*/

……

当内嵌汇编指令时,从“#asm”到“endasm”每条指令都必须各占一行,否则编译时会出错。

3.2 加法、乘法的最安全的表示方法 见例4。

例4

#include《16c71.h》

#include《math.h》

unsigned int a, b;

unsigned long c;

void main()

{ a=200;

b=2;

c=a*b;

} /*得不到正确的结果c=400*/

原因是Mplab-C以8×8乘法方式来编译c=a*b,返回单字节结果给c,结果的溢出被忽略。改上例中的“c=a*b;”表达式为“c=a;c=c*b;”,最为安全(对加法的处理同上)。

3.3 了解乘除法函数对寄存器的占用

由于PIC片内RAM仅几十个字节,空间特别宝贵,而Mplab-C编译器对RAM地址具有不释放性,即一个变量使用的地址不能再分配给其它变量。如 RAM空间不能满足太多变量的要求,一些变量只能由用户强制分配相同的RAM空间交替使用。而Mplab-C中的乘除法函数需借用RAM空间来存放中间结果,所以如果乘除法函数占用的RAM与用户变量的地址重叠时,就会导致出现不可预测的结果。如果C程序中用到乘除法运算,最好先通过程序机器码的反汇编代码(包含在生成的LST文件中)查看乘除法占用地址是否与其它变量地址有冲突,以免程序跑飞。Mplab-C手册并没有给出其乘除法函数对具体RAM地址的占用情况。例5是乘法函数对0×13、0×14、0×19、0×1A地址占用情况。

部分反汇编代码

#include 《pic16c71》01A7081FMOVF 1F,W

#include《math.h》01A80093MOVWF 13

;借用

unsigned long Value @0x101A90820MOVF 20,W

char Xm @0x2d;01AA0094MOVWF 14

;借用

void main()01AB082DMOVF 2D,W