📄 main.c
字号:
*/
CM1CON0 = 0x00;//——比较器C1 的控制寄存器0 (地址:119h)
/*
C1ON C1OUT C1OE C1POL — C1R C1CH1 C1CH0
0 0 0 0 0 0 0 0
bit 7 C1ON:比较器C1 使能位
1 = C1 比较器使能
0 = C1 比较器禁止
bit 6 C1OUT:比较器C1 输出位
如果C1POL = 1 (极性反相):
C1OUT = 1, C1VP < C1VN
C1OUT = 0, C1VP > C1VN
如果C1POL = 0 (极性非反相):
C1OUT = 1, C1VP > C1VN
C1OUT = 0, C1VP < C1VN
bit 5 C1OE:比较器C1 输出使能位
1 = C1OUT 出现在RA2/AN2/T0CKI/INT/C1OUT 引脚上(1)
0 = C1OUT 仅在内部有效
bit 4 C1POL:比较器C1 输出极性选择位
1 = C1OUT 逻辑反相
0 = C1OUT 逻辑未反相
bit 3 未用:读为0
bit 2 C1R:比较器C1 参考选择位(非反相输入)
1 = C1VP 连接至C1VREF 输出
0 = C1VP 连接至RA0/AN0/C1IN+/ICSPDAT/ULPWU
bit 1-0 C1CH<1:0>:比较器C1 通道选择位
00 = C1 的C1VN 连接至RA1/AN1/C12IN-/VREF/ICSPCLK
01 = C1 的C1VN 连接至RC1/AN5/C12IN-
10 = C1 的C1VN 连接至RC2/AN6/P1D
11 = C1 的C1VN 连接至RC3/AN7/P1C
注 1:C1OUT 仅在以下情况时驱动RA2/AN2/T0CKI/INT/C1OUT:
C1OE = 1, C1ON = 1 且TRISA<2> = 0。
*/
CM2CON0 = 0x00;//——比较器2 的控制寄存器0 (地址:11AH)
/*
C2ON C2OUT C2OE C2POL — C2R C2CH1 C2CH0
0 0 0 0 0 0 0 0
bit 7 C2ON:比较器C2 使能位
1 = C2 比较器使能
0 = C2 比较器禁止
bit 6 C2OUT:比较器C2 输出位
如果C2POL = 1 (极性反相):
C2OUT = 1, C2VP < C2VN
C2OUT = 0, C2VP > C2VN
如果C2POL = 0 (极性非反相):
C2OUT = 1, C2VP > C2VN
C2OUT = 0, C2VP < C2VN
bit 5 C2OE:比较器C2 输出使能位
1 = C2OUT 出现在RC4/C2OUT/P1B 上(1)
0 = C2OUT 仅在内部有效
bit 4 C2POL:比较器C2 输出极性选择位
1 = C2OUT 逻辑反相
0 = C2OUT 逻辑未反相
bit 3 未用:读为0
bit 2 C2R:比较器C2 参考选择位(非反相输入)
1 = C2VP 连接至C2VREF
0 = C2VP 连接至RC0/AN4/C2IN+
bit 1-0 C2CH<1:0>:比较器C2 通道选择位
00 = C2 的C2VN 连接至RA1/AN1/C12IN-/VREF/ICSPCLK
01 = C2 的C2VN 连接至RC1/AN5/C12IN-
10 = C2 的C2VN 连接至RC2/AN6/P1D
11 = C2 的C2VN 连接至RC3/AN7/P1C
注 1:C2OUT 仅在以下情况驱动RC4/C2OUT/P1B:
C2OE = 1, C2ON = 1 且TRISC<4> = 0。
*/
CM2CON1 = 0x00;//——比较器2 的控制寄存器1 (地址:11Bh)
/*
MC1OUT MC2OUT — — — — T1GSS C2SYNC
0 0 0 0 0 0 0 0
bit 7 MC1OUT:C1OUT 位的镜像副本(CM1CON0<6>)
bit 6 MC2OUT:C2OUT 位的镜像副本(CM2CON0<6>)
bit 5-2 未用:读为0
bit 1 T1GSS:Timer1 门控源选择位
1 = Timer1 门控源为RA4/AN3/T1G/OSC2/CLKOUT
0 = Timer1 门控源为C2OUT
bit 0 C2SYNC:C2 输出同步模式位
1 = C2 输出与Timer1 时钟下降沿同步
0 = C2 输出异步
*/
// SRCON = 0x00;//——SR 锁存器控制寄存器(地址:19Eh)
// /*
// SR1(2) SR0(2) C1SEN C2REN PULSS PULSR — —
//
// bit 7-6 SR<1:0>:SR 锁存器配置位(2)
// 00 = SR锁存器禁止
// 01 = SR锁存器使能。C1OUT 引脚为锁存非反相输出。C2OUT 引脚为C2 比较器输出。
// 10 = SR锁存器使能。C1OUT 引脚为C1 比较器输出。C2OUT 引脚为锁存反相输出。
// 11 = SR锁存器使能。C1OUT 引脚为锁存非反相输出。C2OUT 引脚为锁存反相输出。
// bit 5 C1SEN:C1 置1 使能位
// 1 = C1比较器输出将SR 锁存器置1
// 0 = C1比较器输出对SR 锁存器没有影响
// bit 4 C2REN:C2 复位使能位
// 1 = C2比较器输出将SR 锁存器复位
// 0 = C2比较器输出对SR 锁存器没有影响
// bit 3 PULSS:为SR 锁存器位提供置位输入脉冲
// 1 = 脉冲输入
// 0 = 始终读回0
// bit 2 PULSR:为SR 锁存器位提供复位输入脉冲
// 1 = 脉冲输入
// 0 = 始终读回0
// bit 1-0 未用:读为0。
// 注 1: 不管SR 锁存器的操作如何,CM1CON0 和CM2CON0 寄存器的C1OUT 或C2OUT
// 位总是反映实际的比较器输出(不是引脚)。
// 2: 要在引脚上使能SR 锁存器输出,相应的C1OE、C2OE、TRISA2 和TRISC4 位
// (分别位于CM1CON0、CM2CON0、TRISA 和TRISC 寄存器中)必须正确配置。
// */
//
// VRCON = 0x00;//——电压参考控制寄存器(地址:118h)
// /*
// C1VREN C2VREN VRR VP6EN VR3 VR2 VR1 VR0
//
// bit 7 C1VREN:比较器1 参考电压使能位
// 1 = CVREF 电路上电并路由到比较器1 的C1VREF 输入
// 0 = 0.6 伏常量参考电压路由到比较器1 的C1VREF 输入
// bit 6 C2VREN:比较器2 参考电压使能位
// 1 = CVREF 电路上电并路由到比较器2 的C2VREF 输入
// 0 = 0.6 伏常量参考电压路由到比较器2 的C2VREF 输入
// bit 5 VRR:比较器参考电压CVREF 范围选择位
// 1 = 低电平范围
// 0 = 高电平范围
// bit 4 VP6EN:0.6V 参考电压使能位
// 1 = 使能
// 0 = 禁止
// bit 3-0 VR<3:0>:比较器参考电压CVREF 值选择0 ≤ VR<3:0> ≤ 15
// 当VRR = 1:CVREF = (VR<3:0>/24) * VDD
// 当VRR = 0:CVREF = VDD/4 + (VR<3:0>/32) * VDD
//
// */
ANSEL = 0x00;//——模拟选择寄存器(地址:11Eh)
/*
ANS7 ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0
0 0 0 0 0 0 0 0
bit 7-0 ANS<7:0>:模拟选择位
可将AN<7:0> 引脚的功能分别选为模拟或数字。
1 = 模拟输入。分配引脚为模拟输入。(1)
0 = 数字I/O。分配引脚为端口或特殊功能。
注1: 将引脚设置为模拟输入将自动禁止数字输入电路、弱上拉和电平变化中断(如果可
用)。必须将相应的TRIS 位设置为输入模式,以允许从外部控制引脚电压。
*/
ANSELH = 0x00;//——模拟选择高位寄存器(地址:11Fh)
/*
— — — — ANS11 ANS10 ANS9 ANS8
0 0 0 0 0 0 0 0
bit 7-4 未用:读为0。
bit 3-0 ANS<11:8>:模拟选择位
可将AN<11:8> 引脚的功能分别选为模拟或数字。
1 = 模拟输入。分配引脚为模拟输入。(1)
0 = 数字I/O。分配引脚为端口或特殊功能。
注1: 将引脚设置为模拟输入将自动禁止数字输入电路、弱上拉和电平变化中断(如果可
用)。必须将相应的TRIS 位设置为输入模式,以允许从外部控制引脚电压。
*/
ADCON0 = 0x0D;//——A/D 控制寄存器(地址:1Fh)
/*
ADFM VCFG CHS3 CHS2 CHS1 CHS0 GO/DONE ADON
0 0 0 0 1 1 0 1
bit 7 ADFM:A/D 结果格式选择位
1 = 右对齐
0 = 左对齐
bit 6 VCFG:参考电压位
1 = VREF 引脚
0 = VDD
bit 5-2 CHS<3:0>:模拟通道选择位
0000 = 通道00 (AN0)
0001 = 通道01 (AN1)
0010 = 通道02 (AN2)
0011 = 通道03 (AN3)
0100 = 通道04 (AN4)
0101 = 通道05 (AN5)
0110 = 通道06 (AN6)
0111 = 通道07 (AN7)
1000 = 通道08 (AN8)
1001 = 通道09 (AN9)
1010 = 通道10 (AN10)
1011 = 通道11 (AN11)
1100 = CVREF
1101 = VP6
1110 = 保留。不使用。
1111 = 保留。不使用。
bit 1 GO/DONE:A/D 转换状态位
1 = A/D 转换正在进行。将该位置1 可启动A/D 转换。
A/D 转换完成后,该位由硬件自动清零。
0 = A/D 转换已完成/ 未进行。
bit 0 ADON: A/D 使能位
1 = A/D 转换器模块正在运行
0 = A/D 转换器被关闭且不消耗工作电流
*/
ADCON1 = 0x30;//——A/D 控制寄存器1 (地址:9Fh)
/*
— ADCS2 ADCS1 ADCS0 — — — —
0 0 1 1 0 0 0 0
bit 7 未用:读为0
bit 6-4 ADCS<2:0>:A/D 转换时钟选择位
000 = FOSC/2
001 = FOSC/8
010 = FOSC/32
x11 = FRC (由专用内部振荡器产生的时钟,其频率的最大值为500 kHz)
100 = FOSC/4
101 = FOSC/16
110 = FOSC/64
bit 3-0 未用:读为0
*/
// PSTRCON = 0x10;//——脉冲转向控制寄存器(1, 2) (地址:19Dh)
/*
— — — STRSYNC STRD STRC STRB STRA
0 0 0 1 0 0 0 0
bit 7-5 未用:读为0
bit 4 STRSYNC:转向同步位
1 = 在下一个PWM 周期发生输出转向更新
0 = 在指令周期边界的开始发生输出转向更新
bit 3 STRD:转向使能位D
1 = P1D 引脚的PWM 波形极性受CCPM<1:0> 控制
0 = P1D 引脚分配为端口引脚
bit 2 STRC:转向使能位C
1 = P1C 引脚的PWM 波形极性受CCPM<1:0> 控制
0 = P1C 引脚分配为端口引脚
bit 1 STRB:转向使能位B
1 = P1B 引脚的PWM 波形极性受CCPM<1:0> 控制
0 = P1B 引脚分配为端口引脚
bit 0 STRA:转向使能位A
1 = P1A 引脚的PWM 波形极性受CCPM<1:0> 控制
0 = P1A 引脚分配为端口引脚
*/
// PWM1CON = 0x00;//——增强型PWM 配置寄存器(1) (地址:1Ch)
/*
PRSEN PDC6 PDC5 PDC4 PDC3 PDC2 PDC1 PDC0
0 0 0 0 0 0 0 0
bit 7 bit 0
bit 7 PRSEN:PWM 重新启动使能位
1 = 自动关闭时,一旦关闭事件消失, ECCPASE 位自动清零; PWM 自动重新启动。
0 = 自动关闭时, ECCPASE 必须用软件清零以重新启动PWM。
bit 6-0 PDC<6:0>:PWM 延时计数位
PDCn = 在PWM 信号应该转换为有效的预定时间和转换为有效的实际时间之间的FOSC/4
(4*TOSC) 周期数。
注1: 仅限PIC16F685/PIC16F690
*/
// ECCPAS = 0x80;//——增强型捕捉/ 比较/PWM+ 自动关闭控制寄存器(1) (地址:1Dh)
/*
ECCPASE ECCPAS2 ECCPAS1 ECCPAS0 PSSAC1 PSSAC0 PSSBD1 PSSBD0
1 0 0 0 0 0 0 0
bit 7 ECCPASE:ECCP 自动关闭事件状态位
1 = 发生了关闭事件; ECCP 输出为关闭状态
0 = ECCP 输出正在操作
bit 6-4 ECCPAS<2:0>:ECCP 自动关闭源选择位
000 = 禁止自动关闭
001 = 比较器1 输出更改
010 = 比较器2 输出更改
011 = 比较器1 或2 更改
100 = INT 引脚的VIL
101 = INT 引脚的VIL 或比较器1 更改
110 = INT 引脚的VIL 或比较器2 更改
111 = INT 引脚的VIL 或比较器1 或比较器2 更改
bit 3-2 PSSACn:引脚P1A 和P1C 关闭状态控制位
00 = 驱动引脚P1A 和P1C 为0
01 = 驱动引脚P1A 和P1C 为1
1x = 引脚P1A 和P1C 为三态
bit 1-0 PSSBDn: 引脚P1B 和P1D 关闭状态控制位
00 = 驱动引脚P1B 和P1D 为0
01 = 驱动引脚P1B 和P1D 为1
1x = 引脚P1B 和P1D 为三态
注1: 仅限PIC16F685/PIC16F690。
*/
CCP1CON = 0x00;
}
/*
LED 状态表
-----------------------------------------------------------------
| MS7 | MS6 | MS5 | MS4 | MS3 | MS2 | MS1 | MS0 |
-----------------------------------------------------------------
| - | - | - | - | LED4 | LED3 | LED2 | LED1 |
-----------------------------------------------------------------
*/
void LEDState(INT8U State)
{
ByteVar temp;
temp.unByte = ~State;
RB7 = temp.stBit.b0;
RC7 = temp.stBit.b1;
RC6 = temp.stBit.b2;
RC3 = temp.stBit.b3;
}
void main(void)
{
INT8U i,k,len;
Delay_Xms(250);
MCU_Ini();
POWER_ON_RESET();
SpiReadTest();
LEDState(0x01);
while(1);
// Initial_RF();
LEDState(0x01);
k = 1;
while(1)
{
#ifdef _tx_
k = ~k;
for(i=0;i<4;i++)
{
if(k)
{
TxBuf[i] = 0x99-i;
}
else
{
TxBuf[i] = 0x99-10-i;
}
}
// Reset_Tx_FIFO();
// Delay_Xms(13);
// Enter_Tx_STATE();
// Delay_Xms(13);
TxD_RF(4,TxBuf);
if(k) LEDState(0x01);
else LEDState(0);
Delay_Xms(100);
#else
len = 10;
if(RxD_RF(&len,RxBuf))
{
k <<= 1;
if(k >= 0x10) k = 1;
LEDState(k);
}
else continue;
#endif
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -