BASIC4MCU | 질문게시판 | 답변 : 답변 : 답변 : atmega128 코딩 질문드립니다.
페이지 정보
작성자 master 작성일2018-06-07 13:23 조회10,681회 댓글2건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-06-07 오후 1:26:25// by Ok-Hyun Park//#include <avr/io.h>#include <avr/interrupt.h>unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};unsigned char jin[]={0xA4,0x80,0xA1,0x89}; //2,8,D,H//char mode=1,Jin=0,Jout=0,Jmin=0;int Val=0,Vmax=0;//void dispB(char n){PORTD=seg[(n>>2)&1]; // (n+2)승PORTF=seg[(n>>1)&1]; // (n+1)승PORTB=seg[(n>>0)&1]; // (n+0)승}//void dispO(char n){PORTD=seg[(n>>6)&7]; // (n+2)승PORTF=seg[(n>>3)&7]; // (n+1)승PORTB=seg[(n>>0)&7]; // (n+0)승}//void dispD(char n){PORTD=seg[n/100 ]; // (n+2)승PORTF=seg[n/10%10]; // (n+1)승PORTB=seg[n %10]; // (n+0)승}//void dispH(char n){PORTD=seg[(n>>8)&0xF]; // (n+2)승PORTF=seg[(n>>4)&0xF]; // (n+1)승PORTB=seg[(n>>0)&0xF]; // (n+0)승}//ISR(INT5_vect){ if(++mode>3)mode=0; } // sw1, mode 선택(enter)//ISR(INT4_vect){ // sw2if(mode==1){if(++Jin>3)Jin=0; // 2,8,10,16진수 선택}else if(mode==2){switch(Jin){ // (n+1)승 자리 증가case 0: Val+=0b10; if(Val>Vmax)Val=Vmax; break; // 2진수 경우에는 0b10씩 증가case 1: Val+=0o10; if(Val>Vmax)Val=Vmax; break; // 8진수 경우에는 0o10씩 증가case 2: Val+=0d10; if(Val>Vmax)Val=Vmax; break; // 10진수 경우에는 0d10씩 증가case 3: Val+=0x10; if(Val>Vmax)Val=Vmax; break; // 16진수 경우에는 0x10씩 증가}}}//ISR(INT6_vect){ // sw3if(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씩 증가}}}//int main(){DDRB=0xff; DDRF=0xff;DDRC=0xff; PORTC=seg[b];DDRD=0xff; PORTD=seg[c];EICRB=0xA; EIMSK=0x70; sei();while(1){in=out=0;while(mode==1){ // 진수 선택PORTC=seg[mode]; // modePORTD=0xFF; // offPORTF=jin[Jin]; // 입력 진수PORTB=jin[Jout]; // 출력 진수}//-------------------------------------------------------if(Jin<Jout)Jmin=Jin; else Jmin=Jout; // 작은 진수를 선택switch(Jmin){case 0: Vmax= 7; break; // 2진수의 3자리 최대값= 7(0b111)case 1: Vmax= 511; break; // 8진수의 3자리 최대값= 511(0o777)case 2: Vmax= 999; break; // 10진수의 3자리 최대값= 999(0d999)case 3: Vmax=4095; break; // 16진수의 3자리 최대값=4095(0xFFF)}Val=0;while(mode==2){PORTC=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){PORTC=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진수}}}}
Val+=0o10;
이 문장에서 에러가 발생하면
Val+=8;
이렇게 수정하세요
댓글 2
조회수 10,681오무라이스님의 댓글
비공개 작성일
코드 올려주셔서 정말 감사합니다.
그런데 Val+=0o10; 이 문장에서 에러가 발생해서 Val+=8;
이걸로 수정하고 그외에도 오류가 많이 발생해서
[
../qwdqwdqwdqwd.c:83:20: error: invalid suffix "o10" on integer constant
../qwdqwdqwdqwd.c:85:20: error: invalid suffix "d10" on integer constant
../qwdqwdqwdqwd.c: In function 'main':
../qwdqwdqwdqwd.c:129:24: error: 'b' undeclared (first use in this function)
../qwdqwdqwdqwd.c:129:24: note: each undeclared identifier is reported only once for each function it appears in
../qwdqwdqwdqwd.c:131:24: error: 'c' undeclared (first use in this function)
../qwdqwdqwdqwd.c:137:5: error: 'in' undeclared (first use in this function)
../qwdqwdqwdqwd.c:137:8: error: 'out' undeclared (first use in this function)
make: *** [qwdqwdqwdqwd.o] 오류 1
Build failed with 6 errors and 5 warnings... ]
그래서 제가 수정하고 직접 코드를 돌려봤는데
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
unsigned char jin[]={~0x5B,~0x7F,~0xDE,~0xF6}; //2,8,D,H
//
char mode=1,Jin=0,Jout=0,Jmin=0;
int b=0,c=0;
int Val=0,Vmax=0;
//
void dispB(char n){
PORTD=seg[(n>>2)&1]; // (n+2)승
PORTF=seg[(n>>1)&1]; // (n+1)승
PORTB=seg[(n>>0)&1]; // (n+0)승
}
//
void dispO(char n){
PORTD=seg[(n>>6)&7]; // (n+2)승
PORTF=seg[(n>>3)&7]; // (n+1)승
PORTB=seg[(n>>0)&7]; // (n+0)승
}
//
void dispD(char n){
PORTD=seg[n/100 ]; // (n+2)승
PORTF=seg[n/10%10]; // (n+1)승
PORTB=seg[n %10]; // (n+0)승}
//
void dispH(char n){
PORTD=seg[(n>>8)&0xF]; // (n+2)승
PORTF=seg[(n>>4)&0xF]; // (n+1)승
PORTB=seg[(n>>0)&0xF]; // (n+0)승
}
//
ISR(INT5_vect){ if(++mode>3)mode=0; } // sw1, mode 선택(enter)
//
ISR(INT4_vect){ // sw2
if(mode==1){
if(++Jin>3)Jin=0; // 2,8,10,16진수 선택
}
else if(mode==2){
switch(Jin){ // (n+1)승 자리 증가
case 0: Val+=0b10; 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(INT6_vect){ // sw3
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씩 증가
}
}
}
//
int main(){
DDRB=0xff; DDRF=0xff;
DDRC=0xff; PORTC=seg[b];
DDRD=0xff; PORTD=seg[c];
EICRB=0xA; EIMSK=0x70; sei();
while(1){
Jin=Jout=0;
while(mode==1){ // 진수 선택
PORTC=seg[mode]; // mode
PORTD=0xFF; // off
PORTF=jin[Jin]; // 입력 진수
PORTB=jin[Jout]; // 출력 진수
}
//-------------------------------------------------------
if(Jin<Jout)Jmin=Jin; else Jmin=Jout; // 작은 진수를 선택
switch(Jmin){
case 0: Vmax= 7; break; // 2진수의 3자리 최대값= 7(0b111)
case 1: Vmax= 511; break; // 8진수의 3자리 최대값= 511(0o777)
case 2: Vmax= 999; break; // 10진수의 3자리 최대값= 999(0d999)
case 3: Vmax=4095; break; // 16진수의 3자리 최대값=4095(0xFFF)
}
Val=0;
while(mode==2){
PORTC=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){
PORTC=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진수
}
}
}
}
이렇게 수정을 했습니다. 근데 제가 말씀안드린게 있습니다.
제가 Q514 칩을 사용하는데 이회로의 특성상
2세그먼트는 PORTC와 PORTD 는 따로 연결이 가능한데
1세그먼트가 PORTB와 PORTF가 1~4/ 4~7 이런식으로 같이 연결되어있는 상태입니다..
마지막으로 한번만 더봐주시면 정말 감사하겠습니다..ㅠㅠ
운영자님이 직접 만드신 저코드로 돌려봐도 제가 원하는 회로가 나오질 않네요..
master님의 댓글
master
Q514에 관해서는 아는바가 없습니다.