diff options
Diffstat (limited to 'demo/keypad_display.c')
-rw-r--r-- | demo/keypad_display.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/demo/keypad_display.c b/demo/keypad_display.c new file mode 100644 index 0000000..e6cadf6 --- /dev/null +++ b/demo/keypad_display.c @@ -0,0 +1,84 @@ +/** + * Demonstration code for MCU 8051 IDE + * + * Create virtual multiplexed LED display + * [Main menu] -> [Virtual HW] -> [Open] + * and open file keypad_display.vhw . + * Then press F2 and F9 to start simulation. + * + * Notes: + * F9 - stop simulation + * F2 - shutdown simulator + * + * @file keypad_display.c + */ + +#include <8051.h> +#define USE_INLINE_ASM 1 + +static const char keypad[] = { + 0xEF, 0xDF, 0xBF, 0x7F +}; +static const char display_0[] = { + 0xf9, 0x64, 0x70, 0x48 +}; +static const char display_1[] = { + 0x59, 0x52, 0x42, 0x40 +}; +static const char display_2[] = { + 0xf8, 0x40, 0x50, 0xc6 +}; +static const char display_3[] = { + 0x79, 0xc0, 0x49, 0xc0 +}; + +char state; +int row; + +int main() +{ + while(1) { + for(row=0; row<4; row++) { + P1=keypad[row]; + + #if USE_INLINE_ASM + // Inline assembler + _asm + mov _state, P1 + _endasm; + #else + state=P1; + #endif + + state&=0x0f; + state^=0x0f; + + if(state & 1) { + state=0; + } else if(state & 2) { + state=1; + } else if(state & 4) { + state=2; + } else if(state & 8) { + state=3; + } else { + continue; + } + + switch(row) { + case 0: + P3=display_0[state]; + break; + case 1: + P3=display_1[state]; + break; + case 2: + P3=display_2[state]; + break; + case 3: + P3=display_3[state]; + break; + } + } + } +} |