新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 我的矩陣鍵盤使用筆記——基于msp430g2553

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

        作者: 時間:2016-11-28 來源:網絡 收藏
        Createdon:2012-9-6

        Author:zhangbin

        本文引用地址:http://www.104case.com/article/201611/322846.htm

        學習筆記

        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°鍵



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 安化县| 壶关县| 永登县| 曲周县| 兴隆县| 田阳县| 金湖县| 孝昌县| 揭西县| 康马县| 乌恰县| 唐山市| 江都市| 孝昌县| 定远县| 张家港市| 石城县| 丹东市| 赫章县| 双牌县| 岳阳市| 伊金霍洛旗| 敦煌市| 许昌县| 通道| 治县。| 太原市| 巴中市| 阿拉善盟| 米泉市| 土默特右旗| 息烽县| 赞皇县| 北宁市| 夏邑县| 汝州市| 梁平县| 遂宁市| 清新县| 内乡县| 鲁山县|