<span style="color: #0000ff;">引脚图:</span>
<span style="color: #0000ff;">端口:</span>
每个端口都有三个用于工作的标准寄存器。这些寄存器是:
• TRISx 寄存器 (<span style="color: #008000;">数据方向</span>)
• PORTx 寄存器 (<span style="color: #008000;">读取器件引脚的电平</span>)
• LATx 寄存器 (<span style="color: #008000;">输出锁存器</span>)
这些端口可能具有以下一个或多个额外的寄存器。这些寄存器是:
• ANSELx (<span style="color: #008000;">模拟选择</span>)
• WPUx (<span style="color: #008000;">弱上拉</span>)
• INLVLx (<span style="color: #008000;">输入级控制</span>)
PORTA 是一个 6 位宽的双向端口。对应的数据方向寄存器是 TRISA。将 TRISA 某位置 1(= 1) 时,会将 PORTA 的相应引脚设为输入 (即,禁止输出驱动器)。将 TRISA 某位清零(= 0)时,会将 PORTA 的相应引脚设为输出(即,使能输出驱动器并将输出锁存器中的内容输出到选定的引脚)。 RA3 是个例外,它仅可作为输入引脚,其 TRIS 位总是读为 1。
<span style="color: #0000ff;">振荡器模块:</span>
振荡器模块可配置为以下 8 种时钟模式之一。
- ECL—— 外部时钟低功耗模式(0 MHz 至 0.5 MHz)
- ECM—— 外部时钟中等功耗模式(0.5 MHz 至 4 MHz)
- ECH—— 外部时钟高功耗模式(4 MHz 至 32 MHz)
- LP——32 kHz 低功耗晶振模式
- XT—— 中等增益晶振或陶瓷谐振器模式(高达 4 MHz)
- HS—— 高增益晶振或陶瓷谐振器模式(4 MHz 至 20 MHz)
- RC—— 外部阻容 (RC)
- INTOSC—— 内部振荡器 (31 kHz 至 32 MHz)
时钟模式通过配置字1中的 FOSC<2:0>
位进行选择。
#pragma config FOSC = INTOSC
可通过设置 OSCCON 寄存器进行晶振频率设置
/*
* 晶振频率
* 125KHZ OSCCON = 0X28;
* 250KHZ OSCCON = 0X30;
* 500KHZ OSCCON = 0X38;
* 1MHZ OSCCON = 0X58;
* 2MHZ OSCCON = 0X60;
* 4MHZ OSCCON = 0X68;
* 8MHZ OSCCON = 0X70;
* 16MHZ OSCCON = 0X78;
*/
<span style="color: #0000ff;">指令周期时间计算</span>
例如,晶振频率为16MHZ,时钟周期即为 1/16MHZ,一条指令消耗4个时钟周期,即 1/16MHZ*4,结果为0.25us。晶振为125KHZ,指令周期为32us。
<span style="color: #0000ff;">中断:</span>
工作原理:
1)全局中断允许位 GIE 置1
2)设置特定中断事件的中断允许位
3)调用中断服务程序(ISR),通过判断中断标志位确认中断源
中断服务程序示例:(所有中断通过该入口)
void interrupt ISR() {
···
}
XC8 V2编译器中断服务程序已变更为:
void __interrupt() ISR() {
···
}
<span style="color: #ff0000;">注:无论中断允许位状态如何,各中断标志位都会在中断发生时置 1,但如果没有设置中断允许位,则不会产生中断。</span>
<span style="color: #0000ff;">电平变化中断</span>(只适用于 PORTA 寄存器):
电平变化中断允许位 IOCIE
电平变化中断标志位 IOCIF (反应所有引脚中断状态)
引脚上升沿检测位 IOCAPx
引脚下降沿检测位 IOCANx
引脚状态标志位 IOCAFx (反应对应引脚中断状态)
<span style="color: #0000ff;">定时器/计数器:</span>
TMR0 寄存器从 FFh 上溢到 00h 时,将产生 Timer0 中断
TMR0中断允许位 TMR0IE
TMR0 中断标志位 TMR0IF
TMR0 启动值设置 TMR0
预分频 OPTION_REG
初始值计算方法:
1、设置延时的时间 T
2、计算指令周期所用的时间 = 消耗N个时钟周期(单片机不同,N值也不同)
3、计算 T 所需要的指令周期数量M = T/ 指令周期所用的时间
4、计数模块在每个指令周期递增,所以需要M个递增后延时产生中断
5、M = T / {(1/晶振频率F)N},简化 M = TF/N
6、PIC16 一个指令周期包含4个时钟周期,即 N = 4
7、初始值 TMR0 = 0xFF - M
TMR1 寄存器从 FFFFh 上溢到 00h 时,将产生 Timer1 中断
TMR1中断允许位 TMR1ON
TMR1中断允许位 TMR1IE
TMR1 中断标志位 TMR0IF
PEIE 也要设置
TMR1 初始值设置 TMR1H、TMR1L
<span style="color: #0000ff;">SPI 通信</span>
串行外设接口(SPI)总线是以全双工模式工作的同步串行数据通信总线。器件在由主器件启动通信的主 / 从器件环境中进行通信。从器件通过称为从选择的片选进行控制。
SPI 总线规定了4 种信号连接:
1、串行时钟 (SCK)
2、串行数据输出 (SDO)
3、串行数据输入 (SDI)
4、从选择 (SS)
正确初始化I/O端口数据方向
SDI 必须将相应的TRIS 位置1 SDI是MISO,指主器件数据输入,从器件数据输出
SDO 必须将相应的TRIS 位清零 SDO是MOSI,指主器件数据输出,从器件数据输入
SCK (主模式)必须将相应的TRIS 位清零
SCK (从模式)必须将相应的TRIS 位置1
SS 必须将相应的TRIS 位置1(从器件)