c - 如何连接 KEYPAD-SMALLCALC 和 LCD
问题描述
我正在使用 LM3S316 微控制器和 Keil 软件进行计算器项目
我对如何使用 KEYPAD-SMALLCALC 感到有些困惑
所以,我的问题是:我怎样才能使用这个键盘并初始化它,我怎样才能表示值并最终使用它,如何将它与 LCD 连接
谢谢你
解决方案
KEYPAD-SMALL-CALC 是一个矩阵键盘,这意味着您应该将一些引脚配置为输入,将一些引脚配置为输出。这是一个不错的库,我个人使用矩阵键盘在我的项目中使用过它 - https://github.com/nimaltd/KeyPad
您应该能够将它集成到您的代码中而不会出现太多问题。简而言之,您有 cols 和 rows。在提供的示例中,行是输入引脚,列是输出引脚。有一个用于检查按钮按下的 for 循环。默认情况下,行是高的,一旦按下按钮,库就会检查 row 和 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) 代码将停留在这里并等待按键。
希望能帮助到你!
推荐阅读
- sql - Where 子句 T-SQL 没有给出预期的结果
- azure-devops - AzureDevOps yaml 模板 - 表达式作为参数默认值
- python-2.7 - 如何使用python在pdf中绘制形状?
- r - 将密度图分成 4 组并将组添加到数据表中
- linux - 用 shell 脚本中的随机数替换 XML 属性值
- reactjs - React Native:重新渲染太多。React 限制渲染次数以防止无限循环
- c# - 如何在循环的每次迭代后将值传递给单独的变量,或传递给数组以供后续在循环中使用/使用?
- spring - 使用 JDBC 的 Spring Integration 消息传递应用程序
- python - 如何禁用 QWizard 所有页面的后退按钮?
- django - 如何创建表单控制部分?