BASIC4MCU | 질문게시판 | 답변 : atmega128 질문이요!
페이지 정보
작성자 master 작성일2019-11-30 06:08 조회14,621회 댓글4건본문
제가 atmega128 사용해서 간단한 게임 만드는걸 짜고 있는데요게임을 설명하자면 4번스위치를 누르면 led가 랜덤으로 표시가 되요그럼 이 led의 개수를 스위치6과7로 컨트롤해서 세븐세그먼트에 표시하고 5를 눌렀을 때 정답 여부를나타내서 맞추는 게임이거든요다른부분은 다되었는데..난수로 뿌려지는 led의 개수를 세그먼트의 값과 어떻게 연동 시켜야 할까요..??//unsigned char seg[10]={0xaf,0xa0,0x97,0xb5,0xb8,0x3d,0x3b,0xa4,0xbf};unsigned char N1=0,N10=0,N100=0,N1000=0;unsigned char Flag=0,led=0xff,seg_count=0;//void Seg4_out(void);//interrupt[EXT_INT4]void external_int4(void){Flag=1;Command(ALLCLR);Command(HOME); LCD_String(" 5(run)");Command(LINE2); LCD_String("6(+)7(-)");PORTC=led;led=rand();}//interrupt[EXT_INT5]void external_int5(void){Command(ALLCLR);Command(HOME); LCD_String("ALRIGHT! TRY ");Command(LINE2); LCD_String(" AGAIN!");}//interrupt[EXT_INT6]void external_int6(void){Command(ALLCLR);Command(HOME); LCD_String("count++");Command(LINE2); LCD_String(" ");if(seg_count==0)N1=(N1+1)%10;}//interrupt[EXT_INT7]void external_int7(void){Command(ALLCLR);Command(HOME); LCD_String("count--");Command(LINE2); LCD_String(" ");if(seg_count==0)N1=(N1-1)%10;}//void main(){DDRB=0xff;DDRF=0xf0; PORTF=0xf0;DDRC=0xff; PORTC=0xff;LCD_init(); LCD_String("play game!HOW MANY LED?");Command(LINE2); LCD_String("-press4-");//EICRB=0xff; EIMSK=0xf0; //=INT4,5,6,7(상승)SREG=0x80;while(1) {if (Flag ==0){ Command(LSHIFT); delay_ms(350); } //1초 주기로 Left Shitftelse if(seg_count==0){ Seg4_out(); }}}
전체 소스가 아니라서 이해가 안됩니다.
댓글 4
조회수 14,621에로롤님의 댓글
에로롤 작성일
위에는
#include <mega128.h>
#include <delay.h>
#include <stdlib.h>
#define FUNCSET 0x28 // Function Set
#define ENTMODE 0x06 // Entry Mode Set
#define ALLCLR 0x01 // All Clear
#define DISPON 0x0c // Display On
#define LSHIFT 0x18 // Displya Left Shift
#define RSHIFT 0x1c //Disply Right Shift
#define LINE2 0xC0 // 2nd Line Move
#define HOME 0x02 // Cursor Home
void LCD_init(void);
void LCD_String(const char * );
void Busy(void); //지연
void Command(unsigned char);
void Data(unsigned char);
뒷부분은
void Seg4_out(void)
{
PORTF = 0b01110000;
PORTB = seg_pat[N1];
delay_ms(5);
PORTF = 0b10110000;
PORTB = seg_pat[N10];
delay_ms(5);
PORTF = 0b11010000;
PORTB = seg_pat[N100];
delay_ms(5);
PORTF = 0b11100000;
PORTB = seg_pat[N1000];
delay_ms(5);
}
// LCD 초기화
void LCD_init(void)
{
DDRA = 0xFF; // 포트 A 출력 설정
PORTA &= 0xFB; //E = 0;
delay_ms(15);
Command(0x20); //command( Data(4bit), don’t care, E, RW, RS)
delay_ms(5);
Command(0x20);
delay_us(100);
Command(0x20);
Command(FUNCSET);
Command(DISPON);
Command(ALLCLR);
Command(ENTMODE);
}
// 문자열 출력 함수
void LCD_String(const char *str )
{
const char *pStr=0;
pStr = str;
while(*pStr) Data(*pStr++);
}
입니다
// 인스트럭션 쓰기 함수
void Command(unsigned char byte)
{
Busy(); //2msec delay
// 인스트럭션 상위 바이트
PORTA = (byte & 0xF0); // 데이터
PORTA &= 0xFE; //RS = 0;
PORTA &= 0xFD; //RW = 0;
delay_us(1);
PORTA |= 0x04; //E = 1;
delay_us(1);
PORTA &= 0xFB; //E = 0;
// 인스트럭션 하위 바이트
PORTA = ((byte<<4) & 0xF0); // 데이터
PORTA &= 0xFE; //RS = 0;
PORTA &= 0xFD; //RW = 0;
delay_us(1);
PORTA |= 0x04; //E = 1;
delay_us(1);
PORTA &= 0xFB; //E = 0;
}
//데이터 쓰기 함수
void Data(unsigned char byte)
{
Busy();
// 데이터 상위 바이트
PORTA = (byte & 0xF0); // 데이터
PORTA |= 0x01; //RS = 1;
PORTA &= 0xFD; //RW = 0;
delay_us(1);
PORTA |= 0x04; //E = 1;
delay_us(1);
PORTA &= 0xFB; //E = 0;
// 데이터 하위 바이트
PORTA = ((byte<<4) & 0xF0); // 데이터
PORTA |= 0x01; //RS = 1;
PORTA &= 0xFD; //RW = 0;
delay_us(1);
PORTA |= 0x04; //E = 1;
delay_us(1);
PORTA &= 0xFB; //E = 0;
}
// Busy Flag Check -> 일반적인 BF를 체크하는 것이 아니라 일정한 시간 지연을 이용한다.
void Busy(void)
{
delay_ms(2);
}
master님의 댓글
master 작성일
unsigned char led=0xff;
led=rand();
LED 개수라는 것이
led 변수의 값을 말하는 건가요?
아니면 led 변수의 1의 개수를 말하는 것인가요?
또,
led=0xff; 초기값 0xFF는 무슨 의미죠?
에로롤님의 댓글
에로롤
led에 랜덤함수를 씀으로써 실행했을때 불이 들어오는 개수를 말하는 것입니다.
led=0xff는 led의 출력상태입니다.
master님의 댓글
master
1 출력하면 OFF
0 출력하면 ON 인가요?