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;
}
相关推荐
笨笨没好名字1 小时前
怎么看懂51单片机电路图与功能实现的C语言编写(2-7入门篇)
c语言·嵌入式硬件·51单片机
luweis3 小时前
企智孪生 ETA(3.3 认知算法层:ETA 的思维内核 3.4 基础架构:算力与弹性)【浙江联保网络 卢伟舜】
大数据·运维·线性代数·ai·矩阵·学习方法
智者知已应修善业5 小时前
【51单片机用T0定时器方式1,实现0.5S的时间间隔实现第一次一个灯亮、第二次二个灯亮,直到全部灯亮,然后重复整个过程】2023-12-29
c++·经验分享·笔记·算法·51单片机
智者知已应修善业6 小时前
【51单片机4位静态数码管显示1234】2023-11-14
c++·经验分享·笔记·算法·51单片机
装不满的克莱因瓶7 小时前
图像尺寸调整:缩放矩阵如何改变像素坐标?
人工智能·线性代数·数学·算法·机器学习·矩阵
装不满的克莱因瓶9 小时前
矩阵的主成分是什么?主成分分析(PCA)又能做什么?
人工智能·线性代数·算法·机器学习·ai·矩阵·pca
Purple Coder11 小时前
51单片机(1)
单片机·嵌入式硬件·51单片机
我先去打把游戏先11 小时前
Ubuntu虚拟机(服务器版本)Git卸载完全教程——彻底移除与清理配置
服务器·git·单片机·嵌入式硬件·物联网·ubuntu·51单片机
智者知已应修善业13 小时前
【51单片机8个LED的花样12亮34熄56间隔78闪烁3秒3闪烁】2023-11-4
c++·经验分享·笔记·算法·51单片机
羽翼安全13 小时前
显示器泄密与屏幕防拍照系统如何选择?十大核心指标对比
计算机外设