2017-03-21 13 views
0

다음은 ATmega에 인터페이스하는 4X3 키패드에 대한 avr 코드입니다. 나는 끝에있는 '#'만 볼 수있다. 나는 실수를 저지르고있는 곳을 알아낼 수 없으며, 어떤 도움도 크게 받으실 수 있습니다.AVR 4X3 키패드 프로그래밍

#ifndef F_CPU 
#define F_CPU 1000000UL // 1 MHz clock speed 
#endif 

#define D0 eS_PORTB0 
#define D1 eS_PORTB1 
#define D2 eS_PORTB2 
#define D3 eS_PORTB3 
#define D4 eS_PORTB4 
#define D5 eS_PORTB5 
#define D6 eS_PORTB6 
#define D7 eS_PORTB7 
#define RS eS_PORTD5 
#define EN eS_PORTD7 
#define RW eS_PORTD6 
// #define KEYPAD PORTC //KEYPAD IS ATTACHED ON PORTC 

#include <avr/io.h> 
#include <util/delay.h> 
#include <stdlib.h> 
#include "lcd.h" 
uint8_t key,keypressed; 


    void main() 
    { 
     DDRB = 0xFF; 
     DDRD = 0xFF; 
     int i; 
     Lcd8_Init(); 
     DDRC|= 0XF0; 
     PORTC|= 0X0F; 
     _delay_ms(5000); 
     while(1) 
     { 
      for(i=0;i<10;i++){ 

      if (PINC!=0b11111111)//in any of column pins goes high execute the loop 
      { 

      if (PINC==0b00010001) 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("1");//if row1 and column1 is high show “1” 

      } 
      if (PINC==0b00010010) 
      { 

       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("4");// if row1 and column2 is high show “4” 

      } 
      if (PINC==0b00010100) 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("7");// if row1 and column3 is high show “7” 

      } 
      if (PINC==0b00011000) 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("*");//if row1 and column4 is high show “*” 


      } 

      if (PINC==0b00100001) 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("2");// if row2 and column1 is high show “2” 

      } 
      if (PINC==0b00100010) 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("5");// if row2 and column2 is high show “5” 

      } 
      if (PINC==0b00100100) 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("8");// if row2 and column3 is high show “8” 

      } 
      if (PINC==0b00101000) 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("0");// if row2 and column4 is high show “0” 

      } 

      if (PINC==0b01000001) 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("3"); 

      } 
      if (PINC==0b01000010) 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("6"); 

      } 
      if (PINC==0b01000100) 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("9"); 

      } 
      if (PINC==0b01001000); 
      { 
       Lcd8_Set_Cursor(0,0); 
       Lcd8_Write_String("#"); 


      } 
     } 


     else PINC == 0b11111111; 
     return 0; 
     } 

    } 

}

변화가 만들어 내가 생각하는 코드는

#ifndef F_CPU 
#define F_CPU 1000000UL // 1 MHz clock speed 
#endif 

#define D0 eS_PORTB0 
#define D1 eS_PORTB1 
#define D2 eS_PORTB2 
#define D3 eS_PORTB3 
#define D4 eS_PORTB4 
#define D5 eS_PORTB5 
#define D6 eS_PORTB6 
#define D7 eS_PORTB7 
#define RS eS_PORTD5 
#define EN eS_PORTD7 
#define RW eS_PORTD6 
// #define KEYPAD PORTC //KEYPAD IS ATTACHED ON PORTC 

#include <avr/io.h> 
#include <util/delay.h> 
#include <stdlib.h> 
#include "lcd.h" 

void col_init(void) 
{ 
    DDRD = 0X0F; 
    PORTD = 0X70; 
    _delay_ms(5); 
} 

void row_init(void) 
{ 
    DDRD = 0X78; 
    PORTD = 0X87; 
    _delay_ms(5); 
} 

unsigned char read_key(void) 
{ 
    unsigned char value; 
    col_init(); 
    value = 0; 

    if(!(PINC & 0X10)) 
    { 
     value = 0X01; 
    } 
    else if(!(PINC & 0X20)) 
    { 
     value = 0X02; 
    } 
    else if(!(PINC & 0X40)) 
    { 
     value = 0X03; 
    } 

    row_init(); 

    if(!(PINC & 0X01)) 
    { 
     value += 0X00; 
    } 
    else if(!(PINC & 0X02)) 
    { 
     value += 0X03; 
    } 
    else if(!(PINC & 0X04)) 
    { 
     value += 0X06; 
    } 
    else if(!(PINC & 0X08)) 
    { 
     value += 0X00; 
    } 

    _delay_ms(50); 
    return value; 

} 

int main (void) 
{ 
    unsigned char keypressed; 
    DDRB = 0xFF; 
    DDRD = 0xFF; 
    Lcd8_Init(); 
    keypressed = 0X00; 
    col_init; 
    while(1) 
    { 
     if(!(PINC == 0X70)) 
     { 
      keypressed = read_key(); 
     } 
      Lcd8_Set_Cursor(1,1); 
      Lcd8_Write_String(keypressed); 
    } 
} 

답변

1

당신은 개략적를 게시해야 어느 정도 괜찮습니다. 여기에서 도와주기가 어렵습니다. 눈치 챈 부분 :

1)
DDRC | = 0XF0;
PORTC | = 0X0F;

출력으로 포트 C에서만 4 개의 핀을 설정합니다. if() 조건에서 판단하고 4x3 키패드 (7 핀)를 사용하는 것은 잘못된 것입니다.

2) for 루프는 무엇을해야합니까?

3) 나는 당신이 당신의 괄호를 엉망 생각 :

} 
    else PINC == 0b11111111; 
    return 0; 
    } 

이 방법을 쓸 수있다 : 당신이 의도 아마

} else { 
     PINC == 0b11111111; 
    } 
    return 0; 
    } 

되지 않았는지 확인합니다.

조언 :
코드를 최소한으로 줄이십시오. ONE 단추를 찾으십시오. 코드를 다시 생각해보십시오.

+0

입력 해 주셔서 감사합니다. 정말 도움이되었습니다. 위에 표시된 코드는 완전히 잘못되었습니다. 나는 몇 가지 것을 시도하고 아래의이 코드를 생각해 냈습니다. 내가 본 실수를 알려 주시면 정말 도움이 될 것입니다. –

+1

@shamilik : 이것은 포럼이 아닙니다. 좀 더 구체적인 질문을 시도해야합니다. 토론하고 일반적인 피드백을 얻으려면 특정 포럼을 찾는 것이 좋습니다. –