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:請記住,這不是一個論壇。你應該嘗試提出更具體的問題。如果你想討論事情並獲得一般反饋,你最好找一個特定的論壇。 –