#include<p18cxxx.h>
#include<p18f24j11.h>
#include<rtcc.h>
#include<pconfig.h>
#include<i2c.h>
#include<delays.h>
#pragma config DEBUG = ON //使能后台调试器; RB6 和RB7 专用于在线调试
//#pragma config XINST = ON //使能指令集扩展和变址寻址模式
#pragma config XINST = OFF //禁止指令集扩展和变址寻址模式
#pragma config STVREN = OFF //禁止堆栈上溢/ 下溢复位
//#pragma config STVREN = ON
#pragma config WDTEN = OFF //禁止WDT (由SWDTEN 位控制)
//#pragma config CP0 = ON //程序存储器受代码保护
#pragma config CP0 = OFF //程序存储器不受代码保护
//#pragma config FCMEN = ON //使能故障保护时钟监视器
#pragma config FCMEN = OFF //禁止故障保护时钟监视器
#pragma config IESO = OFF //禁止双速启动
//#pragma config IESO = ON //禁止双速启动
#pragma config LPT1OSC = OFF //Timer1 振荡器配置为高功耗工作
#pragma config T1DIG = ON //无论T1OSCEN(T1CON<3>)的状态如何,都可以选择辅助振荡器时钟源(OSCCON<1:0> = 01)
//#pragma config T1DIG = OFF //除非T1CON<3> = 1,否则不能选择辅助振荡器时钟源
//#pragma config OSC = INTOSC //INTOSC 内部振荡器模块(INTRC/INTOSC), RA6 和RA7 均用作端口引脚
#pragma config OSC = INTOSCO //INTOSC 内部振荡器模块(INTRC/INTOSC), RA6 和RA7 均用作端口引脚
#pragma config WDTPS = 32768 //1:32,768
#pragma config RTCOSC = T1OSCREF //RTCC 使用T1OSC/T1CKI 作为参考时钟
//#pragma config RTCOSC = INTOSCREF
#pragma config DSWDTOSC = T1OSCREF //DSWDT 使用T1OSC/T1CKI 作为参考时钟
#pragma config DSBOREN = OFF //在深度休眠模式下禁止BOR
#pragma config DSWDTEN = OFF //禁止DSWDT
#pragma config IOL1WAY = OFF //IOLOCK 位(PPSCON<0>)可以根据需要置1 和清零,前提是已经完成解锁序列
#pragma config MSSP7B_EN = MSK7 //使能7 位地址掩码模式
#pragma config WPCFG = OFF //除非WPEND 和WPFP<5:0> 设置保护配置字页,否则不对配置字页进行擦/ 写保护
//-------------------------------------------------------
// RTCC模块写开锁
//-------------------------------------------------------
void RTCCUnlock(void)
{
_asm movlb 0x0f _endasm
_asm movlw 0x55 _endasm
_asm movwf EECON2,0 _endasm
_asm movlw 0xAA _endasm
_asm movwf EECON2,0 _endasm
_asm bsf RTCCFG,5,1 _endasm
}
//-------------------------------------------------------
// 设置RTCC初始值子函数
//-------------------------------------------------------
void setRTCCtime(void)
{
RTCCFG|=0X03;
while(RTCCFGbits.RTCSYNC);
RTCVALL=0X12; //year 12年
RTCVALH=0; //保留位无用
RTCVALL=0X12; //day 11日
RTCVALH=0X12; //month 12月
RTCVALL=0X16; //hour 16时
RTCVALH=3; //weekday 星期二
RTCVALL=0X00; //second 0秒
RTCVALH=0X39; //minute 39分
}
//-------------------------------------------------------
// 设置RTCC闹钟值子函数
//-------------------------------------------------------
void setRTCCalarm(void)
{
ALRMCFG|=0x03;
ALRMVALL=0X12; //year 12年
ALRMVALH=0; //保留位无用
ALRMVALL=0X12; //day 11日
ALRMVALH=0X12; //month 12月
ALRMVALL=0X16; //hour 14时
ALRMVALH=3; //weekday 星期五
ALRMVALL=0X59; //second 59秒
ALRMVALH=0X39; //minute 39分
}
//-------------------------------------------------------
// RTCC初始化子函数
//-------------------------------------------------------
void RTCC_init(void)
{
T1GCON=0x00; // 禁止TIMER1门控
//T1GCON=0x80; // 使能TIMER1门控
T1CON=0x8f; //Timer1使用外部时钟、1:1预分频比、TIMER1振荡器使能、不同步、16位读写、使能TIMER1
delay_nms(10);
TCLKCON=0x00; //ECCP1和ECCP2 均使用Timer3 (捕捉/ 比较)和Timer4 (PWM)
RTCCFG=0X07; //RTCC功能禁止、不能写入值寄存器、使能RTCC时钟输出、值指针置为11
RTCCAL=0X00; //RTCC校准寄存器00000000 无调整
//PADCFG1=0x02; //RTCC引脚输出秒时钟脉冲
//PADCFG1=0x00; //RTCC引脚输出闹钟时钟脉冲
PADCFG1=0x06; //RTCC引脚输出闹钟时钟脉冲
ALRMCFG=0xcf; //闹钟使能 响铃使能 闹钟间隔为1分钟
ALRMRPT=0xff; //闹钟重复计数器位设为 11111111
RTCCUnlock(); //根据DATASHEET参考程序写开锁
RTCCFGbits.RTCEN=1; //使能RTCC 模块
setRTCCtime();
PIE3bits.RTCCIE=1; //RTCC中断允许
IPR3bits.RTCCIP=1; //RTCC中断高优先级
PIR3bits.RTCCIF=0; //中断标志位清零
setRTCCalarm();
RTCCFGbits.RTCWREN = 0;
}
//-------------------------------------------------------
// 中断子函数
//-------------------------------------------------------
#pragma code InterruptVectorHigh =0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh
_endasm
}
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh (void)
{
if(PIR3bits.RTCCIF)
{
PIR3bits.RTCCIF=0;
EDP_send();
}
}
void main(void)
{
OSCCON=0x68; //内部振荡器频率为4MHZ
RCON=0x80; //复位控制寄存器
INTCON=0xc0;
RTCC_init();
I2C_init();
EDP_init();
EDP_send();
while(1);
}
程序只摘了一部分跟RTCC有关系的 现在的问题是 RTCC的不走
请大神帮助 就50分 都给了
|