From dd2c41c0b9dbc89de31e2e955e6d88cea93b0c21 Mon Sep 17 00:00:00 2001 From: sherlock Date: Thu, 16 Oct 2025 11:07:04 +0530 Subject: [PATCH] Updated data for ES --- ES/Lab/Lab9/keyp.c | 160 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 ES/Lab/Lab9/keyp.c diff --git a/ES/Lab/Lab9/keyp.c b/ES/Lab/Lab9/keyp.c new file mode 100644 index 0000000..7e902dd --- /dev/null +++ b/ES/Lab/Lab9/keyp.c @@ -0,0 +1,160 @@ +#include + +#define RS_CTRL 0x08000000 +#define EN_CTRL 0x10000000 +#define DT_CTRL 0x07800000 + +#define COL_BASE_BIT 15 +#define ROW_BASE_BIT 19 +#define COL_MASK ((0x0F) << COL_BASE_BIT) +#define ROW_MASK ((0x0F) << ROW_BASE_BIT) + +unsigned long int temp1 = 0, temp2 = 0, i; +unsigned char flag1 = 0, flag2 = 0; + +unsigned long int init_command[] = { + 0x30, 0x30, 0x30, 0x20, 0x28, 0x0C, 0x01, 0x80 +}; + +const unsigned char key_chars[16] = { + '0','1','2','3','4','5','6','7', + '8','9','A','B','C','D','E','F' +}; + +void lcd_write(void); +void port_write(void); +void delay_lcd(unsigned long); +void short_delay(volatile unsigned int d); +void lcd_display_key(unsigned char key); + +int main(void) { + unsigned int col_idx, row_idx; + unsigned int candidate = 0xFF; + unsigned int stable = 0; + unsigned int displayed = 0xFF; + unsigned int row_bits; + + LPC_PINCON->PINSEL0 &= ~(0xFFFFFFFF); + LPC_PINCON->PINSEL1 &= ~(0xFFFFFFFF); + + LPC_GPIO0->FIODIR = DT_CTRL | RS_CTRL | EN_CTRL; + LPC_GPIO0->FIODIR |= COL_MASK; + LPC_GPIO0->FIODIR &= ~ROW_MASK; + + LPC_GPIO0->FIOSET = COL_MASK; + + flag1 = 0; + for (i = 0; i < 8; i++) { + temp1 = init_command[i]; + lcd_write(); + } + + flag1 = 0; + temp1 = 0x80; + lcd_write(); + + flag1 = 1; + temp1 = 'K'; + lcd_write(); + temp1 = 'e'; + lcd_write(); + temp1 = 'y'; + lcd_write(); + temp1 = ':'; + lcd_write(); + temp1 = ' '; + lcd_write(); + + for(;;) { + unsigned int read_key = 0xFF; + + for(col_idx = 0; col_idx < 4; col_idx++) { + LPC_GPIO0->FIOSET = COL_MASK; + short_delay(50); + LPC_GPIO0->FIOCLR = (1 << (COL_BASE_BIT + col_idx)); + short_delay(200); + + row_bits = (LPC_GPIO0->FIOPIN & ROW_MASK) >> ROW_BASE_BIT; + + if(row_bits != 0x0F) { + for(row_idx = 0; row_idx < 4; row_idx++) { + if((row_bits & (1 << row_idx)) == 0) { + read_key = col_idx * 4 + row_idx; + break; + } + } + LPC_GPIO0->FIOSET = COL_MASK; + break; + } + LPC_GPIO0->FIOSET = COL_MASK; + } + + if(read_key == candidate) { + if(stable < 3) stable++; + } else { + candidate = read_key; + stable = 1; + } + + if(stable >= 3) { + if(candidate != 0xFF && candidate != displayed) { + displayed = candidate; + lcd_display_key(displayed); + } + stable = 3; + } + + short_delay(3000); + } +} + +void lcd_display_key(unsigned char key) { + flag1 = 0; + temp1 = 0x85; + lcd_write(); + + flag1 = 1; + temp1 = key_chars[key]; + lcd_write(); +} + +void short_delay(volatile unsigned int d) { + while(d--) __NOP(); +} + +void lcd_write(void) { + flag2 = (flag1 == 1) ? 0 : + (((temp1 == 0x30) || (temp1 == 0x20)) ? 1 : 0); + + temp2 = temp1 & 0xf0; + temp2 = temp2 << 19; + port_write(); + + if (!flag2) { + temp2 = temp1 & 0x0f; + temp2 = temp2 << 23; + port_write(); + } +} + +void port_write(void) { + LPC_GPIO0->FIOPIN = temp2; + + if (flag1 == 0) { + LPC_GPIO0->FIOCLR = RS_CTRL; + } else { + LPC_GPIO0->FIOSET = RS_CTRL; + } + + LPC_GPIO0->FIOSET = EN_CTRL; + delay_lcd(100); + LPC_GPIO0->FIOCLR = EN_CTRL; + + delay_lcd(500000); +} + +void delay_lcd(unsigned long r1) { + unsigned long r; + for (r = 0; r < r1; r++); + return; +}