Matrix Keyboard
Matrix Keyboard
#include <xc.h>
#define _XTAL_FREQ 6000000
// Function Prototypes
void lcd_init(void);
void lcd_command(unsigned char);
void lcd_data(unsigned char);
char keypad_scan(void);
void main(void)
{
ADCON1 = 0x06; // Make all PORTA pins digital used for Rs and Enable
// Keypad setup
TRISB = 0xF0; // RB0toRB3 as output (rows), RB4?RB7 as input (not used)
PORTB = 0x00;
TRISC = 0x0F; // RC0toRC3 as input (columns)
PORTC = 0x0F; // If using internal pullups, enable them (otherwise use
external)
// LCD setup
TRISD = 0x00; // LCD data lines D0?D7 on PORTD
TRISA = 0x00; // RA0 = EN, RA1 = RS
PORTA = 0x00;
lcd_init();
while (1)
{
char key = keypad_scan();
if (key != 0)
{
lcd_data(key);
__delay_ms(300); // Debounce delay
}
}
}
// LCD Initialization
void lcd_init()
{
lcd_command(0x30);
__delay_ms(100);
lcd_command(0x30);
__delay_ms(100);
lcd_command(0x30);
__delay_ms(100);
lcd_command(0x38); // 8-bit, 2 lines, 5x7
__delay_ms(100);
lcd_command(0x0C); // Display ON, Cursor OFF
__delay_ms(100);
lcd_command(0x01); // Clear display
__delay_ms(100);
lcd_command(0x06); // Entry mode
__delay_ms(100);
}