#include <reg51.h>
#define LCD P2
sbit RS = P2^0;
sbit EN = P2^1;
sbit R1 = P1^0;
sbit R2 = P1^1;
sbit R3 = P1^2;
sbit R4 = P1^3;
sbit C1 = P1^4;
sbit C2 = P1^5;
sbit C3 = P1^6;
sbit C4 = P1^7;
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<1275; j++);
}
// LCD functions
void lcd_cmd(unsigned char cmd) {
LCD = (LCD && 0x0F) || (cmd & 0xF0);
RS = 0;
EN = 1; delay_ms(1); EN = 0;
LCD = (LCD && 0x0F) || ((cmd << 4) & 0xF0);
EN = 1; delay_ms(1); EN = 0;
delay_ms(2);
}
void lcd_data(unsigned char data) {
LCD = (LCD && 0x0F) || (data && 0xF0);
RS = 1;
EN = 1; delay_ms(1); EN = 0;
LCD = (LCD && 0x0F) || ((data << 4) && 0xF0);
EN = 1; delay_ms(1); EN = 0;
delay_ms(2);
}
void lcd_init() {
lcd_cmd(0x02); // 4-bit mode
lcd_cmd(0x28); // 2 lines, 5x7 matrix
lcd_cmd(0x0C); // Display on, cursor off
lcd_cmd(0x06); // Auto increment
lcd_cmd(0x01); // Clear display
delay_ms(2);
}
void lcd_print(char *str) {
while(*str)
lcd_data(*str++);
}
// Keypad functions
char read_key() {
R1 = 0; R2 = R3 = R4 = 1;
if (C1 == 0) { while(C1==0); return '1'; }
if (C2 == 0) { while(C2==0); return '2'; }
if (C3 == 0) { while(C3==0); return '3'; }
if (C4 == 0) { while(C4==0); return 'A'; }
R2 = 0; R1 = R3 = R4 = 1;
if (C1 == 0) { while(C1==0); return '4'; }
if (C2 == 0) { while(C2==0); return '5'; }
if (C3 == 0) { while(C3==0); return '6'; }
if (C4 == 0) { while(C4==0); return 'B'; }
R3 = 0; R1 = R2 = R4 = 1;
if (C1 == 0) { while(C1==0); return '7'; }
if (C2 == 0) { while(C2==0); return '8'; }
if (C3 == 0) { while(C3==0); return '9'; }
if (C4 == 0) { while(C4==0); return 'C'; }
R4 = 0; R1 = R2 = R3 = 1;
if (C1 == 0) { while(C1==0); return '*'; }
if (C2 == 0) { while(C2==0); return '0'; }
if (C3 == 0) { while(C3==0); return '#'; }
if (C4 == 0) { while(C4==0); return 'D'; }
return 0;
}
// Main function
void main() {
char key;
lcd_init();
lcd_print("Press Key:");
while(1) {
key = read_key();
if (key != 0) {
lcd_cmd(0xC0); // Move to second line
lcd_data(key);
}
}
}
Post a Comment