本书大量案例涉及外部中断、定时/计数器、CCP、MSSP(I 2 C、SPI)、ADC、比较器、USART等外设应用程序设计,使用C语言开发程序时将大量使用这些外设的相关控制、状态或数据寄存器。由于本书案例主要使用PIC16F877A单片机、部分案例使用PIC18系列高档单片机,本节将用一定篇幅列出使用相对较多的PIC16F877A单片机相关寄存器技术手册内容。其他各种型号单片机更详细的PDF技术手册内容可从微芯公司官方网站http://www.microchip.com下载。
(1)EEPROM控制寄存器—EECON1(EEPROM Control Register 1),相关位如表1-5所示。
表1-5 EEPROM控制寄存器配置位
EEPGD:程序/数据选择位(Program/Data EEPROM Select bit)。
1=访问程序内存,0=访问数据内存。
WRERR:错误(Error)标志位。
1=写操作过早终止,指正常操作期间出现MCLR或WDT复位;0=写操作已完成。
WREN:写使能(Write Enable)位。
1=允许写入,0=禁止写入EEPROM。
WR:写操作控制位。
1=启动写周期。一旦写入完成,该位将被硬件清零。写操作控制位只能用软件置1。
0=EEPROM的写周期已完成。
RD:读操作控制位。
1=启动EEPROM读操作,0=未启动EEPROM读操作。
与PIC EEPROM相关的寄存器还有:
EEADR:EEPROM地址寄存器EEADR,最多可寻址256字节的数据EEPROM存储器。
附注:各位标有R/W表示可读/写,标有U表示未用,“− n”表示上电复位值,其中x表示未知。
(2)中断控制寄存器—INTCON(Interrupt Control Register),相关配置位如表1-6所示。
表1-6 中断控制寄存器
GIE:全局中断允许位。
1=允许所有未屏蔽中断;0=禁止所有中断。
PEIE:外设中断允许位。
1=允许所有未屏蔽外设中断;0=禁止所有外设中断。
T0IE:TMR0溢出中断允许位。
1=允许TMR0溢出中断;0=禁止TMR0溢出中断。
INTE:INT外部引脚中断允许位。
1=允许INT外部引脚中断;0=禁止INT外部引脚中断。
RBIE:RB端口电平变化中断允许位。
1=允许RB端口电平变化中断;0=禁止RB端口电平变化中断。
T0IF:TMR0溢出中断标志位。
1=TMR0寄存器已经溢出(必须用软件清零);0=TMR0寄存器未发生溢出。
INTF:INT外部引脚中断标志位。
1=发生INT外部中断(必须用软件清零);0=未发生INT外部中断。
RBIF:RB端口电平变化中断标志位。
1=RB7:RB4引脚中至少有一位的状态发生了变化(必须用软件清零);
0=RB7:RB4引脚没有发生状态变化。
(3)外设中断独立使能寄存器1—PIE1(Peripheral Interrupts Enable Register 1),相关配置如表1-7所示。
表1-7 外设中断独立使能寄存器1
PSPIE:并行从动端口的读/写中断允许位。
1=允许PSP的读/写中断;0=禁止PSP的读/写中断。
ADIE:A/D转换中断允许位。
1=允许A/D中断;0=禁止A/D中断。
RCIE:USART接收中断允许位。
1=允许USART接收中断;0=禁止USART接收中断。
TXIE:USART发送中断允许位。
1=允许USART发送中断;0=禁止USART发送中断。
SSPIE:同步串行口中断允许位。
1=允许SSP中断;0=禁止SSP中断。
CCP1IE:CCP1中断允许位。
1=允许CCP1中断;0=禁止CCP1中断。
TMR2IE:TMR2与PR2匹配中断允许位。
1=允许 TMR2与PR2匹配中断;0=禁止TMR2与PR2匹配中断。
TMR1IE:TMR1溢出中断允许位。
1=允许TMR1溢出中断;0=禁止TMR1溢出中断。
(4)外设中断独立使能寄存器2-PIE2(Peripheral Interrupts Enable Register 2),相关配置位如表1-8所示。
表1-8 外设中断独立使能寄存器2
CMIE:比较器中断允许位。
1=允许比较器中断;0=禁止比较器中断。
EEIE:EEPROM写操作完成中断允许位。
1=允许EEPROM写操作完成中断;0=禁止EEPROM写操作完成中断。
BCLIE:总线冲突中断允许位(Bus Collision Interrupt Enable bit)。
1=使能总线冲突中断;0=禁止总线冲突中断。
CCP2IE:CCP2中断允许位。
1=允许CCP2中断;0=禁止CCP2中断。
(5)外设中断独立标志位寄存器1-PIR1(Peripheral Interrupts Flag Bit Register 1),相关配置如表1-9所示。
表1-9 外设中断独立标志寄存器
PSPIF:并行从动端口读/写中断标志位。
1=发生了读/写操作(必须用软件清零);0=未发生读/写操作。
ADIF:A/D转换器中断标志位。
1=完成A/D转换(必须用软件清零);0=未完成A/D转换。
RCIF:USART接收中断标志位。
1=接收缓冲器RCREG满(当读取RCREG时清零);0=接收缓冲器为空。
TXIF:USART发送中断标志位。
1=发送缓冲器TXREG为空(当写入TXREG 时清零);0=发送缓冲器满。
SSPIF:同步串行口中断标志位。
1=完成发送/接收;0=等待发送/接收完成。
CCP1IF:CCP1中断标志位。
● 输入捕捉模式
1=发生了TMR1寄存器捕捉(必须用软件清零);
0=未发生TMR1寄存器捕捉。
● 输出比较模式
1=发生了TMR1寄存器的比较匹配(必须用软件清零);
0=未发生TRM1寄存器的比较匹配。
● 脉宽调制模式(PWM)下未定义
TMR2IF:TMR2对PR2匹配中断标志位。
1=TMR2与PR2匹配(必须用软件清零);0=TMR2与PR2不匹配。
TMR1IF:TMR1溢出中断标志位。
1=TMR1寄存器发生溢出(必须用软件清零);0=TMR1寄存器未发生溢出。
(6)外设中断独立标志位寄存器2-PIR2(Peripheral Interrupts Flag Bit Register 2),相关寄存器如表1-10所示。
表1-10 外设中断独立标志位寄存器2
CMIF:比较器中断标志位。
1=比较器输入发生变化(必须用软件清零);0=比较器输入未发生变化。
EEIF:EEPROM写操作完成中断标志位。
1=EEPROM写操作已完成(必须用软件清零);0=EEPROM 写操作未完成。
BCLIF:总线冲突中断标志位。
1=配置SSP模块I 2 C主控模式时出现总线冲突;0=未出现总线冲突。
CCP2IF:CCP2中断标志位。
● 输入捕捉模式
1=发生了TMR1寄存器捕捉(必须用软件清零);
0=未发生TMR1寄存器捕捉。
● 输出比较模式
1=发生了TMR1寄存器的比较匹配(必须用软件清零);
0=未发生TRM1寄存器的比较匹配。
● 脉宽调制模式(PWM)下未定义。
(7)并行从动端口状态/控制寄存器-TRISE(Parallel Slave Port Status/Control Bits),相关配置位如表1-11所示。
表1-11 并行从动端口状态/控制寄存器
IBF:输入缓冲器满状态位。
1=接收到一个数据,等待CPU读取;0=未接收到任何数据。
OBF:输出缓冲器满状态位。
1=输出缓冲器仍保存着上一次写入的数据;0=已读取输出缓冲器。
IBOV:输入缓冲器溢出检测位(在微处理器模式)。
1=在尚未读取上一次输入数据前发生了一次写入(必须用软件清零);
0=无溢出发生。
PSPMODE:并行从动端口模式选择位。
1=并行从动端口模式;0=通用I/O口模式。
TRISE2、1、0:分别为RE2、1、0引脚的方向控制位。1=输入;0=输出。
(8)选项寄存器-OPTION_REG(OPTION Register),如表1-12所示。
表1-12 选项寄存器
OPTION_REG寄存器用来设置TMR0/WDT预分频器、外部INT中断、TMR0和PORTB弱上拉等。
RBPU:弱上拉使能位。
1=禁止弱上拉;0=使能弱上拉。
INTEDG:中断信号边沿选择位。
1=INT引脚上升沿中断;0=INT引脚下降沿中断。
T0CS:TMR0时钟源选择位。
1=T0CKI引脚输入时钟;0=内部指令周期时钟(CLKOUT)。
T0SE:TMR0时钟源边沿选择位。
1=T0CKI引脚电平由高到低转变时递增;0=T0CKI引脚电平由低到高转变时递增。
PSA:预分频器分配位。
1=预分频器分配给WDT;0=预分频器分配给TIMER0。
PS2:PS0(Prescaler Rate Select bits 2:0):预分频比选择位,对应的分频比如表1-13所示。(9)TIMER1控制寄存器-T1CON(TIMER1 Control Register),如表1-14所示。
表1-13 预分频比选择位分频比
表1-14 TIMER1控制寄存器
T1CKPS1:T1CKPS0 TIMER1输入时钟预分频比选择位,对应值如下。
11=1:8预分频比;10=1:4预分频比;01=1:2预分频比;00=1:1预分频比。
T1OSCEN:TIMER1振荡器使能位。
1=振荡器使能;0=振荡器关闭。振荡器的反相器和反馈电阻被关断,以降低功耗。
T1SYNC:TIMER1外部时钟输入同步控制位。
当TMR1CS=1时:1=不同步外部时钟;0=同步外部时钟。
当TMR1CS=0时:此位被忽略,TIMER1使用内部时钟。
TMR1CS:TIMER1时钟源选择位。
1:选择T1OSO/T1CKI引脚的外部时钟(上升沿计数);
0:选择内部时钟(FOSC/4)。
TMR1ON:TIMER1使能位。
1=使能TIMER1;0=关闭TIMER1。
与TIMER1相关的寄存器有:
① TMR1L保存16位TMR1寄存器低字节的寄存器;
② TMR1H保存16位TMR1寄存器高字节的寄存器。
(10)TIMER2控制寄存器-T2CON(TIMER2 Control Register),如表1-15所示。
表1-15 TIMER2控制寄存器
TOUTPS3:TOUTPS0:TIMER2输出后分频比选择位。
0000,0001,…,1111分别设置1:1,1:2,…,1:16后分频比。
TMR2ON:TIMER2允许位。
1=TIMER2允许;0=TIMER2关闭。
T2CKPS1:T2CKPS0:TIMER2时钟预分频比选择位。
00,01,1x分别设置1:1,1:4,1:16预分频比。
与TIMER2相关的寄存器还有:
① TMR2:TIMER2定时器模块8位的寄存器;
② PR2:TIMER2周期寄存器(Period Register),其默认初值恒为0xFF。
(11)CCPx控制寄存器-CCP1CON/CCP2CON(CCP1/CCP2 Control Register),如表1-16所示。
表1-16 CCPx控制寄存器
DCxB1:DCxB0(或称做CCPxX:CCPxY):PWM占空比的最低两位。
这两位在捕捉模式(Capture Mode)与比较模式(Compare Mode)下未用。
在PWM模式下,它们是10位PWM占空比的最低2位,占空比的高8位(DCx9:DCx2)在CCPRxL中。
CCPxM3:CCPxM0CCPx模式选择位,配置如下:
0000=捕捉/比较/PWM关闭(即复位CCPx模块);
0100=捕捉模式,每个下降沿发生;
0101=捕捉模式,每个上升沿发生;
0110=捕捉模式,每4个上升沿发生;
0111=捕捉模式,每16个上升沿发生;
1000=比较模式,比较相符时CCPx引脚为高电平(CCPIF置1);
1001=比较模式,比较相符时CCPx引脚为低电平(CCPIF置1);
1010=比较模式,比较相符时,产生软件中断(CCPIF置1,CCPx引脚不受影响);
1011=比较模式,比较相符时,产生特殊触发事件(CCPIF置1,CCP引脚不受影响);
11xx=PWM模式。
与CCPx相关的寄存器还有:
① CCPRxH,CCPx捕获/比较/PWM(Capture/Compare/PWM)寄存器高字节;
② CCPRxL CCPx捕获/比较/PWM(Capture/Compare/PWM)寄存器低字节;
③ 捕获/比较模式与TMR1相关,PWM模式与TMR2相关。
(12)主控同步串行口状态寄存器-SSPSTAT(MSSP Status Register/SPI Mode),如表1-17所示。
表1-17 主控同步串行口状态寄存器配置位
SMP:SPI输入数据的采样(Sample)相位。
● 在SPI主控模式下
1=在数据输出时间的末端采样输入数据;0=在数据输出时间的中间采样输入数据。
● 在SPI从动模式下:SMP必须清零。
CKE:SPI时钟沿选择位。
CKP=0(SSPCON<4>)
1=在SCK上升沿发送数据;0=在SCK下降沿发送数据。
CKP=1(SSPCON<4>)
1=在SCK下降沿发送数据;0=在SCK上升沿发送数据。
D/A:数据/地址位(仅用于I 2 C模式)。
1=表示最后接收或发送的字节是数据;0=表示最后接收或发送的字节是地址。
P:停止位(仅用于I 2 C模式)。当SSP模块被禁止时该位被清零。
1=表示检测到停止位(复位时该位为0);0=表示未检测到停止位。
S:启动位(仅用于I 2 C模式)。当SSP模块被禁止时该位被清零。
1=表示检测到启动位(复位时该位为0);0=表示未检测到启动位。
R/W:读/写位信息(仅用于I 2 C模式)。该位用来记录在最后一次地址匹配后接收到的读/写信息。从本机地址与接收地址匹配开始,到下一个启动位、停止位或无应答位(ACK)时,该位有效。1=读;0=写。
UA:地址更新(仅用于10位I 2 C模式)。
1=表示需要更新SSPADD寄存器中的地址;0=表示地址不需要更新。
BF:缓冲区满状态位。
接收时(SPI和I 2 C模式)
1=表示接收完成,SSPBUF满;0=表示接收未完成,SSPBUF空。
发送时(I 2 C模式时)
1=表示发送正在进行,SSPBUF满;0=表示发送已经完成,SSPBUF空。
(13)主控同步串行口控制寄存器-SSPCON(MSSP Control Register),如表1-18所示。
表1-18 主控同步串行口控制寄存器
WCOL:写冲突检测位。
1=正在发送前一个字时,又有数据写入SSPBUF寄存器(该位必须用软件清零);
0=表示未发生冲突。
SSPOV:接收溢出指示位。
● 在SPI模式下
1=SSPBUF中仍保持前一个数据时又收到新的字节。在溢出时,SSPSR中的数据丢失,且SSPBUF不能再被更新。溢出只会发生在从动模式下。即使只发送数据,用户也必须读SSPBUF,以避免产生溢出。在主控模式下,溢出位不会被置位,因为每次接收或发送新数据,都要通过写SSPBUF来启动。
0=没有溢出。
● 在I 2 C模式下
1=SSPBUF中仍保持前一个字节时又收到新的数据。在发送方式下SSPOV位无效,在SPI和I 2 C模式下,该位都必须用软件清零。
0=没有溢出。
SSPEN:同步串行口使能位。在SPI和I 2 C两种模式下,当该位为1而使能时,应正确定义相应引脚的输入/输出方向。
● 在SPI模式下
1=使能串行口,并定义SCK、SDO、SDI和SS为串行口引脚;
0=禁止串行口,并定义SCK、SDO、SDI和SS引脚为一般I/O端口引脚。
● 在I 2 C模式下
1=使能串行口,并定义SDA和SCL为串行口引脚;
0=禁止串行口,并定义SDA和SCL引脚为一般I/O端口引脚。
CKP:时钟极性选择位。
● 在SPI模式下
1=空闲状态时,时钟为高电平;0=空闲状态时,时钟为低电平。
● 在I 2 C模式下
SCK 释放控制。1=使能时钟;0=保持时钟线为低电平(用于保证数据的建立时间)。
SSPM3:SSPM0:同步串行口模式选择位。所有配置如下:
0000=SPI主控模式,时钟=FOSC/4;
0001=SPI主控模式,时钟=FOSC/16;
0010=SPI主控模式,时钟=FOSC/64;
0011=SPI主控模式,时钟=TMR2输出/2;
0100=SPI从动模式,时钟=SCK引脚,使能SS引脚控制;
0101=SPI从动模式,时钟=SCK引脚,禁止SS引脚控制,SS可用作I/O引脚;
0110=I 2 C 7位地址的从动模式;
0111=I 2 C 10位地址的从动模式;
1000=保留;
1001=保留;
1010=保留;
1011=I 2 C固件控制的主控模式(从动模式空闲);
1100=保留;
1101=保留;
1110=I 2 C从动模式,7位地址,允许启动位和停止位中断功能;
1111=I 2 C从动模式,10位地址,允许启动位和停止位中断功能。
与MSSP模块相关的寄存器还有8位的同步串行口接收缓冲器/发送寄存器SSPBUF。
(14)发送状态和控制寄存器——TXSTA(Transmit Status and Control Register),如表1-19所示。
表1-19 发送状态和控制寄存器配置位
CSRC:时钟源选择位(异步模式此位未用)。在同步模式下:
1=主控模式(由内部波特率发生器产生时钟);
0=从动模式(由外部时钟源提供时钟信号)。
TX9:9位发送使能位。
1=选择9位数据发送;0=选择8位数据发送。
TXEN:发送使能位。
1=允许发送;0=禁止发送。在SYNC模式下,SREN/CREN位比TXEN位优先级高。
SYNC:USART模式选择位。
1=同步模式;0=异步模式。
BRGH:高速波特率使能位。异步模式下,1=高速;0=低速。同步模式下此位未用。
TRMT:发送移位寄存器状态位。1=TSR空;0=TSR满。
TX9D:发送数据的第9位,可作为奇偶校验位。
(15)接收状态和控制寄存器-RXSTA(Receive Status and Control Register),如表1-20所示。
表1-20 接收状态和控制寄存器配置位
SPEN:串口使能位。
1=允许串口工作(RX/DT和TX/CK引脚配置为串口引脚);0=禁止串口工作。
RX9:9位接收使能位。
1=选择9位接收;0=选择8位接收。
SREN:单字节接收使能位。
同步主控模式下,1=允许接收单字节;0=禁止接收单字节。在接收完成后该位被清零。同步从动模式及异步模式此位未用。
CREN:连续接收使能位。
异步模式下,1=允许连续接收;0=禁止连续接收。
同步模式下,1=允许连续接收直到CREN位被清零;0=禁止连续接收。
FERR:帧出错标志位。
1=帧出错(读RCREG寄存器可更新该位,并接收下一个有效字节);0=无帧错误。
OERR:溢出错误位。
1=有溢出错误(清零CREN位可将此位清零);0=无溢出错误。
RX9D:接收数据的第9位,可作为奇偶校验位。
与TXSTA、RXSTA相关的寄存器SPBRG用于设置USART的波特率,如表1-21所示。
表1-21 SPBRG设置的USART波特率
注:X为SPBRG寄存器的取值(0~255)
向波特率寄存器SPBRG写入一个新值会使BRG定时器复位(或清零),这可确保波特率发生器BRG不需要等到定时器溢出就可以输出新的波特率值。
下面补充说明波特率的误差计算。
以FOSC=16MHz、目标波特率=9600为例,设BRGH=0,SYNC=0。有:
目标波特率=Fosc/(64(X+1)),即
9600=16 000 000/(64(X+1)),可得:X=25.042 ≈ 25
计算波特率=16 000 000/(64(25+1))=9615
误差=(计算波特率−目标波特率)/目标波特率=(9 615−9 600)/9 600=0.16%
(16)比较器参考电压模块控制寄存器——CVRCON(Comparator Voltage Reference Control Register 2),如表1-22所示。
表1-22 比较器参考电压模块控制寄存器
VREN:VREF使能。
1=开启VREF电路;0=关闭VREF电路。
VROE:VREF输出使能。
1=VREF与比较器模块的VREF相连。电压值也输出到VREF引脚;0=VREF与比较器模块不相连。电压值与VREF引脚无关。
VRR:VREF范围选择。
1=0~0.75 VDD,间隔为VDD/24的步长;0=0.25~0.75 VDD,间隔为VDD/32的步长。
VR3:VR0:VREF值选择VR3:VR0取值为0000~1111(0~15)。
若VRR=1:VREF=(VR<3:0>/24)×VDD;
若VRR=0:VREF=1/4×VDD+(VR3:VR0/32)×VDD。
表1-23列出了典型的参考电压(VDD=5.0 V)。
表1-23 VREF典型参考电压
(17)比较器控制寄存器——CMCOM(Comparator Control Register 2),如表1-24所示。
表1-24 比较器控制寄存器
C2OUT:比较器2输出指示位。
当C2INV=0时:1=表示C2 VIN+>C2 VIN-;0=表示C2 VIN+<C2 VIN-。
当C2INV=1时:1=表示C2 VIN+<C2 VIN-;0=表示C2 VIN+>C2 VIN-。
C1OUT:比较器1输出指示位。
当C1INV=0时:1=表示C1 VIN+>C1 VIN-;0=表示C1 VIN+<C1 VIN-。
当C1INV=1时:1=表示C1 VIN+<C1 VIN-;0=表示C1 VIN+>C1 VIN-。
C2INV:比较器2输出反相位。1=C2OUT反相;0=C2OUT非反相。
C1INV:比较器1输出反相位。1=C1OUT反相;0=C1OUT非反相。
CIS:比较器输入选择位。当CM2:CM0=110时,
1=C1 VIN− 连接RA3/AN3,C2 VIN-连接 RA2/AN2
0=C1 VIN− 连接RA0/AN0,C2 VIN-连接 RA1/AN1
CM2:CM0所有8种配置组合(000~111)列举在第3章相关案例中。
(18)A/D转换器控制寄存器0——ADCON0(ADC Control Register 0),如表1-25所示。
表1-25 A/D转换器控制寄存器
ADCS1:ADCS0:A/D转换时钟选择位,与ADCON1中的ADCS2共3位配置8种不同的A/D转换时钟。所有的8种配置如表1-26所示。
表1-26 A/D转换时钟
CHS2:CHS0:模拟通道选择位。取值000~111分别选择通道AN0~AN7通道。
GO/DONE(或称ADGO):A/D转换状态位。当ADON=1时,1=A/D转换正在进行(该位置1启动A/D转换,A/D转换结束后该位由硬件自动清零);0=未进行A/D转换。
ADON:A/D模块开启位。
1=A/D转换器模块工作;0=A/D转换器关闭,不消耗工作电流。
(19)A/D转换器控制寄存器1-ADCON1(ADC Control Register 1),如表1-27所示。
表1-27 A/D转换器控制寄存器
ADFM:A/D结果格式选择位。
1=右对齐,ADRESH高6位读为0;0=左对齐,ADRESL低6位读为0。
ADCS2与ADCON0的ADCS1、ADCS0配合使用。
PCFG3~PCFG0为A/D端口配置控制位,0000~1111的所有配置组合见第3章相关案例。