矩阵键盘控制forMSP430
- /*****************************************************************
- //文件名:Keypad.c
- //描述:该文件定义与矩阵键盘有关的各种接口、函数,适用于MSP430F149
- //编写人:小邪@清水
- //版本号:1.01
- *****************************************************************/
- #include
- #include"12864.h"
- ucharkeyPressed;//按键是否被按下:1--是,0--否
- ucharkeyval;//存放键值
- ucharkeyFlag;//按键是否已放开:1--是,0--否
- //设置键盘逻辑键值与程序计算键值的映射
- //12313(enter)
- //45614(up)
- //78915(down)
- //11(.)012(back)16(clear)
- ucharkey_Map[]={1,2,3,13,4,5,6,14,7,8,9,15,11,0,12,16};
- /*************************************************************************
- //名称:InitKeypad
- //参数:延时的时间n
- //返回值:无
- //功能:初始化矩阵键盘的IO口
- *************************************************************************/
- voidInitKeypad(void)
- {
- P1DIR=0xf0;//P1.0~P1.3设置为输入状态,P1.4~P1.7设置为输出状态
- P1OUT|=0xf0;//P1.4~P1.7输出高电平
- keyFlag=0;
- keyPressed=0;
- keyval=0;
- }
- /*************************************************************************
- //名称:CheckKey
- //参数:无
- //返回值:无
- //功能:扫描矩阵键盘,获取键值
- *************************************************************************/
- voidCheckKey(void)
- {
- ucharrow,col,tmp1,tmp2;
- tmp1=0x80;
- for(row=0;row<4;row++)//行扫描
- {
- P1OUT=0xf0;//P1.4~P1.7输出全1
- P1OUT-=tmp1;//P1.4~p1.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为是
- {
- keyval=key_Map[row*4+col];//获取键值
- return;//退出循环
- }
- tmp2<<=1;//tmp2右移1位
- }
- }
- }
- }
- /*************************************************************************
- //名称:delay
- //参数:无
- //返回值:无
- //功能:延时15ms的时间,用于消抖
- *************************************************************************/
- voiddelay()
- {
- uinttmp;
- for(tmp=12000;tmp>0;tmp--);
- }
- /*************************************************************************
- //名称:KeyEvent
- //参数:无
- //返回值:无
- //功能:检测按键,获取键值
- *************************************************************************/
- voidKeyEvent(void)
- {
- uchartmp;
- P1OUT&=0x00;//设置P1OUT全为0,等待按键输入
- tmp=P1IN;//获取p1IN
- if((keyPressed==0x00)&&((tmp&0x0f)<0x0f))//如果有键按下
- {
- keyPressed=1;//如果有按键按下,设置keyPressed标识
- delay();//消除抖动
- CheckKey();//调用checkKey(),获取键值
- }
- elseif((keyPressed==1)&&((tmp&0x0f)==0x0f))//如果按键已经释放
- {
- keyPressed=0;//清除keyPressed标识
- keyFlag=1;//设置keyFlag标识
- }
- else
- {
- keyval=17;
- }
- }
评论