hnust嵌入式实验三-嵌入式按键驱动程序设计(HAL版本)

1. 概述

本项目设计了一套按键驱动程序,实现嵌入式系统的按键检测和处理功能。程序能正确识别按键按下事件,并调用显示 API 将按键信息显示到数码管和 LED 上。此外,提供 getKey() API 获取按下的键值。

2. 设计要求

  1. 端口定义清晰,方便移植。
  2. 使用合理的中断处理方式,提高响应速度。
  3. 提供详细准确的 API 说明文档。
  4. 每当按键按下,将信息显示到数码管和 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 平台,可根据需求调整端口和外设配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值