<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 我的矩陣鍵盤使用筆記——基于msp430g2553

          我的矩陣鍵盤使用筆記——基于msp430g2553

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

          Author:zhangbin

          本文引用地址:http://www.ex-cimer.com/article/201611/322846.htm

          學(xué)習(xí)筆記

          formsp430g2553

          redesignedbyzhangbin

          2012-09-06

          versions:12_09_01

          AllRightsReserved

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

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

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

          //Port1interruptserviceroutine

          #pragmavector=PORT1_VECTOR

          __interruptvoidPort_1(void)

          {

          uchartemp;

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

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

          //最好加上使程序清晰

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

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

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

          //主要是用來標(biāo)志有新的按鍵按下

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

          key_flag=1;//設(shè)置溫度

          key_count=0;

          key=99;

          set_t=0.0;//先把溫度值設(shè)為0

          }

          elseif(temp==0x0c)

          {

          key=12;

          t_flag=4;

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

          key_count=0;

          key=99;

          set_time=0;//先把溫度值設(shè)為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)行溫度的檢測(cè),不進(jìn)行控制

          }

          if(key_flag==1)//設(shè)定溫度

          {

          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);//顯示設(shè)定的溫度值

          key_flag=0;

          key_count=0;

          }

          }

          }

          if(key_flag==2)//設(shè)定時(shí)間

          {

          if(key!=99)

          {

          set_time=set_time*10+key;

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

          key=99;

          key_count++;

          //wr_int(3,2,key_count);

          if(key_count==4)

          {

          set_time_1=set_time;//中間緩沖值替換掉set_time,因?yàn)閟et_time在中斷中很敏感,很容易亂碼

          //wr_int(3,2,set_time);

          int_flag=1;//時(shí)間設(shè)置標(biāo)志位置位

          key_flag=0;

          key_count=0;

          }

          }

          }

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

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

          _EINT();//打開中斷

          }

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

          //Port1interruptserviceroutine

          #pragmavector=PORT1_VECTOR//P1口中斷,鍵盤中斷

          __interruptvoidPort_1(void)

          {

          uchari=0;

          ucharj=0;

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

          key_interrupt_flag=1;

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

          {

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

          }

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

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

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

          {

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

          key=i;//轉(zhuǎn)化為了對(duì)應(yīng)的數(shù)字

          }

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

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

          {

          key_flag=1;//置1

          }

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

          {

          key_flag=2;

          }

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

          {

          set_t=40;

          set_t_flag=1;//溫度設(shè)為40°,標(biāo)志位為1

          set_t_flag_1=set_t_flag;

          wr_float_1(1,0,set_t);//顯示設(shè)定溫度值

          }

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

          {

          set_t=60;

          set_t_flag=2;//溫度設(shè)為60°,標(biāo)志位為2

          set_t_flag_1=set_t_flag;

          wr_float_1(1,0,set_t);//顯示設(shè)定溫度值

          }

          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);//顯示設(shè)定溫度值

          control_flag=1;//溫度控制

          control_flag_1=control_flag;//暫存起來

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

          set_t_flag=3;//溫度設(shè)為任意溫度,標(biāo)志位為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è)定時(shí)間值

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

          control_flag_1=control_flag;//暫存起來

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

          second=0;//秒數(shù)計(jì)時(shí)清零,開始計(jì)時(shí)

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

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

          }

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

          {

          key_count=0;

          key_flag=0;

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

          {

          a[j]=0;//數(shù)組清零

          }

          }

          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);//顯示狀態(tài),便于觀察,調(diào)試時(shí)用

          if(set_t_flag!=0)

          set_t_flag=0;

          elseif(set_t_flag==0)

          {

          set_t_flag=set_t_flag_1;//還原

          }

          }

          P1IFG&=~BIT3;//中斷標(biāo)志位清零

          _EINT();//打開中斷

          }

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



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();