BASIC4MCU | 질문게시판 | 답변 : 답변 : 답변 : 답변 : atmega128 코딩 질문드립니다.
페이지 정보
작성자 비공개 작성일2018-06-08 13:22 조회8,290회 댓글0건본문
Q514라는 칩에 맞게 제가 설계를해서 정말 운영자님 덕분에
여기까지 온것같습니다. 거의 완성시켰습니다.일단 정말 감사합니다.
제가 운영자님에 코드를 참고하여
제껀 세븐세그먼트가 3개였고, 2진수가 led로 표현하는 코드를 짜는과정에 있어서.
문제점이 몇가지 있었습니다.
문제점:첫번째 나머지 진수에서 2진수(즉led로 표현)로 가는건 문제가 없었습니다. 하지만
2진수(즉led로 표현)로 나머지 진수로 바꿀려고 하는과정에서 ex) 2->D로 가는 과정에서 mode를 변경 시켜 2번을누르면 그대로 2와 D상태 그대로 멈춤현상이 일어나는과정이 있었고
두번째는 숫자가 최대값이 되면 그대로 멈춰지는것? 그니깐 ex) 99가 최대면 그냥 그대로 멈춰있고 더이상숫자가 움직이지 않는다는 점이였습니다.
이거 2개만 봐주시면 감사하겠습니다.
코드
#include<avr/io.h>
#include <avr/interrupt.h>
unsigned long int jin[]={~0x5B,~0x7F,~0xDE,~0xF6}; // 2,8,10,16 진수
unsigned char seg[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x27,~0x7F,~0x6F,~0xF7,~0xFC,~0xB9,~0xDE,~0xF9,~0xF1}; //0~9, A~F
char mode=1,Jin=0,Jout=0,Jmin=0,i=0;void dispB(char i){ PORTA=i; } /*(n+0)승 +1씩 증가 */
//
void dispO(char n){
PORTC=seg[(n>>3)&7]; // (n+1)승
PORTD=seg[(n>>0)&7]; // (n+0)승
}
//
void dispD(char n){
PORTC=seg[n/10%10]; // (n+1)승
PORTD=seg[n %10]; // (n+0)승
}
//
void dispH(char n){
PORTC=seg[(n>>4)&0xF]; // (n+1)승
PORTD=seg[(n>>0)&0xF]; // (n+0)승
}
//
int Val=0,Vmax=0;
int main()
{
DDRA=0xff;
DDRB = 0xff; DDRF = 0xff;
DDRC = 0xff; DDRD = 0xff;
EICRA = 0x00; EICRB = 0x2a;
EIMSK = 0x70; sei();PORTF=seg[mode];
PORTB=seg[mode];
while(1){
i=Jin=Jout=0;
while(mode==1){ // 진수 선택
PORTF=seg[mode]; //mode
PORTB=seg[mode]; //mode
PORTC=jin[Jin]; // 입력 진수
PORTD=jin[Jout]; // 출력 진수
PORTA=i;
}//-------------------------------------------------------
if(Jin<Jout)Jmin=Jin; else Jmin=Jout; // 작은 진수를 선택
switch(Jmin){
case 0: Vmax= 63; break; // 2진수의 2자리 최대값
case 1: Vmax= 77; break; // 8진수의 2자리 최대값
case 2: Vmax= 63; break; // 10진수의 2자리 최대값
case 3: Vmax=0x3F; break; // 16진수의 2자리 최대값
}
Val=0;
while(mode==2){
PORTB=seg[mode];
PORTF=seg[mode];switch(Jin){
case 0: dispB(Val); break; // 2진수
case 1: dispO(Val); break; // 8진수
case 2: dispD(Val); break; // 10진수
case 3: dispH(Val); break; // 16진수
}
}
//-------------------------------------------------------
while(mode==3){
PORTB=seg[mode];
PORTF=seg[mode];
switch(Jout){case 0: dispB(Val); break; // 2진수
case 1: dispO(Val); break; // 8진수
case 2: dispD(Val); break; // 10진수
case 3: dispH(Val); break; // 16진수
}
}
}
}
ISR(INT6_vect){ if(++mode>3)mode=0; if(mode==1) i=0; } // sw3, mode 선택(enter)ISR(INT5_vect){ // sw1
if(mode==1){
if(++Jin>3)Jin=0; // 2,8,10,16진수 선택
}
else if(mode==2){
switch(Jin){ // (n+1)승 자리 증가
case 0: Val+=1; if(Val>Vmax)Val=Vmax; break; // 2진수 경우에는 0b10씩 증가
case 1: Val+=8; if(Val>Vmax)Val=Vmax; break; // 8진수 경우에는 0o10씩 증가
case 2: Val+=10; if(Val>Vmax)Val=Vmax; break; // 10진수 경우에는 0d10씩 증가
case 3: Val+=0x10; if(Val>Vmax)Val=Vmax; break; // 16진수 경우에는 0x10씩 증가
}
}
}
//
ISR(INT4_vect){ // sw2
if(mode==1){
if(++Jout>3)Jout=0; // 2,8,10,16진수 선택
}
else if(mode==2){
switch(Jin){ // (n)승 자리 증가
case 0: Val++; if(Val>Vmax)Val=Vmax; break; // 2진수 경우에는 0b1씩 증가
case 1: Val++; if(Val>Vmax)Val=Vmax; break; // 8진수 경우에는 0o1씩 증가
case 2: Val++; if(Val>Vmax)Val=Vmax; break; // 10진수 경우에는 0d1씩 증가
case 3: Val++; if(Val>Vmax)Val=Vmax; break; // 16진수 경우에는 0x1씩 증가
}
}
}
댓글 0
조회수 8,290등록된 댓글이 없습니다.