BASIC4MCU | 질문게시판 | atmega128포트관련 질문입니다
페이지 정보
작성자 나나나 작성일2018-12-11 16:23 조회6,529회 댓글1건본문
#include <mega128.h>
#include <delay.h>#define LCD_WDATA PORTD // 버스 (W)
#define LCD_RDATA PIND // 데이터 버스 (R)
#define LCD_CTRL PORTB // 제어 신호
#define LCD_RS 5 // DR(1)/IR(0)
#define LCD_EN 7 // Enable 신호
#define LCD_RW 6 // 읽기(1)/쓰기(0)
#define TIMER0_CNT (-250)typedef unsigned char Byte; // Byte 정의
int a;
unsigned int qu=0;
unsigned int Count, answer, time=1200;
unsigned char FND_DATA[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f};
bit Start=0;
unsigned char key_scan(unsigned char k);
unsigned char key_convert(unsigned char in);
unsigned char in0,in1,in2,in3, in_k, in_b;
unsigned char score;
interrupt [TIM0_OVF] void ISR_T0(void)
{
TCNT0 = TIMER0_CNT;
Count++;
}interrupt [EXT_INT4] void ext_int4(void)
{
Start = 0;
time = 1200;
#asm("jmp 0");}
interrupt [EXT_INT5] void ext_int5(void)
{
if(Start==1)
Start = 0;
else if(Start==0)
Start = 1;
}void Interrupt_init(void)
{
EIFR = 0x00;
EIMSK = 0x30;
EIMSK |= 1<<4;
EIMSK |= 1<<5;
EICRB = 1<<ISC41 | 0<<ISC40;
EICRB = 1<<ISC51 | 0<<ISC50;
#asm("sei")
}void Init_Timer(void)
{
TCCR0 = 0x06;
TCNT0 = TIMER0_CNT;
TIFR = 0;
TIMSK = 1<<TOIE0;
#asm("sei")
}void LCD_Comm(Byte ch)
{
LCD_CTRL &= ~(1 << LCD_RS); // RS=0: IR
LCD_CTRL &= ~(1 << LCD_RW); // Write
LCD_CTRL |= (1 << LCD_EN); // LCD Enable
delay_us(50); // 시간지연
LCD_WDATA = ch; // Comd Write
delay_us(50); // 시간지연
LCD_CTRL &= ~(1 << LCD_EN); // LCD Disable
}void LCD_Data(Byte ch)
{
LCD_CTRL |= (1 << LCD_RS);
LCD_CTRL &= ~(1 << LCD_RW);
LCD_CTRL |= (1 << LCD_EN);
delay_us(50);
LCD_WDATA = ch;
delay_us(50);
LCD_CTRL &= ~(1 << LCD_EN);
}void Init_Lcd(void)
{
DDRD = 0xFF; // PORTD를 출력으로 (DB)
DDRB = 0xFF; // PORTB를 출력으로
LCD_Comm(0x38); // Function Set
delay_ms(4);
LCD_Comm(0x38); // Function Set
delay_ms(1);
LCD_Comm(0x38); // Function Set
LCD_Comm(0x0e); // Display ON, 커서 On, Blink off
LCD_Comm(0x01); // LCD Clear
delay_ms(2);
LCD_Comm(0x06);
}void CGRAM_Set()
{
{
int i;
Byte su[]={0x02, 0x04, 0x0a, 0x1f, 0x04, 0x04, 0x04, 0x00};
Byte go[]={0x00, 0x0e, 0x02, 0x06, 0x04, 0x1f, 0x00, 0x00};
Byte ha[]={0x00, 0x0a, 0x1e, 0x0a, 0x17, 0x0a, 0x02, 0x00};
Byte shut[]={0x01, 0x05, 0x0b, 0x15, 0x17, 0x05, 0x0a, 0x15};
Byte sb[]={0x02, 0x04, 0x0a, 0x1f, 0x0a, 0x0e, 0x0a, 0x0e};
Byte ni[]={0x00, 0x02, 0x0a, 0x0a, 0x0e, 0x02, 0x02, 0x00};
Byte da[]={0x00, 0x02, 0x1a, 0x13, 0x1e, 0x02, 0x02, 0x00};
LCD_Comm(0x40); // 수
for(i=0; i<8; i++)
LCD_Data (su[i]);
LCD_Comm(0x48); // 고
for(i=0; i<8; i++)
LCD_Data (go[i]);
LCD_Comm(0x50); // 하
for(i=0; i<8; i++)
LCD_Data (ha[i]);
LCD_Comm(0x58); // 셨
for(i=0; i<8; i++)
LCD_Data (shut[i]);
LCD_Comm(0x60); // 습
for(i=0; i<8; i++)
LCD_Data (sb[i]);
LCD_Comm(0x68); // 니
for(i=0; i<8; i++)
LCD_Data (ni[i]);
LCD_Comm(0x70); // 다
for(i=0; i<8; i++)
LCD_Data (da[i]);
}
}void LCD_pos(Byte row, Byte col)
{
LCD_Comm( 0x80 | (col+row*0x40) );
}void LCD_string(char x, char y, char *msg)
{
LCD_pos(x,y);
while(*msg) LCD_Data(*msg++);
}unsigned char key_scan(unsigned char k)
{
unsigned char in;DDRA = 0xff;
PORTA = k; //switch 값 출력
DDRA = 0x0f; //Port C7~C4(In) C3~C0(Out)
delay_us(100);
in = PINA & 0xf0; // Scan 값을 (5,6,7,8)에서 읽는다.
// Port C의 상위에 연결되어 있음, 하위는 버림
// 첫번째 열을 누르면, 0x10, 2nd row 는 0x20,...
// 누르지 않으면 0x00
if(in) // 입력이 있으면 in 값은 0이 아닌 값
in |= k; // 상위에는 열값(col), 하위에는 행(row)을 넣음
return in;
}/*
unsigned char key_convert(unsigned char in) // 빨간색 키패드
{
unsigned char k=0;
switch(in)
{
case 0x11 : k = 0x09; // 9
break;
case 0x21 : k = 0x06; // 6
break;
case 0x41 : k = 0x03; // 3
break;
case 0x12 : k = 0x08; // 8
break;
case 0x22 : k = 0x05; // 5
break;
case 0x42 : k = 0x02; // 2
break;
case 0x82 : k = 0x00; // 0
break;
case 0x14 : k = 0x07; // 7
break;
case 0x24 : k = 0x04; // 4
break;
case 0x44 : k = 0x01; // 1
break;
default : k = 0xF0; //Off
break;
}
return k;
}
*/unsigned char key_convert(unsigned char in) // 초록색 키패드
{
unsigned char k=0;
switch(in)
{
case 0x21 : k = 0x00; // 0
break;
case 0x12 : k = 0x01; // 1
break;
case 0x22 : k = 0x02; // 2
break;
case 0x42 : k = 0x03; // 3
break;
case 0x14 : k = 0x04; // 4
break;
case 0x24 : k = 0x05; // 5
break;
case 0x44 : k = 0x06; // 6
break;
case 0x18 : k = 0x07; // 7
break;
case 0x28 : k = 0x08; // 8
break;
case 0x48 : k = 0x09; // 9
break;
default : k = 0xF0; // default
break;
}
return k;
}
void main()
{
DDRA=0xff; // LED display
DDRC=0xff; // Keymatrix
DDRG=0xff;
DDRE=0x00;Init_Timer();
Interrupt_init();
Init_Lcd();
CGRAM_Set();
while(1)
{
for(a=0; a<5; a++)
{
PORTC = FND_DATA[time/600];
PORTG = 0x08;
delay_us(150);
PORTC = FND_DATA[(time/100)%6];
PORTG = 0x04;
delay_us(150);
{
if(time%10<5)
PORTC = FND_DATA[(time/10)%10] | 0x80;
else
PORTC = FND_DATA[(time/10)%10];
}
PORTG = 0x02;
delay_us(150);
PORTC = FND_DATA[time%10];
PORTG = 0x01;
delay_us(150);
}
if(Start==1)
{
if(Count>=25)
{
Count=0;
time--;
}
}
{
if(time==0)
{
Start=0;
LCD_pos(0,0);
LCD_Data(0x00); LCD_Data(0x01); LCD_Data(0x02); LCD_Data(0x03);
LCD_Data(0x04); LCD_Data(0x05); LCD_Data(0x06); LCD_Data('!');
LCD_Data(' '); LCD_Data(' '); LCD_Data(' '); LCD_Data(' ');
LCD_pos(1,0);
LCD_Data('Y'); LCD_Data('o'); LCD_Data('u'); LCD_Data('r');
LCD_Data(' '); LCD_Data('g'); LCD_Data('r'); LCD_Data('a');
LCD_Data('d'); LCD_Data('e'); LCD_Data(' '); LCD_Data('i');
LCD_Data('s'); LCD_Data(' '); LCD_Data(score); LCD_Data('!');
LCD_Comm(0x0C);
}
}
if(Start==1 && qu==0)
{
LCD_string(0,0,"Ready");
delay_ms(500);
LCD_string(1,0,"Start!");
delay_ms(500);
LCD_Comm(0x01);
delay_ms(100);
LCD_string(0,0,"45*2/90-0=");
delay_ms(500);
score='F';
qu++;
}else if(qu==1 && answer==1)
{
LCD_Comm(0x01);
delay_ms(10);
LCD_string(0,0,"88/2*9/36-5=");
score='F';
qu++;
}
else if(qu==2 && answer==6)
{
LCD_Comm(0x01);
delay_ms(10);
LCD_string(0,0,"(67+12-19)/20=");
score='D';
qu++;
}else if(qu==3 && answer==3)
{
LCD_Comm(0x01);
delay_ms(10);
LCD_string(0,0,"11/11+8/2=");
score='D';
qu++;
}else if(qu==4 && answer==5)
{
LCD_Comm(0x01);
delay_ms(10);
LCD_string(0,0,"2222/11/101=");
if(answer == 2)
score='C';
qu++;
}
else if(qu==5 && answer==2)
{
LCD_Comm(0x01);
delay_ms(10);
LCD_string(0,0,"31*9/62*2=");
score='C';
qu++;
}
else if(qu==6 && answer==9)
{
LCD_Comm(0x01);
delay_ms(10);
LCD_string(0,0,"250/5/10-1=");
score='B';
qu++;
}
else if(qu==7 && answer==4)
{
LCD_Comm(0x01);
delay_ms(10);
LCD_string(0,0,"1-1*2+2=");
score='B';
qu++;
}
else if(qu==8 && answer==1)
{
LCD_Comm(0x01);
delay_ms(10);
LCD_string(0,0,"91*3/39=");
score='A';
qu++;
}
else if(qu==9 && answer==7)
{
LCD_Comm(0x01);
delay_ms(10);
LCD_string(0,0,"(88/11-2*3)+6=");
score='A';
qu++;
}
else if(qu==10 && answer==8)
{
LCD_Comm(0x01);
delay_ms(100);
LCD_pos(0,0);
LCD_Data(0x00); LCD_Data(0x01); LCD_Data(0x02); LCD_Data(0x03);
LCD_Data(0x04); LCD_Data(0x05); LCD_Data(0x06); LCD_Data('!');
LCD_pos(1,0);
LCD_Data('Y'); LCD_Data('o'); LCD_Data('u'); LCD_Data('r');
LCD_Data(' '); LCD_Data('g'); LCD_Data('r'); LCD_Data('a');
LCD_Data('d'); LCD_Data('e'); LCD_Data(' '); LCD_Data('i');
LCD_Data('s'); LCD_Data(' '); LCD_Data(score); LCD_Data('!');
LCD_Comm(0x0C);
}
in0 = key_scan(0x01);
in1 = key_scan(0x02);
in2 = key_scan(0x04);
in3 = key_scan(0x08);
in_k = (in1 | in2 | in3 | in0);
in_b = key_convert(in_k); //scan 값을 숫자로 변환
if(in_b != 0xff) //스위치 입력이 있을때 만 update
{
PORTA = in_b; // 변환된 값 LED에 표시 ----- (B)
answer = PORTA;
}
}
// while(1);
}이게 jkit를 이용한 암산게임 코드인데요 ,저희가 첨부한 사진과 같은 ATMEGA128키트에 연결하려면 각각기능들을 어디 포트에 연결해야하는지 알려주세요 ㅜ 만약 연결방법이 다르다면 코드 수정부탁드립니다,,
댓글 1
조회수 6,529master님의 댓글
master 작성일
j키트도 모르겠고 질문 사진의 키트도 처음봅니다.
각각의 회로도 참고해서 연결하세요