BASIC4MCU | AVR | 타이머 | mega128 스톱워치
페이지 정보
작성자 키트 작성일2017-08-29 09:27 조회4,437회 댓글0건본문
//=====================================================
// 코드비젼 컴파일러 사용
// 11.0592MHz
//=====================================================
#pragma opt- //최적화금지옵션
//=====================================================
#include <mega128.h>
//=====================================================
#define fnd_common_off PORTB=0xFF
#define fnd_common1 PORTB.0
#define fnd_common2 PORTB.1
#define fnd_common3 PORTB.2
#define fnd_common4 PORTB.3
#define fnd_data PORTC
//=====================================================
#define on 0
#define of 1
//=====================================================
// 7 Segment Pattern Data
// bit별 Segment 위치 GFEDCBA
#define SEG_0 0xC0 // &B11000000 0 ****A***
#define SEG_1 0xF9 // &B11111001 1 * *
#define SEG_2 0xA4 // &B10100100 2 F B
#define SEG_3 0xB0 // &B10110000 3 * *
#define SEG_4 0x99 // &B10011001 4 ****G***
#define SEG_5 0x92 // &B10010010 5 * *
#define SEG_6 0x82 // &B10000010 6 E C
#define SEG_7 0xD8 // &B11011000 7 * *
#define SEG_8 0x80 // &B10000000 8 ****D***
#define SEG_9 0x98 // &B10011000 9
#define SEG_BLK 0xFF // &B11111111 10 BLANK
// FND 변수 ===================================================
char fnd_tbl[] = {SEG_0, SEG_1, SEG_2, SEG_3, SEG_4, SEG_5, SEG_6, SEG_7, SEG_8, SEG_9, SEG_BLK
};
//=====================================================
#define ON 0
#define OFF 1
//=====================================================
// Variable Declaration
//=====================================================
bit CntFlg=0;
char sec10=0, sec1=0, msec10=0, msec1=0;
char fnd_cnt=0;
//=====================================================
// Interrupt Service Routinue
//=====================================================// 외부인터럽트0
interrupt [EXT_INT0] void ext_int0_isr(void){ // 정지/시작CntFlg=~CntFlg;
}
//=====================================================// 외부인터럽트1
interrupt [EXT_INT1] void ext_int1_isr(void){ // 리셋CntFlg=0;
sec10=sec1=msec10=msec1=0;
}
//=====================================================interrupt [TIM1_COMPA] void timer1_compa_isr(void){ //10msec
//time count-up
if(CntFlg){
msec1++;
if(msec1 >9){ msec1=0; msec10++; }
if(msec10>9){ msec10=0; sec1++; }
if(sec1 >9){ sec1=0; sec10++; }
if(sec10 >9) sec10=0;
}//segment display
fnd_common_off;
if (fnd_cnt==0){ fnd_data=fnd_tbl[sec10]; fnd_common1=on; fnd_cnt++; }//10sec
else if(fnd_cnt==1){ fnd_data=fnd_tbl[sec1]; fnd_common2=on; fnd_cnt++; }//1sec
else if(fnd_cnt==2){ fnd_data=fnd_tbl[msec10]; fnd_common3=on; fnd_cnt++; }//0.1sec
else { fnd_data=fnd_tbl[msec1]; fnd_common4=on; fnd_cnt=0; }//0.01sec
}
//=====================================================// Main Routinue
//=====================================================
void main(void){
DDRB=0xff; //FND common
DDRC=0xff; //FND data
//11059200 / 1024 / (1 + 107)=100, 10msec
TCCR1B=0x0d; OCR1A=107; TIMSK=0x10;
// 외부 인터럽트0,1
PORTD=0xff; // 인터럽트 스위치 내부풀업저항 사용
EICRA=0x0a; EIMSK=0x03; //falling edge
#asm("sei")
while(1){}
}
//=====================================================
댓글 0
조회수 4,437등록된 댓글이 없습니다.