BASIC4MCU | 질문게시판 | 외부 인터럽트 질문입니다.
페이지 정보
작성자 슬레이브 작성일2020-12-17 16:11 조회3,522회 댓글2건본문
우선 프로그램 구동시켜 보지 않고 질문 드려 죄송합니다.
현재 구동시켜 볼만한 여건이 못되어 양해 부탁드립니다.
0.1초 단위로 세그먼트가 증가하고, 10초마다 led를 점등시키고, 스위치가 눌리면 해당 자릿수를 초기화 하는 소스를 만들었습니다.
질문
1. 세그먼트 자릿수 초기화를 맨 마지막 인터럽트 소스로 처리가 가능할까요?
2. void Seg4_out(int) 썼으면 그 아래 선언되는 함수들도 똑같이 (int) 이렇게 써주어야 하나요?
소스에 빨간 글씨로 표시된 부분을 보면 num, int num으로 되어있는데 상관이 없을까요?
예제로 응용만 하려고 하다 보니 기초가 많이 부족합니다.
#include <mega128.h>
#include <delay.h>
typedef unsigned char u_char;
flash char seg_pat[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
u_char s4=0, s3=0, s2=0, s1=0;
void Seg4_out(int);
void main(void) {
int i;
int num=0;
DDRB=0xF0;
DDRD=0xF0;
DDRG=0x0F;
DDRC=0xFF;
EIMSK=0b11110000;
EICRB=0b10101010;
SERG=0x80;
while(1) {
Seg4_out(num);
num++;
if(num>9999)num=0;
while(1){
for(i=0;i<9;i++){ PORTC=(1<<i)-1; delay_ms(10000); }
}
}
}
void Seg4_out(int num) {
int i;
s1=n/1000; s2=n/100%10; s3=n/10%10; s4=n%10;
for(i=0,i<5,i++){
PORTG = 0b00001000;
PORTD = ((seg_pat[s4] &0x0F)<<4) | (PORTD & 0x0F);
PORTB = (seg_pat[s4] &0x70) | (PORTB & 0x0F);
delay_ms(5);
PORTG = 0b00000100;
PORTD = ((seg_pat[s3] &0x0F)<<4) | (PORTD & 0x0F);
PORTB = (seg_pat[s3] &0x70) | (PORTB & 0x0F);
PORTB = PORTB | 0x80;
delay_ms(5);
PORTG = 0b00000010;
PORTD = ((seg_pat[s2] &0x0F)<<4) | (PORTD & 0x0F);
PORTB = (seg_pat[s2] &0x70) | (PORTB & 0x0F);
delay_ms(5);
PORTG = 0b00000001;
PORTD = ((seg_pat[s1] &0x0F)<<4) | (PORTD & 0x0F);
PORTB = (seg_pat[s1] &0x70) | (PORTB & 0x0F);
delay_ms(5);
}
}
interrupt [EXT_INT4] void external_int4(void) {
s4=0 ; }
interrupt [EXT_INT5] void external_int5(void) {
s3=0 ; }
interrupt [EXT_INT6] void external_int6(void) {
s2=0 ; }
interrupt [EXT_INT7] void external_int7(void) {
s1=0 ; }
댓글 2
조회수 3,522master님의 댓글
master 작성일인터럽트 함수안에서 초기화를 위한 코드를 실행시키면 됩니다.
master님의 댓글
master 작성일
#include <mega128.h>
#include <delay.h>
//
typedef unsigned char u_char;
flash char seg_pat[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
u_char s4=0, s3=0, s2=0, s1=0;
//
void Seg4_out(int num) {
int i;
s1=n/1000; s2=n/100%10; s3=n/10%10; s4=n%10;
for(i=0,i<5,i++){
PORTG = 0b00001000; PORTD = ((seg_pat[s4] &0x0F)<<4) | (PORTD & 0x0F); PORTB = (seg_pat[s4] &0x70) | (PORTB & 0x0F); delay_ms(5);
PORTG = 0b00000100; PORTD = ((seg_pat[s3] &0x0F)<<4) | (PORTD & 0x0F); PORTB = (seg_pat[s3] &0x70) | (PORTB & 0x0F); PORTB = PORTB | 0x80; delay_ms(5);
PORTG = 0b00000010; PORTD = ((seg_pat[s2] &0x0F)<<4) | (PORTD & 0x0F); PORTB = (seg_pat[s2] &0x70) | (PORTB & 0x0F); delay_ms(5);
PORTG = 0b00000001; PORTD = ((seg_pat[s1] &0x0F)<<4) | (PORTD & 0x0F); PORTB = (seg_pat[s1] &0x70) | (PORTB & 0x0F); delay_ms(5);
}
}
//
interrupt [EXT_INT4] void external_int4(void) { s4=0 ; }
interrupt [EXT_INT5] void external_int5(void) { s3=0 ; }
interrupt [EXT_INT6] void external_int6(void) { s2=0 ; }
interrupt [EXT_INT7] void external_int7(void) { s1=0 ; }
//
void main(void) {
int i,num=0;
DDRB=0xF0; DDRD=0xF0; DDRG=0x0F; DDRC=0xFF;
EIMSK=0b11110000; EICRB=0b10101010; SERG=0x80;
while(1) {
Seg4_out(num);
if(++num>9999)num=0;
for(i=0;i<9;i++){ PORTC=(1<<i)-1; delay_ms(10000); }
}
}