Add ES/Lab/Lab8/16KeyMatrixOn7Seg.c
This commit is contained in:
parent
b864c4d8da
commit
9db9ac05ce
1 changed files with 79 additions and 0 deletions
79
ES/Lab/Lab8/16KeyMatrixOn7Seg.c
Normal file
79
ES/Lab/Lab8/16KeyMatrixOn7Seg.c
Normal file
|
@ -0,0 +1,79 @@
|
|||
#include <LPC17xx.h>
|
||||
|
||||
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<<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){
|
||||
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);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue