PIC 程序定位与关键字
PICC是不可以对程序或数据绝对定位的,但是编译器有命令行选项来让编译器绝对避开某些区域。
例1
避开的方法是,在Build options窗口中的PICC Compiler和PICC Linker的命令行选项中加入:
--ROM=0-XXX
例如,要避开16F877程序末尾的512个字,可以
--ROM=0-1E00
当然,还可以避开程序中间的某个区域,具体请参看PICC Maunal里的--ROM命令行说明。
例2
在MPLAB IDE中,从菜单中选择Project->Build Options...->Project,在PICC-18 Linker页标下的Specify offset for ROM(ROM代码偏移量)中输入偏移量XXX(注意这里输入的已经是16进制了,不用在转换)。
重新编译,然后在View->Program Memory就可以看到你的程序已经定位在XXX起始的地址上了.
中断函数的关键字
interrupt
变量和指针定义的关键字
volatile,bank0~3
persistent 非初始化变量
ROM中比个定义
const
EEPROM操作
__EEPROM_DATA(0x12, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
eeprom unsigned int serial_number = 0x1234; //34 12
EEPROM_WRITE(address,value);
value = EEPROM_READ(address);
ID
__IDLOC(1234);
config
__CONFIG(XT&UNPROTECT&PWRTEN&BOREN&WDTEN&MCLRDIS);
时钟修正
在 build Options / Global / runtime option中
Use OSCCAL选择,如果选择,就不必再程序中调用
OSCCSL=_READ_OSCCAL_DATA();
volatile、persistent 和 const 修饰词的位置含义
volatile、persistent 和 const 这些关键词出现在前后不同位置上的含义规律是和 bank 一词相一致的。
例如:
定义指向 bank0/1 易变型字符变量的指针,指针变量位于 bank0 中且自身为非易变型
volatile unsigned char *ptr0;
定义指向 bank2/3 非易变型字符变量的指针,指针变量位于 bank1 中且自身为易变型
bank2 unsigned char * volatile bank1 ptr0;
定义指向 ROM 区的指针,指针变量本身也是存放于 ROM 区的常数
const unsigned char * const ptr0;
常用内部函数
CLRWDT(); 清WDT
NOP(); NOP
ei(); 开中断
di(); 关中断
SLEEP(); sleep
#define bitset(var,bitno) ((var) |= IUL << (bitno))
bitset(var,bitno)描述: var和bitno为bitset输入,
((var) |= IUL << (bitno))描述: IUL 左移动 bitno次后的结果 或上 var,然后赋值给var
#define bitclr(var,bitno) ((var) &= ~(IUL <<(bitno)))
bitclr(var,bitno)描述: var和bitno为bitset输入,
((var) &= ~(IUL <<(bitno))) 描述: IUL 左移动 bitno次后的结果 取反后,再与 var,最后赋值给var
#define bitset(var,bitno) ((var) |= 1 << (bitno)) 寄存器var的bitno位置1.
#define bitclr(var,bitno) ((var) &= ~(1<<(bitno))) 寄存器var的bitno位清0. |