📄 f_13_6_timekeep2sec.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;
#if defined(HI_TECH_C)
void interrupt timer_isr(void)
#endif
#if defined(__18CXX)
#pragma interrupt timer_isr
void timer_isr(void)
#endif
{
if (TMR1IF) {
TMR1IF = 0;
secs = secs + 2; // seconds
if (secs == 60) {
mins++;
secs = 0;
if (mins == 60) {
mins = 0;
hours++;
if (hours == 24) hours = 0;
}
}
}
}
void main(void){
// 19200 in HSPLL mode, crystal = 7.3728 MHz
serial_init(95,1);
// 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;
pcrlf();
#if defined(HI_TECH_C)
printf("(2 sec version) Enter hours, mins, secs: ");
scanf("%d %d %d", &hours, &mins, &secs);
#endif
#if defined(__18CXX)
printf("Timekeeping, 2 sec version ");pcrlf();
//because MCC18 lacks scanf, just hardcode initialize hours,mins,secs
hours = 0; mins = 0; secs = 0; old_secs = 0;
#endif
TMR1IF = 0; // clear timer 1 interrupt flag
TMR1IE = 1; // allow timer 1 interrupts
TMR1ON = 1; // enable timer 1
IPEN = 0; // priorities disabled
PEIE = 1; GIE = 1;
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 + -