BASIC4MCU | 질문게시판 | Atmega128 lcd 나타내기
페이지 정보
작성자 리따몽 작성일2018-12-12 00:47 조회8,524회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=6742
본문
현재 화면에 input number를 나타내고 세그먼트에 타이머를 설정한 상황입니다.
세그먼트에 입력한 숫자가 lcd에 나타나게 하고 싶습니다. 또한 serial을 사용했을 때 남은 기회도 나타냈었는데 이는 그냥 led판에만 나타내어 감소시키는 방식으로 하고 싶습니다. 코드 확인 좀 부탁드립니다.
#include <mega128.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
//
#define SEG PORTA //Port A 7-SEG data로 사용
#define Q PORTB
#define KEY_C PORTC //Port C Key Matrix 입력신호
#define KEY_L PINC //Port C Key Matrix 출력신호
//
char count=0,up=0,user_number[6]={0,},str[100];
int time=10,com_number,life=8,user_num=0,seed=0;
//
void SegDisplay(unsigned int cmd){
unsigned char fnd[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f};
SEG=fnd[cmd];
}
//
char Getch(){ while((UCSR0A&0x80)==0); return UDR0; }
void Putch(char d){ while((UCSR0A&0x20)==0); UDR0=d; }
void PutSt(char *s){ while(*s)Putch(*s++); }
//
void light(int l){
switch(l){
case 8: PORTE=0b11110000; PORTG=0b00001111; break;
case 7: PORTE=0b01110000; PORTG=0b00001111; break;
case 6: PORTE=0b00110000; PORTG=0b00001111; break;
case 5: PORTE=0b00010000; PORTG=0b00001111; break;
case 4: PORTE=0b00000000; PORTG=0b00001111; break;
case 3: PORTE=0b00000000; PORTG=0b00000111; break;
case 2: PORTE=0b00000000; PORTG=0b00000011; break;
case 1: PORTE=0b00000000; PORTG=0b00000001; break;
}
}
//
interrupt[EXT_INT0]void ext_int0_isr(void){
PutSt("\n\n\r");
PutSt("=========================\n\r");
PutSt(" Game Start \n\r");
PutSt("=========================\n\r");
PutSt("0~100 사이의 수를 맞춰보세요!\n\r");
life=8; time=10;
sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str); delay_ms(500);
TCCR0=0x07; srand(seed); com_number=rand()%100+1; light(life);
}
//
interrupt[TIM0_OVF]void timer0_ovf_isr(void){
if(++count==125){ count=0;
SegDisplay(--time);
if(time==0){ time=10;
PutSt("\n\rwarning!!입력에 실패했습니다!!\n\r");
up=0;
life--;
if(life>0){ light(life); sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str); }
else{
PutSt("당신은 패배했습니다.\n\r");
sprintf(str,"아쉽네요.정답은%d입니다.\n\r",com_number); PutSt(str);
TCCR0=0; // 타이머 정지
PutSt("=========================\n\r");
PutSt(" Game End \n\r");
PutSt("=========================\n\n\r");
}
}
}
TCNT0=131;
}
//
void main(void){
unsigned char buff=0;
DDRA=0xff;
DDRB=0x0f;
PORTC=0x0F; DDRC=0x0F; //(c0-c3: 출력,c4-c7: 입력)
DDRE=0xff;
DDRG=0xff;
SegDisplay(0); //7-Segment에 '0'출력
Q=0x0e; // 모든 7-Seg 선택
EICRA=0x0A; EIMSK=0x01; // INT0
UCSR0B=0x18; UBRR0L=0x08; // 115200 bps
TCNT0=131; TIMSK=0x01;
SREG=0x80;
while(1){
seed++;
KEY_C=0xFe; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 1110 출력 3 7 B C line Enable
switch(buff>>4){
case 0x0e: Putch('0'); user_number[up++]='0'; delay_ms(200); break; // 1110
case 0x0d: Putch('4'); user_number[up++]='4'; delay_ms(200); break; // 1101
case 0x0b: Putch('8'); user_number[up++]='8'; delay_ms(200); break; //1011
case 0x07: break; //0111
}
delay_ms(1); KEY_C=0xFC; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 1101 출력 1 5 9 D line Enable
switch(buff>>4){
case 0x0e: Putch('1'); user_number[up++]='1'; delay_ms(200); break; // 1110
case 0x0d: Putch('5'); user_number[up++]='5'; delay_ms(200); break; // 1101
case 0x0b: Putch('9'); user_number[up++]='9'; delay_ms(200); break; //1011
case 0x07: break; //0111
}
delay_ms(1); KEY_C=0xFB; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 1011 출력 2 6 A E line Enable
switch(buff>>4){
case 0x0e: Putch('2'); user_number[up++]='2'; delay_ms(200); break; // 1110
case 0x0d: Putch('6'); user_number[up++]='6'; delay_ms(200); break; // 1101
case 0x0b:{ //1011
// 입력 완료
PutSt("\n\r");
count=0; time=0; user_number[up++]='\0'; life--;
user_num=atoi(user_number);
if(life>0){
if(user_num==com_number){ PutSt("당신이 이겼습니다.축하합니다!\n\r"); }
else if(user_num>com_number){
PutSt("정답보다 입력한 숫자가 큽니다.\n\r");
sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str);
light(life); time=10;
}
else{
PutSt("정답보다 입력한 숫자가 작습니다.\n\r");
sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str);
light(life); time=10;
}
}
else{
PutSt("당신은 패배했습니다.\n\r");
TCCR0=0; // 타이머 정지
sprintf(str,"아쉽네요.정답은%d입니다.\n\r",com_number); PutSt(str);
PutSt("=========================\n\r");
PutSt(" Game End \n\r");
PutSt("=========================\n\n\r");
}
up=0; delay_ms(200);
break;
}
case 0x07: break; //0111
}
delay_ms(1); KEY_C=0xF7; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 0111 출력 3 7 B F line Enable
switch(buff>>4){
case 0x0e: Putch('3'); user_number[up++]='3'; delay_ms(200); break; // 1110
case 0x0d: Putch('7'); user_number[up++]='7'; delay_ms(200); break; // 1101
case 0x0b: break; //1011
case 0x07: break; //0111
}
delay_ms(1);
}
}
#include <mega128.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
//
#define SEG PORTA //Port A 7-SEG data로 사용
#define Q PORTB
#define KEY_C PORTC //Port C Key Matrix 입력신호
#define KEY_L PINC //Port C Key Matrix 출력신호
//
char count=0,up=0,user_number[6]={0,},str[100];
int time=10,com_number,life=8,user_num=0,seed=0;
//
void SegDisplay(unsigned int cmd){
unsigned char fnd[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f};
SEG=fnd[cmd];
}
//
char Getch(){ while((UCSR0A&0x80)==0); return UDR0; }
void Putch(char d){ while((UCSR0A&0x20)==0); UDR0=d; }
void PutSt(char *s){ while(*s)Putch(*s++); }
//
void light(int l){
switch(l){
case 8: PORTE=0b11110000; PORTG=0b00001111; break;
case 7: PORTE=0b01110000; PORTG=0b00001111; break;
case 6: PORTE=0b00110000; PORTG=0b00001111; break;
case 5: PORTE=0b00010000; PORTG=0b00001111; break;
case 4: PORTE=0b00000000; PORTG=0b00001111; break;
case 3: PORTE=0b00000000; PORTG=0b00000111; break;
case 2: PORTE=0b00000000; PORTG=0b00000011; break;
case 1: PORTE=0b00000000; PORTG=0b00000001; break;
}
}
//
interrupt[EXT_INT0]void ext_int0_isr(void){
PutSt("\n\n\r");
PutSt("=========================\n\r");
PutSt(" Game Start \n\r");
PutSt("=========================\n\r");
PutSt("0~100 사이의 수를 맞춰보세요!\n\r");
life=8; time=10;
sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str); delay_ms(500);
TCCR0=0x07; srand(seed); com_number=rand()%100+1; light(life);
}
//
interrupt[TIM0_OVF]void timer0_ovf_isr(void){
if(++count==125){ count=0;
SegDisplay(--time);
if(time==0){ time=10;
PutSt("\n\rwarning!!입력에 실패했습니다!!\n\r");
up=0;
life--;
if(life>0){ light(life); sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str); }
else{
PutSt("당신은 패배했습니다.\n\r");
sprintf(str,"아쉽네요.정답은%d입니다.\n\r",com_number); PutSt(str);
TCCR0=0; // 타이머 정지
PutSt("=========================\n\r");
PutSt(" Game End \n\r");
PutSt("=========================\n\n\r");
}
}
}
TCNT0=131;
}
//
void main(void){
unsigned char buff=0;
DDRA=0xff;
DDRB=0x0f;
PORTC=0x0F; DDRC=0x0F; //(c0-c3: 출력,c4-c7: 입력)
DDRE=0xff;
DDRG=0xff;
SegDisplay(0); //7-Segment에 '0'출력
Q=0x0e; // 모든 7-Seg 선택
EICRA=0x0A; EIMSK=0x01; // INT0
UCSR0B=0x18; UBRR0L=0x08; // 115200 bps
TCNT0=131; TIMSK=0x01;
SREG=0x80;
while(1){
seed++;
KEY_C=0xFe; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 1110 출력 3 7 B C line Enable
switch(buff>>4){
case 0x0e: Putch('0'); user_number[up++]='0'; delay_ms(200); break; // 1110
case 0x0d: Putch('4'); user_number[up++]='4'; delay_ms(200); break; // 1101
case 0x0b: Putch('8'); user_number[up++]='8'; delay_ms(200); break; //1011
case 0x07: break; //0111
}
delay_ms(1); KEY_C=0xFC; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 1101 출력 1 5 9 D line Enable
switch(buff>>4){
case 0x0e: Putch('1'); user_number[up++]='1'; delay_ms(200); break; // 1110
case 0x0d: Putch('5'); user_number[up++]='5'; delay_ms(200); break; // 1101
case 0x0b: Putch('9'); user_number[up++]='9'; delay_ms(200); break; //1011
case 0x07: break; //0111
}
delay_ms(1); KEY_C=0xFB; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 1011 출력 2 6 A E line Enable
switch(buff>>4){
case 0x0e: Putch('2'); user_number[up++]='2'; delay_ms(200); break; // 1110
case 0x0d: Putch('6'); user_number[up++]='6'; delay_ms(200); break; // 1101
case 0x0b:{ //1011
// 입력 완료
PutSt("\n\r");
count=0; time=0; user_number[up++]='\0'; life--;
user_num=atoi(user_number);
if(life>0){
if(user_num==com_number){ PutSt("당신이 이겼습니다.축하합니다!\n\r"); }
else if(user_num>com_number){
PutSt("정답보다 입력한 숫자가 큽니다.\n\r");
sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str);
light(life); time=10;
}
else{
PutSt("정답보다 입력한 숫자가 작습니다.\n\r");
sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str);
light(life); time=10;
}
}
else{
PutSt("당신은 패배했습니다.\n\r");
TCCR0=0; // 타이머 정지
sprintf(str,"아쉽네요.정답은%d입니다.\n\r",com_number); PutSt(str);
PutSt("=========================\n\r");
PutSt(" Game End \n\r");
PutSt("=========================\n\n\r");
}
up=0; delay_ms(200);
break;
}
case 0x07: break; //0111
}
delay_ms(1); KEY_C=0xF7; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 0111 출력 3 7 B F line Enable
switch(buff>>4){
case 0x0e: Putch('3'); user_number[up++]='3'; delay_ms(200); break; // 1110
case 0x0d: Putch('7'); user_number[up++]='7'; delay_ms(200); break; // 1101
case 0x0b: break; //1011
case 0x07: break; //0111
}
delay_ms(1);
}
}
#include <mega128.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
//
#define SEG PORTA //Port A 7-SEG data로 사용
#define Q PORTB
#define KEY_C PORTC //Port C Key Matrix 입력신호
#define KEY_L PINC //Port C Key Matrix 출력신호
//
char count=0,up=0,user_number[6]={0,},str[100];
int time=10,com_number,life=8,user_num=0,seed=0;
//
void SegDisplay(unsigned int cmd){
unsigned char fnd[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f};
SEG=fnd[cmd];
}
//
char Getch(){ while((UCSR0A&0x80)==0); return UDR0; }
void Putch(char d){ while((UCSR0A&0x20)==0); UDR0=d; }
void PutSt(char *s){ while(*s)Putch(*s++); }
//
void light(int l){
switch(l){
case 8: PORTE=0b11110000; PORTG=0b00001111; break;
case 7: PORTE=0b01110000; PORTG=0b00001111; break;
case 6: PORTE=0b00110000; PORTG=0b00001111; break;
case 5: PORTE=0b00010000; PORTG=0b00001111; break;
case 4: PORTE=0b00000000; PORTG=0b00001111; break;
case 3: PORTE=0b00000000; PORTG=0b00000111; break;
case 2: PORTE=0b00000000; PORTG=0b00000011; break;
case 1: PORTE=0b00000000; PORTG=0b00000001; break;
}
}
//
interrupt[EXT_INT0]void ext_int0_isr(void){
PutSt("\n\n\r");
PutSt("=========================\n\r");
PutSt(" Game Start \n\r");
PutSt("=========================\n\r");
PutSt("0~100 사이의 수를 맞춰보세요!\n\r");
life=8; time=10;
sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str); delay_ms(500);
TCCR0=0x07; srand(seed); com_number=rand()%100+1; light(life);
}
//
interrupt[TIM0_OVF]void timer0_ovf_isr(void){
if(++count==125){ count=0;
SegDisplay(--time);
if(time==0){ time=10;
PutSt("\n\rwarning!!입력에 실패했습니다!!\n\r");
up=0;
life--;
if(life>0){ light(life); sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str); }
else{
PutSt("당신은 패배했습니다.\n\r");
sprintf(str,"아쉽네요.정답은%d입니다.\n\r",com_number); PutSt(str);
TCCR0=0; // 타이머 정지
PutSt("=========================\n\r");
PutSt(" Game End \n\r");
PutSt("=========================\n\n\r");
}
}
}
TCNT0=131;
}
//
void main(void){
unsigned char buff=0;
DDRA=0xff;
DDRB=0x0f;
PORTC=0x0F; DDRC=0x0F; //(c0-c3: 출력,c4-c7: 입력)
DDRE=0xff;
DDRG=0xff;
SegDisplay(0); //7-Segment에 '0'출력
Q=0x0e; // 모든 7-Seg 선택
EICRA=0x0A; EIMSK=0x01; // INT0
UCSR0B=0x18; UBRR0L=0x08; // 115200 bps
TCNT0=131; TIMSK=0x01;
SREG=0x80;
while(1){
seed++;
KEY_C=0xFe; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 1110 출력 3 7 B C line Enable
switch(buff>>4){
case 0x0e: Putch('0'); user_number[up++]='0'; delay_ms(200); break; // 1110
case 0x0d: Putch('4'); user_number[up++]='4'; delay_ms(200); break; // 1101
case 0x0b: Putch('8'); user_number[up++]='8'; delay_ms(200); break; //1011
case 0x07: break; //0111
}
delay_ms(1); KEY_C=0xFC; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 1101 출력 1 5 9 D line Enable
switch(buff>>4){
case 0x0e: Putch('1'); user_number[up++]='1'; delay_ms(200); break; // 1110
case 0x0d: Putch('5'); user_number[up++]='5'; delay_ms(200); break; // 1101
case 0x0b: Putch('9'); user_number[up++]='9'; delay_ms(200); break; //1011
case 0x07: break; //0111
}
delay_ms(1); KEY_C=0xFB; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 1011 출력 2 6 A E line Enable
switch(buff>>4){
case 0x0e: Putch('2'); user_number[up++]='2'; delay_ms(200); break; // 1110
case 0x0d: Putch('6'); user_number[up++]='6'; delay_ms(200); break; // 1101
case 0x0b:{ //1011
// 입력 완료
PutSt("\n\r");
count=0; time=0; user_number[up++]='\0'; life--;
user_num=atoi(user_number);
if(life>0){
if(user_num==com_number){ PutSt("당신이 이겼습니다.축하합니다!\n\r"); }
else if(user_num>com_number){
PutSt("정답보다 입력한 숫자가 큽니다.\n\r");
sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str);
light(life); time=10;
}
else{
PutSt("정답보다 입력한 숫자가 작습니다.\n\r");
sprintf(str,"=>기회가%d번 남았습니다.\n\r",life); PutSt(str);
light(life); time=10;
}
}
else{
PutSt("당신은 패배했습니다.\n\r");
TCCR0=0; // 타이머 정지
sprintf(str,"아쉽네요.정답은%d입니다.\n\r",com_number); PutSt(str);
PutSt("=========================\n\r");
PutSt(" Game End \n\r");
PutSt("=========================\n\n\r");
}
up=0; delay_ms(200);
break;
}
case 0x07: break; //0111
}
delay_ms(1); KEY_C=0xF7; delay_ms(1); buff=KEY_L; buff=buff&0xF0; //Port B에 1111 0111 출력 3 7 B F line Enable
switch(buff>>4){
case 0x0e: Putch('3'); user_number[up++]='3'; delay_ms(200); break; // 1110
case 0x0d: Putch('7'); user_number[up++]='7'; delay_ms(200); break; // 1101
case 0x0b: break; //1011
case 0x07: break; //0111
}
delay_ms(1);
}
}
댓글 1
조회수 8,524master님의 댓글
master 작성일
//세그먼트에 입력한 숫자가 lcd에 나타나게 하고 싶습니다.
키트의 LCD 예제는 없나요?
//또한 serial을 사용했을 때 남은 기회도 나타냈었는데
//이는 그냥 led판에만 나타내어 감소시키는 방식으로 하고 싶습니다.
led 판이라는 것이 세그먼트를 말하나요?
시리얼 출력하지 않고 세그먼트에만 출력하고 싶다는 말인가요?