#include <msp430x22x4.h> int tmp; typedef unsigned int uchar; typedef unsigned int uint; uchar cnt = 0; //位码 uchar scandata[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x07,0x75,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; /***********全局变量********************/ int key_pressed; //按键是否按下 1--是, 0--否 int key_val; //存放键值 int key_flag; //是否放开 1--是, 0--否 int tmp1; int row; int col; int tmp1; int tmp2; //键盘逻辑键值与程序计算键值的映射 uchar key_map[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; uchar Dispbuf[2];
/**************** 初始化键盘扫描的io端口 *********************/ void init_keypad(void) { P1DIR=0xf0; P1OUT |=0xf0; key_pressed =0; key_flag=0; key_val=0; }
void main(void) { WDTCTL=WDT_ADLY_1_9;//看门狗计时 1、9毫秒中断 IE1 |=WDTIE; P4DIR=0xff; P3DIR=0xff; P4OUT=0x00; P3OUT=0xff;
_EINT(); //全局中断 init_keypad(); while(1) { P1OUT &=0x00;//设置p1out全为0,等待按键输入 tmp = P1IN;//获取p1in if((key_pressed ==0x00)&&((tmp &0x0f)<0x0f))//如有键按下 { key_pressed = 1;//如有键按下,设置key_press标志为一 { uint tmp; for(tmp = 12000;tmp>0;tmp--); }
tmp1=0x80; for(row =0;row<4;row++) //行扫描 { P1OUT=0xf0; //p1.4--1.7全输1 P1OUT -= tmp1; //p1.4--1.7输出四位有一个为0 tmp1>>=1; if((P1IN & 0x0F)<0x0f) //是否p1in的p1.0--p1.3有一个0
{ tmp2 = 0x01; //tmp2检测哪一位为0 for(col = 0;col < 4;col++) //列检测 { if((P1IN & tmp2)==0x00)//是否是该列 为0是 { key_val = key_map[row*4 + col];//获取键值 return; // 退出循环 } tmp2 <<=1; //tmp2右移一位
} } } //check_key();//调用它,获取键值 } else if ((key_pressed == 1)&&((tmp &0x0f)==0x0f))//按键已放 { key_pressed = 0;//清除key_press标示 key_flag = 1; //设置key_flag标志 } else { _NOP(); } if (key_flag==1) { key_flag=0; Dispbuf[0]=key_val /10; Dispbuf[1]=key_val %10; } } }
#pragma vector=WDT_VECTOR __interrupt void watchdog_timer(void) { P3OUT=0xff; P4OUT=scandata[Dispbuf][cnt]];//段选 P3OUT &=~(1<<(cnt));//位选 cnt++; //位计数变量在0 1间循环 if (cnt==2) cnt=0; }
|