<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> STM32 >> 瀏覽文章

        Stm32 鍵盤掃描程序分析

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月26日   【字體:

        我們知道在51單片機中,通過掃描某個口的電平高低得知那個按鍵按下,比如,控制兩行4列,假如讓P1=0xCf;低位都置1 pb0-pb3),pb4-pb50;然后我們就掃描P1口就行了,如果有按鍵被按下的,高電平會被強制拉低的。

        假如按鍵返回的值為0xce,可知是pb0被拉低了,由此可判斷是S1或者S2按下了,其他的同理。

        當然只讓P1=0xcf,是不能判斷出具體的按鍵是哪個的,此時,如果我們取反既P1=0x30;

        當按鍵返回值為0x10時,我們可得知01 0000,pb5=0,s1或者s2被按下,這個時候我們將0xce|0x10=0xde,就是唯一的值了。以此類推,得出其他的值來。

        stm32中是同樣的大道理;

        uint8_t KeyScan(void)

        {

            uint8_t HangValue = 0;

            uint8_t LieValue  = 0;

            uint16_t KeyValue  = 0;

            uint8_t Tmp =0;

            static uint8_t KeyConter = 0;

           

            GPIO_SetBits(Colum1.port, (Colum1.pin|Colum2.pin|Colum3.pin|Colum4.pin));         

            GPIO_ResetBits(Line1.port,(Line1.pin|Line2.pin));

         Tmp = GPIO_ReadInputData(Line1.port);

            if ((Tmp&0x0F) != 0x0F)

            {

                if (KeyConter < 1)

                {//去抖

                    KeyConter++;

               }

               else

                         

                      HangValue = Tmp&0x0f;     

         

                                    GPIO_ResetBits(Colum1.port, (Colum1.pin|Colum2.pin|Colum3.pin|Colum4.pin));  

                    GPIO_SetBits(Line1.port,(Line1.pin|Line2.pin));

                   Tmp = GPIO_ReadInputData(Colum1.port);

                    LieValue = Tmp&0x30;

                     KeyValue = (HangValue)|LieValue;

         if (KeyValue)// KeyValue^KeyValueBkp

                                  

                        KeyValueBkp = KeyValue;

                        switch (KeyValue)

                        {

                                                                           

                  //      case KEY_10:    return KEY_NUM_0;//16;----0

                        case KEY_01:    return KEY_NUM_1;//3;-----1

                        case KEY_02:    return KEY_NUM_2;//4;-----2

                        case KEY_03:    return KEY_NUM_3;//5;-----3               

                        case KEY_04:    return KEY_NUM_4;//7;-----4

                        case KEY_05:    return KEY_NUM_5;//8;-----5

                        case KEY_06:    return KEY_NUM_6;//9;-----6               

                        case KEY_07:    return KEY_NUM_7;//11----7

                        case KEY_08:    return KEY_NUM_8;//------8

                        default:

                            return 0;

                                     

                    }

                    else

                    {

                        return 0;

                    }

                }

            }

            else

            {

                KeyConter = 0;  //計數清零

                KeyValueBkp = 0;

            

           

            return 0;

        }

         

         

         

         

        typedef struct

        {

            GPIO_TypeDef        *port;

            uint16_t    pin;

        }Matrix_t;

         

         

        //const Matrix_t Colum1 = {GPIOD, GPIO_PIN_2};

        //const Matrix_t Colum2 = {GPIOD, GPIO_PIN_3};

        //const Matrix_t Colum3 = {GPIOD, GPIO_PIN_4};

        const Matrix_t Colum1 = {GPIOB, GPIO_Pin_0};

        const Matrix_t Colum2 = {GPIOB, GPIO_Pin_1};

        const Matrix_t Colum3 = {GPIOB, GPIO_Pin_2};

        const Matrix_t Colum4 = {GPIOB, GPIO_Pin_3};

         

        const Matrix_t Line1  = {GPIOB, GPIO_Pin_4};

        const Matrix_t Line2  = {GPIOB, GPIO_Pin_5};

        #define KEY_01 0x1e

        #define KEY_02 0x2e

        #define KEY_03 0x1d

        #define KEY_04 0x2d

        #define KEY_05 0x1b

        #define KEY_06 0x2b

        #define KEY_07 0x17

        #define KEY_08 0x27

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮