51单片机驱动 矩阵键盘

连接方式为8-1顺序连接P1端口P10-P17,代码返回键值 0-15.

cpp 复制代码
// 矩阵键盘扫描
uchar key_scan(void)
{
    u8 key_value = 255;
    u8 row, col;
    
    // 设置P1.0-P1.3为输出,P1.4-P1.7为输入
    P1 = 0xF0;  // 1111 0000
    
    if((P1 & 0xF0) != 0xF0) {  // 有按键按下
        delay_ms(10);  // 消抖
        if((P1 & 0xF0) != 0xF0) {  // 确认按键按下
            // 逐行扫描
            for(row = 0; row < 4; row++) {
                P1 = ~(1 << row) | 0xF0;  // 将当前行置低,其他行置高
                
                // 检查列
                if((P1 & 0x10) == 0) col = 0;  // 第1列
                else if((P1 & 0x20) == 0) col = 1;  // 第2列
                else if((P1 & 0x40) == 0) col = 2;  // 第3列
                else if((P1 & 0x80) == 0) col = 3;  // 第4列
                else continue;
                
                // 计算键值
                key_value = row * 4 + col ;  // 键值从0开始
                
                // 等待按键释放
                while((P1 & 0xF0) != 0xF0);
                delay_ms(10);  // 消抖
                
 
                break;
            }
        }
    }
		return key_value;
}
相关推荐
Tipriest_12 小时前
旋转矩阵与欧拉角转换数学公式与代码详解
线性代数·矩阵
小π军12 小时前
51单片机第1讲:点亮LED
单片机·嵌入式硬件·51单片机
十子木13 小时前
布林克曼方程和Darcy方程的区别
线性代数·矩阵·学习方法
测试人社区-小明13 小时前
智能测试误报问题的深度解析与应对策略
人工智能·opencv·线性代数·微服务·矩阵·架构·数据挖掘
暖光资讯15 小时前
从「秒罄」到「溢价」:前行者×洛天依联名键盘如何重写外设市场规则
计算机外设
驱动男孩15 小时前
新主机和显示器到了之后,如何让自己显示器 ,显示没有朦胧感呢?新机开荒
计算机外设·win11
点灯小铭15 小时前
基于51单片机的频率可调多波形函数发生器设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
Tipriest_17 小时前
旋转矩阵,齐次变换矩阵,欧拉角,四元数等相互转换的常用代码C++ Python
c++·python·矩阵
小李小李快乐不已19 小时前
数组&&矩阵理论基础
数据结构·c++·线性代数·算法·leetcode·矩阵
小π军20 小时前
51单片机第2讲:数码管
单片机·嵌入式硬件·51单片机