📄 main.c
字号:
#define EX_GLOBAL
#include "Main.H"
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
//#define _tx_
void MCU_Ini(void)
{
// #ifdef rf_tx
// OSCCON = 0x70;//发射时频率为1M//——振荡器控制寄存器(地址:8Fh)
// #else
OSCCON = 0x40;//接收时频率为8MHz
// #endif
/*
— IRCF2 IRCF1 IRCF0 OSTS(1) HTS LTS SCS
0 0 0 0 0 0 0 0
bit 7 未用:读为0
bit 6-4 IRCF<2:0>:内部振荡器频率选择位
000 = 31 kHz
001 = 125 kHz
010 = 250 kHz
011 = 500 kHz
100 = 1 MHz
101 = 2 MHz
110 = 4 MHz (缺省值)
111 = 8 MHz
bit 3 OSTS:振荡器起振超时状态位(1)
1 = 器件运行在FOSC<2:0> 定义的外部时钟之下
0 = 器件运行在内部振荡器之下(HFINTOSC 或LFINTOSC)
bit 2 HTS:HFINTOSC (高频——8 MHz 到125 kHz)状态位
1 = HFINTOSC稳定
0 = HFINTOSC不稳定
bit 1 LTS:LFINTOSC (低频——31 kHz)状态位
1 = LFINTOSC稳定
0 = LFINTOSC不稳定
bit 0 SCS:系统时钟选择位
1 = 内部振荡器用于系统时钟
0 = 时钟源由FOSC<2:0> 决定
注 1: 双速启动且选取LP、XT 或HS 为振荡器模式时,或者故障保护模式使能时,该位
将复位为0。
*/
OPTION = 0xCF;//选项寄存器(地址:81h 或181h)
/*
RABPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
1 1 0 0 1 0 1 0
bit 7 RABPU:PORTA/PORTB 上拉使能位
1 = 禁止PORTA/PORTB 上拉
0 = 通过单独的端口锁存值使能PORTA/PORTB 上拉
bit 6 INTEDG:中断触发边沿选择位
1 = RA2/AN2/T0CKI/INT/C1OUT 引脚的上升沿触发中断
0 = RA2/AN2/T0CKI/INT/C1OUT 引脚的下降沿触发中断
bit 5 T0CS:TMR0 时钟源选择位
1 = RA2/AN2/T0CKI/INT/C1OUT 引脚上的电平跳变
0 = 内部指令周期时钟(CLKOUT)
bit 4 T0SE:TMR0 信号源边沿选择位
1 = 在RA2/AN2/T0CKI/INT/C1OUT 引脚信号从高至低跳变时,递增计数
0 = 在RA2/AN2/T0CKI/INT/C1OUT 引脚信号从低至高跳变时,递增计数
bit 3 PSA:预分频器分配控制位
1 = 预分频器分配给WDT
0 = 预分频器分配给Timer0 模块
bit 2-0 PS<2:0>:预分频器倍率选择位
*/
INTCON = 0x00;//中断控制寄存器(地址:0Bh、8Bh、10Bh 或18Bh)
/*
GIE PEIE T0IE INTE RABIE T0BIE T0IF INTF RABIF
0 0 0 0 0 0 0 0 0
bit 7 GIE:全局中断允许位
1 = 使能所有非屏蔽中断
0 = 禁止所有中断
bit 6 PEIE:外设中断允许位
1 = 使能所有非屏蔽外设中断
0 = 禁止所有外设中断
bit 5 T0IE:TMR0 溢出中断允许位
1 = 使能TMR0 中断
0 = 禁止TMR0 中断
bit 4 INTE:RA2/INT 外部中断允许位
1 = 使能RA2/INT 外部中断
0 = 禁止RA2/INT 外部中断
bit 3 RABIE:PORTA/PORTB 电平变化中断允许位(1, 3)
1 = 使能PORTA/PORTB 电平变化中断
0 = 禁止PORTA/PORTB 电平变化中断
bit 2 T0IF:TMR0 溢出中断标志位(2)
1 = TMR0 寄存器溢出(必须用软件清零)
0 = TMR0 寄存器没有溢出
bit 1 INTF:RA2/INT 外部中断标志
1 = RA2/INT 外部中断已经发生(必须用软件清零)
0 = RA2/INT 外部中断没有发生
bit 0 RABIF: PORTA/PORTB 电平变化中断标志位
1 = 至少有一个PORTA 或PORTB 通用I/O 引脚状态发生变化时(必须用软件清零)
0 = PORTA 或PORTB 通用I/O 引脚状态均未发生变化
注 1:IOCA 或IOCB 寄存器也必须被使能。
2: 当Timer0 计数出现计满返回时, T0IF 位将被置1。Timer0 计数值在复位时不变,
而且应在清除T0IF 位之前对其进行初始化。
3: 包含ULPWU 中断。
*/
PIE1 = 0x00;//——外设中断允许寄存器1 (地址:8Ch)
/*
— ADIE RCIE(2) TXIE(2) SSPIE(2) CCP1IE(1) TMR2IE(1) TMR1IE
0 0 0 0 0 0 0 0
bit 7 未用:读为0
bit 6 ADIE:A/D 转换器中断允许位
1 = 使能
0 = 禁止
bit 5 RCIE:EUSART 接收中断允许位(2)
1 = 使能
0 = 禁止
bit 4 TXIE:EUSART 发送中断允许位(2)
1 = 使能
0 = 禁止
bit 3 SSPIE:同步串行口(SSP)中断允许位(2)
1 = 使能
0 = 禁止
bit 2 CCP1IE:CCP1 中断允许位(1)
1 = 使能
0 = 禁止
bit 1 TMR2IE: TMR2 到PR2 匹配中断允许位(1)
1 = 使能
0 = 禁止
bit 0 TMR1IE:TMR1 溢出中断允许位
1 = 使能
0 = 禁止
注1: 仅限PIC16F685/PIC16F690。
2: 仅限PIC16F687/PIC16F689/PIC16F690
*/
PIE2 = 0x00;//——外设中断允许寄存器2 (地址:8Dh)
/*
OSFIE C2IE C1IE EEIE — — — —
0 0 0 0 0 0 0 0
bit 7 OSFIE:振荡器故障中断允许位
1 = 使能
0 = 禁止
bit 6 C2IE:比较器2 中断允许位
1 = 使能比较器2 中断
0 = 禁止比较器2 中断
bit 5 C1IE:比较器1 中断允许位
1 = 使能比较器1 中断
0 = 禁止比较器1 中断
bit 4 EEIE:EE 写操作中断允许位
1 = 使能
0 = 禁止
bit 3-0 未用:读为0
*/
PIR1 = 0x00;//——外设中断请求寄存器1 (地址:0Ch)
/*
— ADIF RCIF(1) TXIF(1) SSPIF(1) CCP1IF(2) TMR2IF(2) TMR1IF
0 0 0 0 0 0 0 0
bit 7 未用:读为0
bit 6 ADIF:A/D 转换器中断标志位
1 = A/D 转换已完成(必须用软件清零)
0 = A/D 转换未完成
bit 5 RCIF:EUSART 接收中断标志位(1)
1 = EUSART 接收缓冲器满(通过读取RCREG 清零)
0 = EUSART 接收缓冲器未满
bit 4 TXIF: EUSART 发送中断标志位(1)
1 = EUSART 发送缓冲器空(通过写入TXREG 清零)
0 = EUSART 发送缓冲器满
bit 3 SSPIF:同步串行口(SSP)中断标志位(1)
1 = 发送/ 接收完成(必须用软件清零)
0 = 等待发送/ 接收
bit 2 CCP1IF:CCP1 中断标志位(2)
捕捉模式
1 = TMR1寄存器发生捕捉中断(必须用软件清零)
0 = TMR1寄存器未发生捕捉中断
比较模式
1 = TMR1寄存器发生比较匹配中断(必须用软件清零)
0 = TMR1寄存器未发生比较匹配中断
PWM 模式
未在此模式中使用。
bit 1 TMR2IF:TMR2 和PR2 中断标志位(2)
1 = 发生TMR2 和PR2 匹配中断(必须用软件清零)
0 = 未发生TMR2 和PR2 匹配中断
bit 0 TMR1IF:TMR1 溢出中断标志位
1 = TMR1寄存器溢出(必须用软件清零)
0 = TMR1寄存器未溢出
注 1: 仅限PIC16F687/PIC16F689/PIC16F690。
2: 仅限PIC16F685/PIC16F690。
*/
PIR2 = 0x00;//——外设中断请求寄存器2 (地址:0Dh)
/*
OSFIF C2IF C1IF EEIF — — — —
0 0 0 0 0 0 0 0
bit 7 OSFIF:振荡器故障中断标志位
1 = 系统振荡器故障,时钟输入切换至INTOSC (必须用软件清零)
0 = 系统时钟工作正常
bit 6 C2IF:比较器2 中断标志位
1 = 比较器输出(C2OUT 位)已经改变(必须用软件清零)
0 = 比较器输出(C2OUT 位)没有变化
bit 5 C1IF:比较器1 中断标志位
1 = 比较器输出(C1OUT 位)已经改变(必须用软件清零)
0 = 比较器输出(C1OUT 位)没有变化
bit 4 EEIF:EE 写操作中断标志位
1 = 写操作完成(必须用软件清零)
0 = 写操作未完成或尚未开始
bit 3-0 未用:读为0
*/
PCON = 0x10;//——电源控制寄存器(地址:8Eh)
/*
— — ULPWUE SBOREN(1) — — POR BOR
0 0 0 1 0 0 0 0
bit 7 bit 0
bit 7-6 未用:读为0
bit 5 ULPWUE:超低功耗唤醒使能位
1 = 使能超低功耗唤醒
0 = 禁止超低功耗唤醒
bit 4 SBOREN:软件BOR 使能位(1)
1 = 使能BOR
0 = 禁止BOR
bit 3-2 未用:读为0
bit 1 POR:上电复位状态位
1 = 无上电复位发生
0 = 发生上电复位(上电复位发生后,必须用软件置1)
bit 0 BOR:欠压复位状态位
1 = 无欠压复位发生
0 = 发生欠压复位(欠压复位发生后,必须用软件置1)
注1: 配置字寄存器中的BOREN<1:0> = 01 时,该位控制BOR。
*/
TRISA = 0x3B;//——TRISA 三态寄存器(地址:85h 或185h)
/*
— — TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0
0 0 1 1 1 0 1 1
bit 7-6 未用:读为0
bit 5-0 TRISA<5:0>:PORTA 三态控制位
1 = PORTA 引脚配置为输入(三态)
0 = PORTA 引脚配置为输出
注: 在XT、HS 和LP 振荡器模式下, TRISA<5:4> 总是读为1。
*/
PORTA = 0x00;//——PORTA 寄存器(地址:05h 或105h)
/*
— — RA5 RA4 RA3 RA2 RA1 RA0
0 0 0 0 0 0 0 0
bit 7-6: 未用:读为0
bit 5-0: RA<5:0>:PORTA I/O 引脚位
1 = 端口引脚> VIH
0 = 端口引脚< VIL
*/
WPUA = 0x00;//——弱上拉PORTA 寄存器(地址:95h)
/*
— — WPUA5 WPUA4 — WPUA2 WPUA1 WPUA0
0 0 0 0 0 0 0 0
bit 7-6 未用:读为0
bit 5-4 WPUA<5:4>:弱上拉寄存器位
1 = 上拉使能
0 = 上拉禁止
bit 3 未用:读为0
bit 2-0 WPUA<2:0>:弱上拉寄存器位
1 = 上拉使能
0 = 上拉禁止
注 1:必须使能全局RABPU 位才能使能单独的上拉功能。
2:如果引脚处于输出模式,则自动禁止弱上拉器件(TRISA = 0)。
3:当在配置字中引脚配置为MCLR时,RA3 上拉被使能,引脚配置为I/O时则被禁止。
4:在XT、HS 和LP 振荡器模式下, WPUA<5:4> 总是读为1。
*/
IOCA = 0x00;//——电平变化中断PORTA 寄存器(地址:96h)
/*
— — IOCA5 IOCA4 IOCA3 IOCA2 IOCA1 IOCA0
0 0 0 0 0 0 0 0
bit 7-6 未用:读为0
bit 5-0 IOCA<5:0>:电平变化中断PORTA 控制位
1 = 使能电平变化中断
0 = 禁止电平变化中断
注1:要使各中断能够被识别,必须使能全局中断允许控制位(GIE)。
*/
TRISB = 0x40;//——TRISB三态寄存器(地址:86h或 186h)
/*
TRISB7 TRISB6 TRISB5 TRISB4 — — — —
0 1 0 0 0 0 0 0
bit 7-4 TRISB<7:4>:PORTB 三态控制位
1 = PORTB 引脚配置为输入(三态)
0 = PORTB 引脚配置为输出
bit 3-0 未用:读为0
*/
PORTB = 0x00;//——PORTB 寄存器(地址:06h 或106h)
/*
RB7 RB6 RB5 RB4 — — — —
0 0 0 0 0 0 0 0
bit 7-4 RB<7:4>:PORTB I/O 引脚位
1 = 端口引脚> VIH
0 = 端口引脚< VIL
bit 3-0 未用:读为0
*/
WPUB = 0x00;//——弱上拉PORTB 寄存器(地址:115h)
/*
WPUB7 WPUB6 WPUB5 WPUB4 — — — —
0 0 0 0 0 0 0 0
bit 7-4 WPUB<7:4>:弱上拉寄存器位
1 = 上拉使能
0 = 上拉禁止
bit 3-0 未用:读为0
注 1:必须使能全局RABPU 位,从而使能单独的上拉功能。
2:如果引脚处于输出模式(TRISB<7:4> = 0),则自动禁止弱上拉器件。
*/
IOCB = 0x00;//——电平变化中断PORTB 寄存器(地址:116h)
/*
IOCB7 IOCB6 IOCB5 IOCB4 — — — —
0 0 0 0
bit 7-4 IOCB<7:4>:电平变化中断位
1 = 使能电平变化中断
0 = 禁止电平变化中断
bit 3-0 未用:读为0
*/
TRISC = 0x36;//——TRISC三态寄存器(地址:87h或 187 h )
/*
TRISC7 TRISC6 TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 TRISC0
0 0 1 1 0 1 1 0
bit 7-0 TRISC<7:0>:PORTC 三态控制位
1 = PORTC 引脚配置为输入(三态)
0 = PORTC 引脚配置为输出
*/
PORTC = 0x00;//——PORTC 寄存器(地址:07h 或107h)
/*
RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0
0 0 0 0 0 0 0 0
bit 7-0 RC<7:0>:PORTC 通用I/O 引脚位
1 = 端口引脚> VIH
0 = 端口引脚< VIL
*/
T1CON = 0x00;//——TIMER1 控制寄存器(地址:10h)
/*
T1GINV(1) TMR1GE(2) T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
0 0 1 1 0 0 0 0
bit 7 T1GINV:Timer1 门控反转位(1)
1 = Timer1 门控反转
0 = Timer1 门控未反转
bit 6 TMR1GE:Timer1 门控使能位(2)
如果TMR1ON = 0:
该位被忽略
如果TMR1ON = 1:
1 = 如果Timer1 门控不处于激活状态,则开启Timer1
0 = 开启Timer1
bit 5-4 T1CKPS<1:0>:Timer1 输入时钟预分频比选择位
11 = 1:8 预分频比
10 = 1:4 预分频比
01 = 1:2 预分频比
00 = 1:1 预分频比
bit 3 T1OSCEN:LP 振荡器使能控制位
如果不带CLKOUT 振荡器的INTOSC 处于激活状态:
1 = LP 振荡器使能作为Timer1 的时钟
0 = LP 振荡器关闭
否则:
该位被忽略
bit 2 T1SYNC:Timer1 外部时钟输入同步控制位
TMR1CS = 1:
1 = 不同步外部时钟输入
0 = 同步外部时钟输入
TMR1CS = 0:
该位被忽略。Timer1 使用内部时钟。
bit 1 TMR1CS:Timer1 时钟源选择位
1 = 使用来自T1CKI 引脚(在上升沿)的外部时钟
0 = 内部时钟(FOSC/4)
bit 0 TMR1ON:Timer1 启动控制位
1 = 使能Timer1
0 = 停止Timer1
注 1:T1GINV 位反转Timer1 门控逻辑,无论其来源为何。
2: 要将T1G 引脚或C2OUT (选择哪个由T1GSS 位(CM2CON1<1>)控制)用作
Timer1 门控源,必须将TMR1GE 位置1。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -