<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 我的矩陣鍵盤(pán)使用筆記——基于msp430g2553

我的矩陣鍵盤(pán)使用筆記——基于msp430g2553

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏
Createdon:2012-9-6

Author:zhangbin

本文引用地址:http://dyxdggzs.com/article/201611/322846.htm

學(xué)習筆記

formsp430g2553

redesignedbyzhangbin

2012-09-06

versions:12_09_01

AllRightsReserved

這里主要記錄我的使用矩陣鍵盤(pán)輸入數據的方法。在系統的設計中,輸入數據是經(jīng)常遇到的,而矩陣鍵盤(pán)是最常用的輸入設備。如果矩陣鍵盤(pán)的掃描沒(méi)有了問(wèn)題,那么怎樣用矩陣鍵盤(pán)輸入數據呢,例如我要輸入253.45這個(gè)數,該怎么實(shí)現呢。

下面是我用的兩個(gè)實(shí)現方法:

一、是借用一個(gè)詭異的值,也就是鍵盤(pán)掃描時(shí)不可能掃到的值,這個(gè)數與鍵盤(pán)完全無(wú)關(guān),主要是用來(lái)標志有新的按鍵按下。我使用的是msp430g2553的中斷檢測按鍵的,原理是任意一個(gè)按鍵按下時(shí),就會(huì )進(jìn)入中斷函數,然后在中斷中再進(jìn)行判斷按下的是哪一個(gè)鍵。能夠實(shí)現這種方法的基礎是msp430g2553的一個(gè)IO口組(比如P1,P2)的8個(gè)IO口都共用一個(gè)中斷向量,一組中,無(wú)論哪一個(gè)IO口觸發(fā)了中斷,都會(huì )進(jìn)入同一個(gè)中斷中。所以這樣就可以用中斷來(lái)判斷有沒(méi)有按鍵按下了,然后在中斷中再進(jìn)行進(jìn)一步判斷按下的是哪一個(gè)按鍵。這樣比使用循環(huán)掃描的方法節省了不少單片機的資源,不用按鍵時(shí),不用一直循環(huán)掃描按鍵。其中鍵盤(pán)中斷部分的程序如下:

//Port1interruptserviceroutine

#pragmavector=PORT1_VECTOR

__interruptvoidPort_1(void)

{

uchartemp;

_DINT();//關(guān)中斷

P1DIR&=~(BIT0+BIT1+BIT2+BIT3);//在中斷設為輸入,用于消抖因為IO腳默認為輸入,所以這句話(huà)不要也行,但是

//最好加上使程序清晰

delay_ms(5);//延遲5ms,消抖延遲5ms10ms都行

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

key=99;//給key一個(gè)詭異的值,也就是鍵盤(pán)掃面時(shí),不可能掃到的值,這個(gè)值完全與鍵盤(pán)無(wú)關(guān),在這里也就是1~15以外的值

//主要是用來(lái)標志有新的按鍵按下

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表示只進(jìn)行溫度的檢測,不進(jìn)行控制

key_flag=1;//設置溫度

key_count=0;

key=99;

set_t=0.0;//先把溫度值設為0

}

elseif(temp==0x0c)

{

key=12;

t_flag=4;

key_flag=2;//設置時(shí)間

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表示只進(jìn)行溫度的檢測,不進(jìn)行控制

}

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)//設定時(shí)間

{

if(key!=99)

{

set_time=set_time*10+key;

wr_int(4,2,set_time);//顯示設定的時(shí)間

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;//時(shí)間設置標志位置位

key_flag=0;

key_count=0;

}

}

}

//wr_int(0,1,key);//顯示

P1IFG&=~(BIT0+BIT1+BIT2+BIT3);//P1.3IFGcleared軟件清除中斷標志位

_EINT();//打開(kāi)中斷

}

二,是使用一個(gè)數組暫存按下的值,然后在進(jìn)行組合,成為想要的值。數組中元素的個(gè)數為為想要輸入的數據的總的位數,程序如下:

//Port1interruptserviceroutine

#pragmavector=PORT1_VECTOR//P1口中斷,鍵盤(pán)中斷

__interruptvoidPort_1(void)

{

uchari=0;

ucharj=0;

_DINT();//鍵盤(pán)處理,關(guān)閉中斷

key_interrupt_flag=1;

if((key_flag==1)||(key_flag==2))//如按下了設定溫度或時(shí)間鍵,開(kāi)始計數

{

key_count++;//用于計數按下鍵的次數,好實(shí)現輸入設定的溫度和時(shí)間

}

key=rd_key();//讀取鍵值

//while((P1IN&BIT3)==0);//等待按鍵松開(kāi)

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

{

if(key==key_code[i])//利用數組進(jìn)行鍵值轉化

key=i;//轉化為了對應的數字

}

wr_int(2,1,key);//顯示

if(key==60)//*鍵設定溫度

{

key_flag=1;//置1

}

elseif(key==62)//#鍵設定時(shí)間

{

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;//暫存起來(lái)

wr_int(0,3,control_flag);//顯示狀態(tài),便于觀(guān)察,調試時(shí)用

set_t_flag=3;//溫度設為任意溫度,標志位為3

set_t_flag_1=set_t_flag;

}

if(key_flag==2)//時(shí)間控制

{

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);//顯示設定時(shí)間值

control_flag=2;//時(shí)間控制

control_flag_1=control_flag;//暫存起來(lái)

wr_int(0,3,control_flag);//顯示狀態(tài),便于觀(guān)察,調試時(shí)用

second=0;//秒數計時(shí)清零,開(kāi)始計時(shí)

wr_int(0,2,second);//顯示秒

time_m=0;//時(shí)間段清零

}

if(key_count==4)//設定完成設定溫度和設定時(shí)間只能為xxx.x的形式

{

key_count=0;

key_flag=0;

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

{

a[j]=0;//數組清零

}

}

if(key==39)//A:溫度控制開(kāi)啟或取消鍵按一下開(kāi)啟,再按一下取消

{

if(control_flag!=0)

control_flag=0;

elseif(control_flag==0)

{

control_flag=control_flag_1;//還原

}

wr_int(0,3,control_flag);//顯示狀態(tài),便于觀(guān)察,調試時(shí)用

if(set_t_flag!=0)

set_t_flag=0;

elseif(set_t_flag==0)

{

set_t_flag=set_t_flag_1;//還原

}

}

P1IFG&=~BIT3;//中斷標志位清零

_EINT();//打開(kāi)中斷

}

//對應按鍵功能:*:設定溫度鍵#:設定時(shí)間鍵A:溫度控制開(kāi)啟或取消鍵按一下開(kāi)啟,再按一下取消B:40°鍵C:60°鍵



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>