0%
采用行(列)扫描法:
- 初始化:所有行线输出低电平,所有列线上拉输入
- 确定列:输入为低电平的一列
- 确定行:轮流让行线输出低电平,其它行线输出高电平。若使得上一步确定的列线输入为低电平,可以确定按键所在行就是当前输出低电平的一行
- 显示数码:列号(0~3) + 4 * 行号(0~3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <msp430.h> typedef unsigned int uint; typedef unsigned char uchar; volatile uint t; volatile uchar key; void delay(){ for(t = 1000; t > 0; t--); } void main(){ WDTCTL = WDTPW + WDTHOLD; P1DIR = 0x0f; P1OUT = 0x00; P2DIR = 0x0f; P2REN = 0xf0; P2OUT = 0xf0; P2IE = 0xff; P2IES = 0xff; P2IFG = 0x00; __bis_SR_register(GIE); } #pragma vector=PORT2_VECTOR __interrupt void Port_2(void){ if(P2IN != 0xf0){ delay(); if(P2IN != 0xf0){ switch(P2IN){ case 0xe0: key = 0; break; case 0xd0: key = 1; break; case 0xb0: key = 2; break; case 0x70: key = 3; break; } P2OUT = 0xfe; if(P2IN != 0xfe) { key += 0; goto Cat; } P2OUT = 0xfd; if(P2IN != 0xfd) { key += 4; goto Cat; } P2OUT = 0xfb; if(P2IN != 0xfb) { key += 8; goto Cat; } P2OUT = 0xf7; if(P2IN != 0xf7) { key += 12; goto Cat; } Cat: P1OUT = key; P2OUT = 0xf0; } } P2IFG &= 0; }
|
