📄 f_13_14_timekeep1sec.c
字号:
#include "config.h"
#include "serial.c"
#include "serio.c"
// does simple timekeeping, assumes 32.768KHz ext. clk
volatile unsigned char hours, mins, secs,old_secs;
// interrupted every second
#if defined(HI_TECH_C)
void interrupt timer_isr(void)
#endif
#if defined(__18CXX)
#pragma interrupt timer_isr
void timer_isr(void)
#endif
{
if (CCP1IF) {
CCP1IF = 0;
secs = secs + 1; // seconds
if (secs == 60) {
mins++; secs = 0;
if (mins == 60) {
hours++; mins = 0;
if (hours == 24) hours = 0;
}
}
}
}
void main(void){
serial_init(95,1); // 19200 in HSPLL mode, crystal = 7.3728 MHz
// initialize timer 1
// prescale by 1
T1CKPS1 = 0; T1CKPS0 = 0;
T1OSCEN = 0; // disable the oscillator
TMR1CS = 1; //use external clock
T1SYNC = 0; // sync extern clock
// set T1CKI/RC0 as input
TRISC0 = 1;
// initialize CCPR1 for compare
CCPR1H = 0x80; CCPR1L = 0x00;
CCP1CON = 0x0B; // special event trigger
pcrlf();
#if defined(HI_TECH_C)
printf("(1 sec version) Enter hours, mins, secs: ");
scanf("%d %d %d", &hours, &mins, &secs);
#endif
#if defined(__18CXX)
printf("Timekeeping, 1 sec version ");pcrlf();
//because MCC18 lacks scanf, just hardcode initialize hours,mins,secs
hours = 0; mins = 0; secs = 0; old_secs = 0;
#endif
CCP1IF = 0; // clear CCP1IF interupt flag
CCP1IE = 1; // capture interrupt enable
TMR1ON = 1; // enable timer 1
IPEN = 0; PEIE = 1; GIE = 1;
old_secs = secs;
while(1) {
while(secs == old_secs);
old_secs = secs;
pcrlf();printf(" %d:%d:%d",hours,mins,secs);
}
}
//for MCC18, place the interrupt vector goto
#if defined(__18CXX)
#if defined(HIGH_INTERRUPT)
#pragma code HighVector=HIGH_INTERRUPT
#else
#pragma code HighVector=0x0008
#endif
void HighVector (void)
{
_asm goto timer_isr _endasm
}
#pragma code
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -