⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f_13_6_timekeep2sec.c

📁 * Use 10 MHz crystal frequency. * Use Timer0 for ten millisecond looptime. * Blink "Alive" LED e
💻 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 + -