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);
}
}
입력 해 주셔서 감사합니다. 정말 도움이되었습니다. 위에 표시된 코드는 완전히 잘못되었습니다. 나는 몇 가지 것을 시도하고 아래의이 코드를 생각해 냈습니다. 내가 본 실수를 알려 주시면 정말 도움이 될 것입니다. –
@shamilik : 이것은 포럼이 아닙니다. 좀 더 구체적인 질문을 시도해야합니다. 토론하고 일반적인 피드백을 얻으려면 특정 포럼을 찾는 것이 좋습니다. –