单片机矩阵按键与点阵

1.要有一个独立按键作为总开关,没有打开的时候,按下矩阵按键,没有任何数值。
2.矩阵按键16个按键每一个都要有对称的数值。
3.LED点阵显示相对应结果。

img

矩阵按键16个按键每一个都要有对称的数值。是0-15的值?还是矩阵扫描的值?要知道扫描的值经过重新排列可以定义为任意需要的值比如通常的0-15也可以是其他任意值比如1-16.
LED点阵显示相对应结果。也就是矩阵被定义了的值?比如0-15。
之下管窥,代码在博客,再获取点阵字模数据即可。

img

以下答案基于ChatGPT与GISer Liu编写:
这里提供一个使用8051单片机的解决方案,包括矩阵按键的扫描和LED点阵的控制。

假设矩阵按键使用4x4的矩阵结构,将按键连接在P0口和P2口,点阵使用8x8的点阵结构,将LED点阵连接在P1口和P3口。

①首先,需要定义一个函数用于扫描矩阵按键并返回对应的数值:

unsigned char scan_key(void)
{
    unsigned char row, col;
    unsigned char key_value = 0;

    // 依次扫描每一行
    for (row = 0; row < 4; row++)
    {
        // 每次只点亮一行,其他行置0
        P0 = ~(1 << row);
        P2 = 0xFF;

        // 检测每一列的状态,如果检测到按键按下,则计算对应数值
        for (col = 0; col < 4; col++)
        {
            if ((P2 & (1 << col)) == 0)
            {
                key_value = row * 4 + col + 1; // 计算对应的数值
                break;
            }
        }

        // 如果检测到按键按下,则结束扫描
        if (key_value != 0)
        {
            break;
        }
    }

    return key_value;
}

②然后,需要定义一个函数用于将数值显示在LED点阵上:

unsigned char display_table[16][8] = {
    {0, 126, 129, 129, 126, 0, 0, 0},    // 数值1对应的显示表
    {0, 66, 129, 129, 66, 0, 0, 0},      // 数值2对应的显示表
    // 其他数值对应的显示表
    // ...
};

void display_number(unsigned char number)
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        P1 = display_table[number-1][i];
        P3 = ~(1 << i);
        delay_ms(2);
    }
}

其中,display_table为一个16x8的二维数组,存储每个数值对应的LED点阵显示表。在display_number函数中,先根据当前要显示的数值在display_table中查找对应的显示表,然后依次将每一列的状态写入P1口并点亮对应的行。

该回答引用ChatGPT
点阵显示就是通过二维点阵结构显示各种字符、动画或图像等,以上一点阵一点阵的方式依次点亮或熄灭各个亮点,由此组成了液晶、LED或LCD显示器的形象。结合单片机矩阵按键,可以实现单片机设备能够控制按键的操作以及点阵显示,给用户更加友好的界面。

实现单片机矩阵按键与点阵的操作,可以按照以下步骤进行:

连接硬件:将16个按键按照4x4的矩阵排列,并连接到单片机的GPIO引脚。将点阵显示器连接到单片机的GPIO引脚,并根据其数据手册设置引脚模式。

初始化:在单片机代码中,首先需要初始化GPIO引脚的方向和上下拉电阻。矩阵按键一般需要设置为输入模式,LED点阵需要设置为输出模式。

循环扫描矩阵按键:在主循环中,可以使用循环扫描的方法读取矩阵按键的状态。可以使用双重循环,第一层循环控制行,第二层循环控制列。当按键按下时,可以根据其行和列的编号计算出对应的按键编码,并将其存储到一个变量中。

检测总开关:在主循环中,在扫描矩阵按键之前,需要检测总开关的状态。如果总开关没有打开,那么当按下任意一个矩阵按键时,应该没有任何响应。可以使用一个单独的GPIO引脚来控制总开关的状态,并在检测到总开关关闭时,清空上一次按键编码的变量。

生成对称的数值:在扫描到按键之后,可以根据其行和列的编号,生成对称的数值。例如,如果按下第0行第0列的按键,则对称的按键为第3行第3列的按键,它们的编码应该相同。可以使用数学公式来计算对称的行和列编号。

显示结果到点阵:在主循环中,可以根据前面步骤中读取的按键编码,通过一些条件语句来确定应该在点阵上显示的内容。可以使用位运算和数组索引来控制点阵的每一个LED的状态。最后将控制点阵的数据发送到点阵控制器的GPIO引脚上,以显示结果。

以下是一个简单的伪代码示例,用于演示上述步骤的实现:

// 初始化GPIO引脚方向和上下拉电阻
init_gpio();

// 初始化点阵显示
init_led_matrix();

// 变量定义
int key_code = -1; // 当前按键编码

// 主循环
while (1) {
    // 检测总开关的状态
    if (!get_switch_input()) { // 如果总开关关闭
        key_code = -1; // 清空上一次按键编码
        continue; // 直接跳过扫