BASIC4MCU | 질문게시판 | ATmega128 인터럽트를 이용한 타이머 카운터
페이지 정보
작성자 코드비전 작성일2022-11-24 14:42 조회3,738회 댓글1건본문
0000~9999까지 세그먼트 타이머 카운터입니다이걸 이용해서 인터럽트4를 누를 떄 0000~9999를 동작하는 걸 원합니다interrupt [EXT_INT4] void external_int4(void) 이거를 이용해서 해주세요 제발요 너무 오랜시간 생각해서 머리 터질거같습니다#include <mega128.h>#include <delay.h>int iSeg=0;int Show;unsigned char Seg[4]={0x70, 0xb0, 0xd0, 0xe0};unsigned char NUM[20] = {0xaf, 0xa0, 0x97, 0xb5, 0xb8, 0x3d, 0x3b, 0xa4, 0xbf,0xbc};interrupt [TIM0_COMP] void timer0_comp_isr(void){PORTF=Seg[iSeg];switch(iSeg){case 3:PORTB=NUM[Show/1000%10];break;case 2:PORTB=NUM[Show/100%10];break;case 1:PORTB=NUM[Show/10%10];break;case 0:PORTB=NUM[Show%10];break;}iSeg++;iSeg=iSeg%4;}void main(){DDRB = 0xff; //segment dataDDRF = 0xf0; //segment selectTCCR0=0x0f; //ctc mode prescale 1024OCR0 = 76;TIMSK = 0x02;SREG = 0x80;Show=0000;while(1){delay_ms(1);Show++;}}
댓글 1
조회수 3,738master님의 댓글
master 작성일
#include <mega128.h>
#include <delay.h>
//
unsigned char NUM[20]={0xaf,0xa0,0x97,0xb5,0xb8,0x3d,0x3b,0xa4,0xbf,0xbc};
unsigned char Seg[4]={0x70,0xb0,0xd0,0xe0};
//
int iSeg=0,mode=0,Show=0,mm=0,ss=0;
//
interrupt [EXT_INT4] void external_int4(void){ mode=0; }
interrupt [EXT_INT5] void external_int5(void){ mode=1; }
//
interrupt [TIM0_COMP] void timer0_comp_isr(void){ // 1ms
PORTF=Seg[iSeg];
switch(iSeg){
case 3: PORTB=NUM[Show/1000%10]; break;
case 2: PORTB=NUM[Show/100%10]; break;
case 1: PORTB=NUM[Show/10%10]; break;
case 0: PORTB=NUM[Show%10]; break;
}
iSeg=(iSeg+1)%4;
}
//
void main(){
DDRB=0xff; //segment data
DDRF=0xf0; //segment select
TCCR0=0x0f; OCR0=14; TIMSK=0x02; //ctc mode prescale 1024
EICRB=0xAA; EIMSK=0x30;
SREG=0x80;
while(1){
if(mode==0){ if(++Show>9999)Show=0; delay_ms(10); } // 스탑워치 0~9999
if(mode==1){ // 시계
ss=Show%60; mm=Show/60;
if(++ss>59){ ss=0; if(++mm>59)mm=0; }
Show=mm*100 + ss;
}
}
}