矩阵键盘控制forMSP430
时间:11-27
来源:互联网
点击:
- /*****************************************************************
- //文件名: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;
- }
- }
- /*************************************************************************
- //名称:KeyScan
- //参数:储存矩阵键盘结果的数组的指针
- //返回值:无
- //功能:将矩阵键盘扫描到的数据存储到数组中
- *************************************************************************/
- voidKeyScan(uchar*keyscan)
- {
- uchari,n,flag;
- i=0;
- flag=0;
- for(;;)
- {
- KeyEvent();
- if(keyFlag==1)keyFlag=0;
- if(keyval>=0&&keyval<=9)keyscan[i]=keyval+0;//按下数字键
- if(keyval==11)keyscan[i]=.;//按下小数点
- if(keyval==12)//按下退格键
- {
- keyscan[i-1]=;//清除前一位
- i=i-2;//数组指针前移两位
- flag=1;//小数点标志位置1
- }
- if(keyval==13)//按下确定键
- {
- keyscan[i]=;
- break;
- }
- if(keyval==16)
- {
- for(n=0;n
- WriteStr(0x90,keyscan,(i+1)/2);
- i=-1;
- }
- if(keyval==17)i--;//无键按下
- keyval=17;
- i++;
- //在这里写入显示keyscan数组的语句,长度为i
- WriteStr(0x90,keyscan,(i+1)/2);
- if(flag==1)//有小数点键按下
- {
- //在这里写入在显示末尾写入空格的语句
- Send(1,);
- flag=0;
- }
- }
- }
- /*************************************************************************
- //名称:Str2Float
- //参数:储存浮点数据result,储存键盘结果的数组指针
- //返回值:result
- //功能:将矩阵键盘扫描到的数据转化为浮点数
- *************************************************************************/
- floatStr2Float(uchar*keyscan)
- {
- floatresult;
- uchari;
- uintdot;
- i=0;
- dot=0;
- for(i=0;;i++)
- {
- if(keyscan[i]==.)
- {
- if(keyscan[i+2]==)keyscan[i+2]=0;
- if(i==1)result=(keyscan[0]-0)+(keyscan[2]-0)*0.1+(keyscan[3]-0)*0.01;
- if(i==2)result=(keyscan[0]-0)*10+(key
矩阵键盘控制MSP43 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)