您的位置 首页 嵌入式

我的矩阵键盘运用笔记——根据msp430g2553

Createdon:2012-9-6Author:zhangbin学习笔记formsp430g2553redesignedbyzhangbin2012-09-06versions:12_09_01Al

Createdon:2012-9-6

Author:zhangbin

学习笔记

formsp430g2553

redesignedbyzhangbin

2012-09-06

versions:12_09_01

AllRightsReserved

这儿首要记载我的运用矩阵键盘输入数据的办法。在体系的规划中,输入数据是常常遇到的,而矩阵键盘是最常用的输入设备。假如矩阵键盘的扫描没有了问题,那么怎样用矩阵键盘输入数据呢,例如我要输入253.45这个数,该怎样完结呢。

下面是我用的两个完结办法:

一、是借用一个怪异的值,也便是键盘扫描时不可能扫到的值,这个数与键盘彻底无关,首要是用来标志有新的按键按下。我运用的是msp430g2553的中止检测按键的,原理是恣意一个按键按下时,就会进入中止函数,然后在中止中再进行判别按下的是哪一个键。可以完结这种办法的根底是msp430g2553的一个IO口组(比方P1,P2)的8个IO口都共用一个中止向量,一组中,不管哪一个IO口触发了中止,都会进入同一个中止中。所以这样就可以用中止来判别有没有按键按下了,然后在中止中再进跋涉一步判别按下的是哪一个按键。这样比运用循环扫描的办法节省了不少单片机的资源,不必按键时,不必一向循环扫描按键。其间键盘中止部分的程序如下:

//Port1interruptserviceroutine

#pragmavector=PORT1_VECTOR

__interruptvoidPort_1(void)

{

uchartemp;

_DINT();//关中止

P1DIR&=~(BIT0+BIT1+BIT2+BIT3);//在中止设为输入,用于消抖由于IO脚默以为输入,所以这句话不要也行,可是

//最好加上使程序明晰

delay_ms(5);//推迟5ms,消抖推迟5ms10ms都行

temp=P1IN&0x0f;//提取衔接按键的4位IO的值

key=99;//给key一个怪异的值,也便是键盘扫面时,不可能扫到的值,这个值彻底与键盘无关,在这儿也便是1~15以外的值

//首要是用来标志有新的按键按下

if(temp==0x01)

{

key=1;

}

elseif(temp==0x02)

{

key=2;

}

elseif(temp==0x03)

{

key=3;

}

elseif(temp==0x04)

{

key=4;

}

elseif(temp==0x05)

{

key=5;

}

elseif(temp==0x06)

{

key=6;

}

elseif(temp==0x07)

{

key=7;

}

elseif(temp==0x08)

{

key=8;

}

elseif(temp==0x09)

{

key=9;

}

elseif(temp==0x0a)

{

key=0;

}

elseif(temp==0x0b)

{

key=11;

t_flag=3;//t_flag=0表明只进行温度的检测,不进行操控

key_flag=1;//设置温度

key_count=0;

key=99;

set_t=0.0;//先把温度值设为0

}

elseif(temp==0x0c)

{

key=12;

t_flag=4;

key_flag=2;//设置时刻

key_count=0;

key=99;

set_time=0;//先把温度值设为0

}

elseif(temp==0x0d)//40°

{

key=13;

t_flag=1;

}

elseif(temp==0x0e)

{

key=14;

t_flag=2;//60

}

elseif(temp==0x0f)

{

key=15;

t_flag=0;//t_flag=0表明只进行温度的检测,不进行操控

}

if(key_flag==1)//设定温度

{

if(key!=99)

{

set_t=set_t*10+key;

//wr_int(4,1,set_t);

key=99;

key_count++;

//wr_int(3,3,key_count);

if(key_count==4)

{

set_t=(float)set_t/10;

wr_float_3(4,1,set_t);//显现设定的温度值

key_flag=0;

key_count=0;

}

}

}

if(key_flag==2)//设定时刻

{

if(key!=99)

{

set_time=set_time*10+key;

wr_int(4,2,set_time);//显现设定的时刻

key=99;

key_count++;

//wr_int(3,2,key_count);

if(key_count==4)

{

set_time_1=set_time;//中心缓冲值替换掉set_time,由于set_time在中止中很灵敏,很简单乱码

//wr_int(3,2,set_time);

int_flag=1;//时刻设置标志方位位

key_flag=0;

key_count=0;

}

}

}

//wr_int(0,1,key);//显现

P1IFG&=~(BIT0+BIT1+BIT2+BIT3);//P1.3IFGcleared软件铲除中止标志位

_EINT();//翻开中止

}

二,是运用一个数组暂存按下的值,然后在进行组合,成为想要的值。数组中元素的个数为为想要输入的数据的总的位数,程序如下:

//Port1interruptserviceroutine

#pragmavector=PORT1_VECTOR//P1口中止,键盘中止

__interruptvoidPort_1(void)

{

uchari=0;

ucharj=0;

_DINT();//键盘处理,封闭中止

key_interrupt_flag=1;

if((key_flag==1)||(key_flag==2))//如按下了设定温度或时刻键,开端计数

{

key_count++;//用于计数按下键的次数,好完结输入设定的温度和时刻

}

key=rd_key();//读取键值

//while((P1IN&BIT3)==0);//等候按键松开

for(i=0;i<10;i++)

{

if(key==key_code[i])//使用数组进行键值转化

key=i;//转化为了对应的数字

}

wr_int(2,1,key);//显现

if(key==60)//*键设定温度

{

key_flag=1;//置1

}

elseif(key==62)//#键设定时刻

{

key_flag=2;

}

elseif(key==47)//B:40°键

{

set_t=40;

set_t_flag=1;//温度设为40°,标志位为1

set_t_flag_1=set_t_flag;

wr_float_1(1,0,set_t);//显现设定温度值

}

elseif(key==55)//C:60°键

{

set_t=60;

set_t_flag=2;//温度设为60°,标志位为2

set_t_flag_1=set_t_flag;

wr_float_1(1,0,set_t);//显现设定温度值

}

if((key_count==1)&&(key<=9))

{

a[0]=key;

}

elseif((key_count==2)&&(key<=9))

{

a[1]=key;

}

elseif((key_count==3)&&(key<=9))

{

a[2]=key;

}

elseif((key_count==4)&&(key<=9))

{

a[3]=key;

}

if(key_flag==1)//温度操控

{

set_t=a[0]*1000+a[1]*100+a[2]*10+a[3];

set_t=set_t/10;

wr_float_1(1,0,set_t);//显现设定温度值

control_flag=1;//温度操控

control_flag_1=control_flag;//暂存起来

wr_int(0,3,control_flag);//显现状况,便于调查,调试时用

set_t_flag=3;//温度设为恣意温度,标志位为3

set_t_flag_1=set_t_flag;

}

if(key_flag==2)//时刻操控

{

set_time=a[0]*1000+a[1]*100+a[2]*10+a[3];

set_time=set_time/10;

wr_float_1(5,0,set_time);//显现设定时刻值

control_flag=2;//时刻操控

control_flag_1=control_flag;//暂存起来

wr_int(0,3,control_flag);//显现状况,便于调查,调试时用

second=0;//秒数计时清零,开端计时

wr_int(0,2,second);//显现秒

time_m=0;//时刻段清零

}

if(key_count==4)//设定完结设定温度和设定时刻只能为xxx.x的方式

{

key_count=0;

key_flag=0;

for(j=0;j<4;j++)

{

a[j]=0;//数组清零

}

}

if(key==39)//A:温度操控敞开或撤销键按一下敞开,再按一下撤销

{

if(control_flag!=0)

control_flag=0;

elseif(control_flag==0)

{

control_flag=control_flag_1;//复原

}

wr_int(0,3,control_flag);//显现状况,便于调查,调试时用

if(set_t_flag!=0)

set_t_flag=0;

elseif(set_t_flag==0)

{

set_t_flag=set_t_flag_1;//复原

}

}

P1IFG&=~BIT3;//中止标志位清零

_EINT();//翻开中止

}

//对应按键功用:*:设定温度键#:设定时刻键A:温度操控敞开或撤销键按一下敞开,再按一下撤销B:40°键C:60°键

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/256249.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部