如何连接KEYPAD-SMALLCALC和LCD

时间:2020-05-26 11:19:01

标签: c embedded calculator keil lcd

我正在使用LM3S316微控制器和Keil软件进行计算器项目

我对如何使用KEYPAD-SMALLCALC感到困惑

所以,我的问题是: 我如何使用此键盘并对其进行初始化 另外,我该如何表示值并使用它 最后,如何将其与LCD连接

谢谢

1 个答案:

答案 0 :(得分:0)

KEYPAD-SMALL-CALC是矩阵键盘,这意味着您应将一些引脚配置为输入,将某些引脚配置为输出。 这是我亲自使用矩阵键盘-https://github.com/nimaltd/KeyPad

的一个项目的一个不错的库

您应该能够将其集成到您的代码中,而不会出现太多问题。 简而言之,你有列和行。在提供的示例中,行是输入引脚,列是输出引脚。有一个for循环正在检查按钮是否按下。默认情况下,行高时,一旦按下按钮,库将检查行和col之间的组合,以确定是否已按下哪个按钮。 对于配置引脚,最简单的方法可能是使用诸如“ STM32CubeMX”之类的软件,该软件会通过您的MCU配置生成C代码,您可以在此处轻松配置矩阵键盘行,列,并确定应该为LCD使用哪些引脚。

编辑:这是我在项目中亲自使用的github库的修改版本

源键盘。c

#include "keyboard.h"


//#define   _KEYPAD_DELAY(x)            HAL_Delay(x)


const GPIO_TypeDef* _KEYPAD_COLUMN_GPIO_PORT[] =
{
                                                            COL_1_GPIO_Port,
                                                            COL_2_GPIO_Port,
                                                            COL_3_GPIO_Port,
                                                            COL_4_GPIO_Port,
                                                            COL_5_GPIO_Port,
                                                            COL_6_GPIO_Port,
                                                            COL_7_GPIO_Port,
                                                            COL_8_GPIO_Port 
};

const uint16_t _KEYPAD_COLUMN_GPIO_PIN[] =
{
                                                            COL_1_Pin,
                                                            COL_2_Pin,
                                                            COL_3_Pin,
                                                            COL_4_Pin,
                                                            COL_5_Pin,
                                                            COL_6_Pin,
                                                            COL_7_Pin,
                                                            COL_8_Pin
};

const GPIO_TypeDef* _KEYPAD_ROW_GPIO_PORT[] =
{
                                                            ROW_1_GPIO_Port,
                                                            ROW_2_GPIO_Port,
                                                            ROW_3_GPIO_Port,
                                                            ROW_4_GPIO_Port
};

const uint16_t _KEYPAD_ROW_GPIO_PIN[] =
{
                                                            ROW_1_Pin,
                                                            ROW_2_Pin,
                                                            ROW_3_Pin,
                                                            ROW_4_Pin
};


KeyPad_t    KeyPad;


//#############################################################################################
void    KeyPad_Init(void)
{
    KeyPad.ColumnSize = sizeof(_KEYPAD_COLUMN_GPIO_PIN)/2;
    KeyPad.RowSize = sizeof(_KEYPAD_ROW_GPIO_PIN)/2;
}

//#############################################################################################

uint16_t    KeyPad_Scan(void)
{

    uint16_t key                                =   0;
    uint8_t hold_key                        = 0;
    int int_btn_cnt                         = 0;
    int int_button_state_change = 0;    

    GPIO_PinState int_button_current_state = GPIO_PIN_SET;
    GPIO_PinState int_button_last_state = GPIO_PIN_SET;

    for(uint8_t c=0 ; c<KeyPad.ColumnSize ; c++)
    {

        for(uint8_t i=0 ; i<KeyPad.ColumnSize ; i++)
            HAL_GPIO_WritePin((GPIO_TypeDef*)_KEYPAD_COLUMN_GPIO_PORT[i],_KEYPAD_COLUMN_GPIO_PIN[i],GPIO_PIN_SET);
        HAL_GPIO_WritePin((GPIO_TypeDef*)_KEYPAD_COLUMN_GPIO_PORT[c],_KEYPAD_COLUMN_GPIO_PIN[c],GPIO_PIN_RESET);    

        for(uint8_t r=0 ; r<KeyPad.RowSize ; r++){

            while(HAL_GPIO_ReadPin((GPIO_TypeDef*)_KEYPAD_ROW_GPIO_PORT[r],_KEYPAD_ROW_GPIO_PIN[r])==GPIO_PIN_RESET){
                int_btn_cnt++;
                if(int_btn_cnt == _KEYPAD_DEBOUNCE_TIME_MS){
                        key |= 1<<c;                    
                        key |= 1<<(r+8);
                        return key;
                }
            }

            int_btn_cnt = 0;            

        }       

    }

    return key;
}






//#############################################################################################
uint16_t    KeyPad_WaitForKey(uint32_t  Timeout_ms)
{   
    volatile uint16_t   keyRead;
    while(Timeout_ms==0)
    {
        keyRead = KeyPad_Scan();
        if(keyRead!=0)
        {
            KeyPad.LastKey = keyRead;
            return keyRead; 
        }
    }
    uint32_t    StartTime = HAL_GetTick();
    while(HAL_GetTick()-StartTime < Timeout_ms)
    {
        keyRead = KeyPad_Scan();

        if(keyRead!=0){
            KeyPad.LastKey = keyRead;
            return keyRead; 
        }

    }

    return 0;
}
//#############################################################################################
char    KeyPad_WaitForKeyGetChar(uint32_t   Timeout_ms)
{
    char result = 0;
    switch(KeyPad_WaitForKey(Timeout_ms))
    {
        case 0x802:     // ^
            result =  '^';
            break;      
        case 0x804:     // 7
            result = '7';       
            break;  
        case 0x808:     // 7
            result = '8';       
            break;          
        case 0x810:     // 9
            result = '9';       
            break;      
        case 0x820:     // 04
            result =  0xFF;         
            break;              
        case 0x840:     // D+
            result =  0xFE;         
            break;      
        case 0x880: //  M
            result =  'M';      
            break;      
        case 0x401: //  -%
            result =  '-';  
            break;              
        case 0x402: //  +%
            result =  '+';  
            break;      
        case 0x404: //  4
            result = '4';   
            break;  
        case 0x408: //  6
            result = '5';           
            break;          
        case 0x410: //  6
            result = '6';           
            break;      
        case 0x420: //  03
            result = 0xFD;              
            break;      
        case 0x440: //  PRUREP
            result = 0xFC;      
            break;      
        case 0x480: //  STL
            result = 0xFB;          
            break;      
        case 0x201: //  ALT
            result = 0xFA;          
            break;              
        case 0x202: //  CLK
            result = 0xF9;          
            break;      
        case 0x204: //  1
            result = '1';   
            break;
        case 0x208: //  3
            result = '2';           
            break;          
        case 0x210: //  3
            result = '3';           
            break;      
        case 0x220: //  02
            result = 0xF8;                  
            break;      
        case 0x240: // PY1 RA
            result = 0xF7;
            break;
        case 0x101: // C
            result = 'C';   
            break;          
        case 0x102: // VD
            result = 0xF6;  
            break;      
        case 0x104: // 0
            result = '0';       
            break;      
        case 0x108: // .
            result = '.';       
            break;              
        case 0x110: // QTY
            result = 0xF5;      
            break;              
        case 0x120: // 01
            result = 0xF4;      
            break;      
        case 0x140: // PY2PO
            result = 0xF3;          
            break;      
        case 0x180: // TL
            result = 0xF2;      
            break;              
    }   

    return result;

}

和头文件keyboard.h

#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__

#include <stdint.h>
#include <stdbool.h>

typedef struct
{
    uint8_t     ColumnSize;
    uint8_t     RowSize;
    uint16_t    LastKey;    

}KeyPad_t;

void            KeyPad_Init(void);
uint16_t    KeyPad_WaitForKey(uint32_t  Timeout_ms);
char            KeyPad_WaitForKeyGetChar(uint32_t   Timeout_ms);

#define                     _KEYPAD_DEBOUNCE_TIME_MS                5




#endif /* __KEYBOARD_H__ */

您应该仅使用要使用的端口和引脚配置const阵列,并使用库,如下所示:

在程序开始时初始化键盘:

KeyPad_Init();

并像这样使用它

uint8_t key = KeyPad_WaitForKeyGetChar(1);      // wait 1 ms

key是按下的键的值,如果您使用KeyPad_WaitForKeyGetChar(0),则代码将保留在此处并等待按键。

希望有帮助!