RP1:RP0=10选择2块(地址100H~17FH)。
RP1:RP0=11选择3块(地址180H~1FFH)。
每块128个字节,PIC16C84只使用RP0位,RP1编程时设置为0。不允许使用RP1为通用读/写位,这可能影响与将来产品的兼容性。IRP寄存器块选择位(作为间接寻址),当这一位设置为0,选择 0.1块(地址00H~FFH),当这一位为1时,选择2.3块(地址100H~1FFH)。PIC16C84不使用IRP位,IRP位在编程时为0。状态寄存器中的Z、DC,C位是根据器件的逻辑来置1或清0。而TO,PD位是不可写入的。状态寄存器作为目的寄存器的指令的结果将有不同的内容。例如CLRF STATUS(清0状态寄存器)。结果状态寄存器的内容为000uuluu。其中u表示不改变。只有BCF,BSF,SWAPF和MOVW F这些指令可以用来改变STATUS寄存器的内容,因为这几条指令不影响任何状态位。
②OPTION寄存器
OPTION寄存器是可读,可写的寄存器,它包含了各种控制位以配 置TMRO/WDT的预分频器,外部INT中断,TMRO和在PORTB的微弱上拉。图4-5是OPTION寄存器各位的功能。 R/W R/W R/W R/W R/W R/W R/ W R/W
RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 bit7 bit0
其中PS2,PS1,PS0为预分频器的值的选择。(与PIC16C6X的规定 相同)。PSA位是将预分频器分配给WDT(看门狗计时器,或TMR0)。
TOSE是为TMRO选择跳变信号
INTEDG是为INT中断引脚选择跳变信号。
RBPU用来打开或关闭PORTB内部的上拉电阻。
OPTION的所有位的定义同PIC16C6X系列。
③INTCON寄存器
INTCON是可读可写的寄存器,它包含了各中断源允许或禁止中断 。图4-6是PIC16C84的INTCON寄存器
R/W R/W R/W R/W R/W R/W R/W R/W
GIE EEIE TOIE INTE RBIF TOIF INTIF RB IF bit7 bit0
其中RBIF是RB端口改变中断标志位。此位为1,表明RB<7:4>输入中至少有一位发生了改变,它必须用软件清0这一位。否则为0,即 RB<7:4>输入中没有改变。 ? ? ? ? ? INTIF是外部中断标志位。当这一位为1时,表明有外部中断发生 ,它必须用软件将其清0,否则为0,表明没有外部中断发生。
TOIF是TMRO溢出中断标志。这一位为1,表明TMRO发生了溢出,必须由软件将这一位清0,否则为0,表明TMRO没有溢出发生
RBIE是RB端口改变中断的允许或禁止位,设置此位为1,允许中断,为0禁止。
INTE是INT中断的允许或禁止位。设置为1允许中断方式,为0禁止 。
TOIE为TMRO溢出中断的允许或禁止位。设置为1允许TMRO溢出中断,否则禁止。
EEIE是EE(电可擦除)的写完成中断的允许与禁止位。当设置为1时,允许EE写完成中断,否则禁止。
GIE是所有中断的允许与禁止。设置为1时,允许所有不可屏蔽中断,为0禁止。
四、PCL和PCLATH
程序计数器(PC)是13位。低字节PCL是可读,可写的寄存器。PC的高字节(PCH)不是直接可读,可写的。PCLATH(PC latch high) 是作为PC<12:8>的保持寄存器,这几位的内容被传送到程序计数器 的高位。当程序计数器在执行CALL,GOTO或写PCL等指令时,即向PC装入新的值。PC的高位由PCLATH装入。
具有8个13位宽度的硬件堆栈。堆栈空间它既不是程序存储器的一部分,也不是数据存储器的一个部分,堆栈的指针是不可读/写的。当执行CALL指令或中断被响应时,整个13位的PC被压入堆栈。在执行RETURN,RETLW,RETFIE等指令时,堆栈被弹出。PUSH(压入)和POP(弹出)不影响PCLATH。
堆栈是作为循环缓冲器。当堆栈被压入38次后,第9次压入将占据第一次压入的位置,第十次压入将占据第二次压入的位置,等等。同样当堆栈弹出第9次时,与第一次弹出是一样的。注意,没有状态位来 指明堆栈上溢式下溢的条件。没有PUSH,POP指令助记符,但CALL,R ETURN,RETLW,RETFIE等指令的执行或中断发生,将实际发生压栈退栈。
4-2程序存储器的页
PIC16C84具有1K的程序存储器,CALL,GOTO指令只有11位的地址范围,这11位的地址范围允许分支在2K程序存储器页大小的范围。
为将来PIC16C8X程序存储器的扩展,必须由另外两位来说明程序 存储器的页。这些页位来自于PCLATH<4:3>。当执行CALL、GOTO指令时,用户必须确保这些页位的编程等指向要求的程序存储器的页。
如果执行CALL指令,整个13位被压入堆栈。所以对于返回指令不要求 对PCLATH<4:3>位的管理。因为PC的值将会由退栈而获得。注意:PIC16C84忽略了PCLATH<4:3>位,这些位用于程序存储页1,2,3(0800H-1FFFH),不可以把PIC16C84的PCLATH<4:3>位用作通用读/写位,这会影响将来产品的向上兼容。
4-3间接寻址,INDF和FSR的作用
INDF寄存器不是物理寄存器,只是被用来与FSR寄存器连接以执行间接寻址。
使用INDF寄存器,就可以实现间接寻址。
使用INDF寄存器的任何指令,实际寻址数据是由文件选择寄存器(FSR)所决定的。读INDF自身(FSR=0),将产生00H。向INDF写,结果无操作(显然可以提供状态位)。8位FSR寄存器同状态寄存器STATUS<7>(IRP)组合可以得到9位地址。
然而PIC16C84是不用IRP的。使用下面的例程序,通过间接寻址清零。2OH~2FH单位。
MOVLW 20H ;初始化RAM的指针
MOVF FSR ;到FSR
NEXT CLRF INDF ;通过间接寻址清0,由FSR的内容所指问的寄存器。
INCF FSR ;(FSR)+1→FSR
BIFSS FSR,4;当FSR的第4位为1跳过下一条指令
GOTO NEXT ;否则入。
五 I/O端口
PIC16C84具有两个I/O端口,PORTA,PORTB。某些端口的引脚用来与另外一些功能复用。
5-1 PORTA和TRISA寄存器
PIC16C84的 PORTH是5位宽度的锁存器。RA4是施密特触发器输入,一个集电极开路输出。端口A的所有其它的引脚为TTL电平输入,含CMOS输出驱动。所有引脚有数据方向位(TRISA寄存器),可通过TRI SA来配置PORTA的引脚是输入式输出。设置TRISA的某位为1,则对应的 PORTA的位为输入,若设置为0,对应的PORTA的某位为输出。
读PORTA寄存器,读入引脚的状态,向PORTA写入,则写到PORTA的锁存器。所有的写操作都是读--修改--写操作。当向端口写时,它首先读端口引脚,然后修改其位,再写入端口的数据锁存器。下面这段程序是对端口A的初始化:
CLRF PORTA;初始化端口A
BSF STATUS,RPO;选择1块
MovLW CFH ;用于初始化数据方向的值
MOVWF TRISA;设置RA<3:0>为输入;RA<5:4>为输出 ;< 7:6>总是为0(无用)
RA4是为TMRO的时钟输入复用。即如果这一位用作TMRO的时钟输入,则端口A就不能用RA4。
5-2 PROTB和TRISB寄存器
本文关键字:单片机 综合-其它,单片机-工控设备 - 综合-其它