답변 : FND출력문제
페이지 정보
작성자 master 작성일18-06-30 20:45 조회7,762회 댓글0건본문
// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2018-06-30 오후 8:47:17
// by Ok-Hyun Park
//
FND 구동이 잘 되지 않습니다.
처음 FND시작할때도 0000으로 뜨지않고
스위치를 누르면 seg[17]에 순서대로 업다운이 가능해야하는데
FND설정이 잘못되었는지 숫자가 제대로 표시가 안됩니다.
case문 순서를 바꾼이유는 FND가 천의자리숫자부터 일의자리숫자까지 전부 반대로 되어있어서수정을 하였습니다.
스위치 4,5번으로 통한 LED 좌우 시프트는 잘 되지만
스위치 6,7번을 통한 FND 업다운은 잘 되지않습니다.
char seg[17]을 사용하여 업다운을 할수있는 방법이 없을까요?
처음에도 0000으로 뜨게하고싶습니다.
//
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
volatile char seg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0};
volatile int n=0;
//
ISR(INT4_vect){
PORTA<<=1; if(PORTA==0)PORTA=0x01;
}
//
ISR(INT5_vect){
PORTA>>=1; if(PORTA==0)PORTA=0x80;
}
//
ISR(INT6_vect){
if(++n>9999)n=0;
}
//
ISR(INT7_vect){
if(--n<0)n=9999;
}
//
ISR(TIMER0_COMP_vect){
static char cnt=0;
PORTG=0;
switch(cnt){
case 0: PORTC=seg[n %10]; break;
case 1: PORTC=seg[n/10 %10]; break;
case 2: PORTC=seg[n/100%10]; break;
case 3: PORTC=seg[n/1000 ]; break;
}
PORTG=1<<cnt;
if(++cnt>3)cnt=0;
}
//
int main(void){
DDRA=0xFF; DDRC=0xFF; DDRG=0x0F;
TCCR0=0x0C; OCR0=249; TIMSK=2;
EICRB=0xAA; EIMSK=0xF0;
sei();
while(1){}
}
두가지 문제점이 있었는데요
case 0: PORTC=seg[n %10]; break;
case 1: PORTC=seg[n/10 %10]; break;
case 2: PORTC=seg[n/100%10]; break;
case 3: PORTC=seg[n/1000 ]; break;
seg[] 배열 처리를 하지 않은 것은 심각한 오류이고
volatile char seg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0};
volatile int n=0;
volatile 선언을 하지 않은 것도 중요한 오류입니다.
인터럽트에서 사용하는 전역 변수는 volatile 선언을 해줘야 합니다.
(코드비젼은 volatile 없어도 됨)
댓글 : 0
조회수 : 7,762
등록된 댓글이 없습니다.