BASIC4MCU | 질문게시판 | atmega128 도와주세요...
페이지 정보
작성자 우이이엉 작성일2018-12-04 16:17 조회7,274회 댓글1건본문
#include <mega128.h>
#include <delay.h>
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
#define KEY_OUT PORTA
#define KEY_IN PINA
enum{C0,C1,C2,C3};
unsigned char counter = 0; //문제에 이용하는 변수
unsigned int time_s=0, time_m=0,timer0Cnt=0; //카운터에 이용하는 변수
unsigned char FND_DATA[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xd8, 0x80, 0x98}; //fnd 0~9
void print_FND(unsigned char segCx, unsigned char data); // 원하는 FND 포트에 data 출력
int KeyMatrix(int matrix);//키 매트릭스 함수선언
interrupt [TIM0_OVF] void tim0_ovf(void)//타이머 인터럽트
{
if(counter != 0 )
{
#asm("cli"); //인터럽트 금지
TCNT0 = 0xff - 157;
timer0Cnt++;
if(timer0Cnt ==100 && time_m < 2) // 10ms*100=1s
{
if(time_s >= 59)
{
time_m++;
time_s =0;
}
else
time_s++;
timer0Cnt = 0;
}
SREG=0x80;
}
}
interrupt [EXT_INT0] void ext_int0_isr(void)//스위치 외부 인터럽트
{
EIMSK = 0x00; // 인터럽트 초기화
counter++;
delay_ms(500);
EIMSK = 0x01; // 인터럽트 허용
TCCR0 = 0x07; //타이머0 설정(clk/1024)
TCNT0 = 0xff - 157;//10msec 여기 조절로 시간설정가능
}
void main(void)
{
int matrix, buffer, i, keyout;
char buff[17]="13 Park Su Jin"; // LCD 출력 Data 저장 변수 설정
lcd_init(16); // Character LCD 16 * 2 사용 선언
lcd_gotoxy(0,0); // LCD 1 line 선택 함수, x=0, y=0
lcd_puts(buff); // buff변수 Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("13 Won Ye Hyeon"); // Data를 LCD로 출력
delay_ms(4500);
PORTA = 0x00; //PORTA 초기화
DDRA = 0xf0;
PORTD = 0x00; // PORTD 초기화
DDRD = 0x00; // PORTD 방향설정: 입력
EICRA = 0x02; // 00000010 (INT0 하강에지 검출)
EIMSK = 0x01; // 인터럽트0 허용
DDRE = 0xFF; //PORTE A~P까지 FND
PORTE = 0x00;
DDRG = 0x0F; // control PORTG 0-3 PIN
PORTG = 0x0F;
PORTB =0x00;
DDRB = 0xFF;
TIMSK = 0x01; //오버플로우 인터럽트 허용
TIFR =0x01; //오버플로우 플래그 저장(오버플로우 발생시)
SREG = 0x80; // Global enable interrupt
while(1)
{
print_FND(C3, time_s%10); //4번째 FND에 1초단위 출력
print_FND(C2, time_s/10); // 3번째 FND에 10초단위 출력
print_FND(C0, time_m); // 1번째 FND에 1분단위 출력
if(time_m == 2)lcd_clear(); //제한시간 초과시 LCD 클리어
keyout = 0b11101111;//키 매트릭스 그라운드 설정
for(i=0;i<=3;i++)
{
KEY_OUT = keyout;
matrix = KEY_IN;
buffer=KeyMatrix(matrix);
keyout = (keyout<<1) + 0x01;
if(counter == 0) //초기화면
{
lcd_clear(); //LCD 클리어
lcd_putsf("Hello!!!"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("Let's play"); // Data를 LCD로 출력
delay_ms(500);
}
if(counter == 1) //1번문제
{
lcd_clear(); //LCD 클리어
lcd_putsf("Question 1"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("3 X 3 = "); // Data를 LCD로 출력
counter++;
PORTB = 0b00000000;
}
if(buffer == 9 && counter == 2) //2번문제
{
lcd_clear(); //LCD 클리어
lcd_putsf("Question 2"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("9-3X2 = "); // Data를 LCD로 출력
counter++;
PORTB = 0b00000000;
}
if(buffer == 3 && counter == 3) //3번문제
{
lcd_clear(); //LCD 클리어
lcd_putsf("Question 3"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("5+9-8 = "); // Data를 LCD로 출력
counter++;
PORTB = 0b10000000;
}
if(buffer == 6 && counter == 4) //4번문제
{
lcd_clear(); //LCD 클리어
lcd_putsf("Question 4"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("19-2X7 = "); // Data를 LCD로 출력
counter++;
PORTB = 0b10000000;
}
if(buffer == 5 && counter == 5) //5번문제
{
lcd_clear(); //LCD 클리어
lcd_putsf("Question 5"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("2+15/3 = "); // Data를 LCD로 출력
counter++;
PORTB = 0b11000000;
}
if(buffer == 7 && counter == 6) //6번문제
{
lcd_clear(); //LCD 클리어
lcd_putsf("Question 6"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("5+6-3+2-8 = "); // Data를 LCD로 출력
counter++;
PORTB = 0b11000000;
}
if(buffer == 2 && counter == 7) //7번문제
{
lcd_clear(); //LCD 클리어
lcd_putsf("Question 7"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("18/3+20/4-7 = "); // Data를 LCD로 출력
counter++;
PORTB = 0b11100000;
}
if(buffer == 4 && counter == 8) //8번문제
{
lcd_clear(); //LCD 클리어
lcd_putsf("Question 8"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("2X5-2 = "); // Data를 LCD로 출력
counter++;
PORTB = 0b11100000;
}
if(buffer == 8 && counter == 9) //9번문제
{
lcd_clear(); //LCD 클리어
lcd_putsf("Question 9"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("19-18 = "); // Data를 LCD로 출력
counter++;
PORTB = 0b11110000;
}
if(buffer == 1 && counter == 10) //10번문제
{
lcd_clear(); //LCD 클리어
lcd_putsf("Question 10"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("5X2-4 = "); // Data를 LCD로 출력
counter++;
PORTB = 0b11110000;
}
if(buffer == 6 && counter == 11) //문제 끝!!
{
counter++;
lcd_clear(); //LCD 클리어 문제1
lcd_putsf("Good job!!"); // Data를 LCD로 출력
lcd_gotoxy(0,1); // LCD 2 line 선택 함수, x=0, y=1
lcd_putsf("made by team17"); // Data를 LCD로 출력
PORTB = 0b11111000;
}
};
}
}
int KeyMatrix(int matrix)//키매트릭스 함수
{
int key = 0;
switch(matrix)
{
case 0x7e : key = 0;
break;
case 0xbe : key = 1;
break;
case 0xde : key = 2;
break;
case 0xee : key = 3;
break;
case 0x7d : key = 4;
break;
case 0xbd : key = 5;
break;
case 0Xdd : key = 6;
break;
case 0xed : key = 7;
break;
case 0x7b : key = 8;
break;
case 0xbb : key = 9;
break;
default: key = 0xff;
}
return key;
}
void print_FND(unsigned char segCx, unsigned char data)
{
switch(segCx){
case C3: //4번 FND (좌측기준)
PORTG &= 0xF0;
PORTG |= 0x07;
break;
case C2: //3번 FND
PORTG &= 0xF0;
PORTG |= 0x0B;
break;
case C0: //1번 FND
PORTG &= 0xF0;
PORTG |= 0x0E;
break;
default:
PORTG &= 0xF0;
PORTG |= 0x0F;
break;
}
PORTE = FND_DATA[data];
delay_ms(1);
}
소스코드 빌드하고 점퍼선을 연결하는데
어떻게 연결하는지 모르겠어서 도움 요청드립니다..........
댓글 1
조회수 7,274master님의 댓글
master 작성일
시간이 많이 걸리는 것은 도와드릴 수가 없습니다.
쉬운 것들은 직접 공부해서 찾으시고
해결이 안되는 어려운 것은 다시 질문글로 작성해주세요