질문게시판 > atmega128포트관련 질문입니다

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 질문게시판

atmega128포트관련 질문입니다

페이지 정보

작성자 나나나 작성일18-12-11 16:23 조회4,433회 댓글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키트에 연결하려면 각각기능들을 어디 포트에 연결해야하는지 알려주세요 ㅜ 만약 연결방법이 다르다면 코드 수정부탁드립니다,, 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 1

조회수 : 4,433

master님의 댓글

master 작성일

j키트도 모르겠고 질문 사진의 키트도 처음봅니다.
각각의 회로도 참고해서 연결하세요

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[25] master  17-10-29
질문 빵판없이 디스플레이 넣을 수 있을까요? 댓글[1] 첨부파일오소로롯 새글 22-06-29
질문 라즈베리파이4 신형 선택문제 댓글[1] maximum  22-06-26
질문 음전압 ADC 댓글[2] 412904  22-06-26
질문 아두이노 센서값 출력 질문입니다! 댓글[1] 아궁2  22-06-24
질문 ATmega128, ATmega28 RS232통신 첨부파일Moon4201  22-06-24
답변 답변 : ATmega128, ATmega28 RS232… 댓글[1] master  22-06-25
질문 서보모터, 온습도센서 코드 질문 댓글[2] 첨부파일kshdlfaldfh  22-06-22
답변 답변 : 서보모터, 온습도센서 코드 질문 댓글[15] master  22-06-22
질문 steppermulti5 질문 응애  22-06-21
답변 답변 : steppermulti5 질문 댓글[1] master  22-06-22
질문 atmega128 avr usart 질문 snoflak  22-06-21
답변 답변 : atmega128 avr usart 질문 댓글[5] master  22-06-21
질문 사용자 정의 함수 변환 하는 방법 댓글[2] 첨부파일da0800  22-06-21
질문 atmega128 댓글[1] 양의노래  22-06-20
질문 아두이노 동시동작 재질문 댓글[9] 첨부파일죠르디  22-06-20
질문 초음파센서로 dc모터 제어하기 댓글[1] 첨부파일난쟁2  22-06-20
질문 아두이노 동시동작 댓글[7] 죠르디  22-06-19
질문 ATMEGA128 UART,FND 연동 질문 JMOD  22-06-19
답변 답변 : ATMEGA128 UART,FND 연동 질문 댓글[1] master  22-06-20
질문 atmeg128 질문이요 댓글[1] 첨부파일공대생er  22-06-18
질문 atmega128 초음파 센서로 신호등 시간초 늘리기 서동씨  22-06-18
답변 답변 : atmega128 초음파 센서로 신호등 시간초… 댓글[1] master  22-06-18
질문 atmega128 댓글[2] 망경이  22-06-18
질문 앱인벤터 이용해서 수동 자동 할라고하는데 ..잘안됩니다… 댓글[1] 따랑해영  22-06-18
답변 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 ..… 댓글[1] 첨부파일따랑해영  22-06-19
답변 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 .… 첨부파일따랑해영  22-06-19
질문 서보모터와 초음파센서 댓글[1] 브링미히어  22-06-17
질문 LCD 도와주세요 ㅜㅠㅠㅠ 댓글[2] 첨부파일dentist22  22-06-17
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전