From 9db9ac05ce674ed9ead06d92d423fb0995cc9a42 Mon Sep 17 00:00:00 2001 From: aadit Date: Thu, 25 Sep 2025 13:01:27 +0530 Subject: [PATCH] Add ES/Lab/Lab8/16KeyMatrixOn7Seg.c --- ES/Lab/Lab8/16KeyMatrixOn7Seg.c | 79 +++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 ES/Lab/Lab8/16KeyMatrixOn7Seg.c diff --git a/ES/Lab/Lab8/16KeyMatrixOn7Seg.c b/ES/Lab/Lab8/16KeyMatrixOn7Seg.c new file mode 100644 index 0000000..dcb4e58 --- /dev/null +++ b/ES/Lab/Lab8/16KeyMatrixOn7Seg.c @@ -0,0 +1,79 @@ +#include + +const unsigned char seven_seg[16] = { + 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, + 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71 +}; + +#define SEG_SHIFT 4 +#define DIGIT_ENABLE_P1 (1<<23) +#define DIGIT_ENABLE_MASK (0x0F<<23) +#define COL_BASE_BIT 15 +#define ROW_BASE_BIT 19 +#define COL_MASK ((0x0F) << COL_BASE_BIT) +#define ROW_MASK ((0x0F) << ROW_BASE_BIT) + +static void short_delay(volatile unsigned int d){ while(d--) __NOP(); } + +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 |= (0xFF << SEG_SHIFT); + LPC_GPIO0->FIODIR |= COL_MASK; + LPC_GPIO0->FIODIR &= ~ROW_MASK; + LPC_GPIO1->FIODIR |= DIGIT_ENABLE_MASK; + LPC_GPIO0->FIOPIN &= ~(0xFF << SEG_SHIFT); + LPC_GPIO1->FIOPIN &= ~DIGIT_ENABLE_MASK; + LPC_GPIO0->FIOSET = COL_MASK; + + 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<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){ + displayed = candidate & 0x0F; + } + stable = 3; + } + + if(displayed != 0xFF){ + unsigned int seg = seven_seg[displayed]; + LPC_GPIO0->FIOCLR = (0xFF << SEG_SHIFT); + LPC_GPIO0->FIOSET = (seg << SEG_SHIFT); + LPC_GPIO1->FIOCLR = DIGIT_ENABLE_MASK; + LPC_GPIO1->FIOSET = DIGIT_ENABLE_P1; + } + + short_delay(3000); + } +}