1. 概述
本项目设计了一套按键驱动程序,实现嵌入式系统的按键检测和处理功能。程序能正确识别按键按下事件,并调用显示 API 将按键信息显示到数码管和 LED 上。此外,提供 getKey()
API 获取按下的键值。
2. 设计要求
- 端口定义清晰,方便移植。
- 使用合理的中断处理方式,提高响应速度。
- 提供详细准确的 API 说明文档。
- 每当按键按下,将信息显示到数码管和 LED 上。
3. 硬件连接
本系统采用 STM32 微控制器,使用 GPIO 端口连接按键,并通过 LED 和数码管显示按键信息。
4. 主要 API 说明
4.1 getKey(void)
功能:
- 扫描按键,返回当前按下的按键值。
- 使用
key_scan(0)
函数检测按键输入。
代码实现:
uint8_t getKey(void)
{
return key_scan(0); // 扫描按键并返回按键值
}
4.2 Printt(char *String)
功能:
- 将字符串显示在 LED 数码管上。
- 仅支持 0-9 和 a-z 字符。
代码实现:
void Printt(char *String)
{
for (int i = 0; i < 8 && String[i] != '\0'; i++) {
if (String[i] >= '0' && String[i] <= '9') {
SetLed(i, String[i] - '0'); // 显示数字
} else if (String[i] >= 'a' && String[i] <= 'z') {
SetLed(i, String[i] - 'a' + 10); // 显示字母
} else {
SetLed(i, 0x00); // 显示空白
}
HAL_Delay(1);
}
LEDSEL(1); // 选择第1个8段数码管显示
}
4.3 PrintLED(int Num)
功能:
- 将指定的数字显示在 LED 上。
代码实现:
void PrintLED(int Num)
{
LedValue(Num); // 显示数值
HAL_Delay(1);
}
4.4 getkey()
主函数
功能:
- 初始化系统。
- 轮询按键状态。
- 在 LED 和数码管上显示按键编号。
代码实现:
void getkey()
{
uint8_t key = 0, lastKey = 0;
uint32_t displayTime = 0;
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);
LED_Init();
LEDSEL(1);
KEY_Init();
extix_init();
while (1)
{
key = key_scan(0);
if (key != 0)
{
lastKey = key;
displayTime = 10000;
}
if (displayTime > 0)
{
LEDSEL(0);
if (lastKey == KEY1_PRES)
{
Printt("k1");
PrintLED(1);
}
else if (lastKey == KEY2_PRES)
{
Printt("k2");
PrintLED(2);
}
else if (lastKey == KEY3_PRES)
{
Printt("k3");
PrintLED(3);
}
else if (lastKey == KEY4_PRES)
{
Printt("k4");
PrintLED(4);
}
displayTime -= 2;
}
else
{
LEDSEL(0);
Printt(" ");
PrintLED(0);
}
delay_ms(2);
}
}
5. 主程序 main.c
int main(void)
{
getkey();
}
6. 数码管段码表
static uint8_t segTable[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, // 0-9
0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x3d, 0x76, 0x0f, 0x0e, // a-f
0x75, 0x38, 0x37, 0x54, 0x5c, 0x73, 0x67, 0x31, 0x49, 0x78, // g-z
0x3e, 0x1c, 0x7e, 0x64, 0x6e, 0x5a
};
7. 结论
本项目实现了一个完整的按键驱动方案,通过 getKey()
识别按键输入,并利用 LED 和数码管进行反馈显示。采用 key_scan(0)
进行按键扫描,结合 Printt()
和 PrintLED()
进行显示操作。此代码适用于 STM32 平台,可根据需求调整端口和外设配置。