MSP430G2553 4x4矩阵键盘

采用行(列)扫描法:

  1. 初始化:所有行线输出低电平,所有列线上拉输入
  2. 确定列:输入为低电平的一列
  3. 确定行:轮流让行线输出低电平,其它行线输出高电平。若使得上一步确定的列线输入为低电平,可以确定按键所在行就是当前输出低电平的一行
  4. 显示数码:列号(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;//LED
P1OUT = 0x00;

P2DIR = 0x0f;//0~3号为行输出,4~7号为列输入
P2REN = 0xf0;//4~7号上拉
P2OUT = 0xf0;

P2IE = 0xff;//开启GPIO中断
P2IES = 0xff;
P2IFG = 0x00;

__bis_SR_register(GIE);

}

#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void){
//P1OUT = 0xff;//test

if(P2IN != 0xf0){
delay();//软件消抖
if(P2IN != 0xf0){
switch(P2IN){//确定按键所在列:对应4~7号中的低电平位
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;
}