2017-03-21 14 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; 
    } 

されていないこと。

アドバイス:
コードを最小限に抑えてください。 1つのボタンを検出しようとします。あなたのコードを再考してください。

+0

入力いただきありがとうございます。それは本当に助けになりました。私は上記のコードに完全に間違っていました。私はいくつかのことを試してみて、このコードを以下に思いついた。あなたが見ている間違いを私に知らせることができれば、本当に役に立つでしょう。 –

+1

@shamilik:これはフォーラムではないことを覚えておいてください。より具体的な質問をするようにしてください。あなたが物事を話し合い、一般的なフィードバックを得るには、特定のフォーラムを探す方が良いです。 –