採用行(列)掃描法:ui
1.初始化:全部行線輸出低電平,全部列線上拉輸入blog
2.肯定列:輸入爲低電平的一列it
3.肯定行:輪流讓行線輸出低電平,其它行線輸出高電平。若使得上一步肯定的列線輸入爲低電平,能夠肯定按鍵所在行就是當前輸出低電平的一行class
4.顯示數碼:列號(0~3) + 4 * 行號(0~3)test
#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; }