6-1矩阵键盘(SDCC + Notepad++ + STC-ISP/普中ISP)

发布时间:2026/11/5 2:02:35

6-1矩阵键盘(SDCC + Notepad++ + STC-ISP/普中ISP) 矩阵按键介绍矩阵按键和独立按键都属于输入设备当按键一端接地即0另外一端读取到0说明按键被按下如果是1说明按键没有按下。在键盘中按键数量较多时为了减少I/O口的占用通常将按键排列成矩阵形式。采用逐行或者逐列的扫描就可以读出任何位置按键的状态。逐行扫描如上矩阵可以逐行或者逐列扫描但是这个单片机有点问题逐行扫描会导致蜂鸣器冲突而蜂鸣所以这里介绍逐行实际使用逐列。逐行扫描假如先扫描S1、S2、S3、S4这一行谁按下了按键那么就让P17为0P16、P15、P14为1此时就相当于一行独立按键了。读取P13、P12、P11、P10的值来判断第一行哪个按键被按下。如果读第二行谁按下了按键 那就让P16为0P17、P15、P14为1。4×4 矩阵按键扫描状态表行 \ 列第 1 列 (P1.3)第 2 列 (P1.2)第 3 列 (P1.1)第 4 列 (P1.0)第 1 行(P1.70)按键 10111 01110x77按键 20111 10110x7B按键 30111 11010x7D按键 40111 11100x7E第 2 行(P1.60)按键 51011 01110xB7按键 61011 10110xBB按键 71011 11010xBD按键 81011 11100xBE第 3 行(P1.50)按键 91101 01110xD7按键 101101 10110xDB按键 111101 11010xDD按键 121101 11100xDE第 4 行(P1.40)按键 131110 01110xE7按键 141110 10110xEB按键 151110 11010xED按键 161110 11100xEE逐列扫描逐列扫描比如扫描S1S5S9S13这一列就让P13为0P12、P11、P10为1读取P17/P16/P15/P14的值来获取哪个按键被按下。扫描状态表逐列扫描列 \ 行第 1 行 (P1.7)第 2 行 (P1.6)第 3 行 (P1.5)第 4 行 (P1.4)第 1 列(P1.30)按键 10111 01110x77按键 51011 01110xB7按键 91101 01110xD7按键 131110 01110xE7第 2 列(P1.20)按键 20111 10110x7B按键 61011 10110xBB按键 101101 10110xDB按键 141110 10110xEB第 3 列(P1.10)按键 30111 11010x7D按键 71011 11010xBD按键 111101 11010xDD按键 151110 11010xED第 4 列(P1.00)按键 40111 11100x7E按键 81011 11100xBE按键 121101 11100xDE按键 161110 11100xEE逐行扫描拉低高 4 位读低 4 位读到的值低 4 位有个 0。逐列扫描拉低低 4 位读高 4 位读到的值高 4 位有个 0。代码目录结构Mode LastWriteTime Length Name----------------------------a----2026-11-02 15:31 220 Delay.c# 上个项目复制过来的-a----2026-11-02 15:30 83 Delay.h# 上个项目复制过来的-a----2026-11-02 16:00 3880 LCD1602.c# 上个项目复制过来的-a----2026-11-02 15:31 925 LCD1602.h# 上个项目复制过来的-a----2026-11-04 11:16 1846 MatrixKey.c-a----2026-11-04 11:11 100 MatrixKey.h-a----2026-11-04 11:11 408 61_main.c-a----2026-11-04 11:20 523 MakefileMatrixKey.c#includemcs51/8051.h#includeDelay.h// 逐列扫描码拉低低 4 位// 0xF7: 1111 0111 (拉低 P1.3第 1 列)// 0xFB: 1111 1011 (拉低 P1.2第 2 列)// 0xFD: 1111 1101 (拉低 P1.1第 3 列)// 0xFE: 1111 1110 (拉低 P1.0第 4 列)constunsignedchar__code ScanCodeCol[4]{0xF7,0xFB,0xFD,0xFE};// 16个按键的扫描值逐列扫描时读到的 P1 值// 按物理顺序排1~4为第一行5~8为第二行...constunsignedchar__code KeyCode[4][4]{{0x77,0x7B,0x7D,0x7E},// 第 1 行{0xB7,0xBB,0xBD,0xBE},// 第 2 行{0xD7,0xDB,0xDD,0xDE},// 第 3 行{0xE7,0xEB,0xED,0xEE}// 第 4 行};/** * brief 逐列扫描 4×4 矩阵键盘 * param 无 * retval 默认返回0当有按键按下时返回按键的键值1~16 * note 扫描原理依次拉低 P1.3~P1.0列读取 P1.7~P1.4行。 * 按下按键后会死等松开while 循环防止一次按下触发多次。 */unsignedcharMatrixKey_ScanCol(void){unsignedcharcol,row;// col是列row是行unsignedcharkey0;// 默认没按键for(col0;col4;col){P1ScanCodeCol[col];// 拉低当前列if(P1!ScanCodeCol[col])// 有行被拉低说明有键按下{Delay(10);// 消抖if(P1!ScanCodeCol[col])// 再次确认{// 【核心】遍历 row 查表for(row0;row4;row){if(P1KeyCode[row][col])// 依次取0列的0到3行{keyrow*4col1;// 算出 1~16// 【关键】等待松开只要还是按下的状态就一直死循环等while(P1!ScanCodeCol[col]);break;// 松开后跳出 row 循环}}if(key!0){break;}// 找到了跳出 col 循环}}}P10xFF;// 统一恢复 1111 1111returnkey;}MatrixKey.h#ifndef__MATRIXKEY_H__#define__MATRIXKEY_H__unsignedcharMatrixKey_ScanCol(void);#endif61_main.c#includemcs51/8051.h#includeLCD1602.h#includeDelay.h#includeMatrixKey.h// 包含矩阵键盘头文件voidmain(void){unsignedcharkey0;LCD_Init();LCD_ShowString(1,1,Matrix Key Test);LCD_ShowNum(2,1,0,2);while(1){keyMatrixKey_ScanCol();// 直接调用if(key){LCD_ShowNum(2,1,key,2);}}}MakefileCC sdcc CFLAGS -mmcs51 --model-small --iram-size 256 --xram-size 0 --code-size 8192 OBJCOPY objcopy TARGET 61_main all: $(TARGET).ihx $(TARGET).hex $(TARGET).ihx: Delay.rel LCD1602.rel MatrixKey.rel 61_main.rel $(CC) $(CFLAGS) Delay.rel LCD1602.rel MatrixKey.rel 61_main.rel -o $(TARGET).ihx %.rel: %.c $(CC) $(CFLAGS) -c $ $(TARGET).hex: $(TARGET).ihx $(OBJCOPY) -I ihex -O ihex $(TARGET).ihx $(TARGET).hex clean: del /Q *.rel *.ihx *.hex *.lst *.sym *.asm *.rst *.lk *.map *.mem 2nul编译PSD:\project\STC51\61-矩阵键盘 make sdcc-mmcs51--model-small--iram-size 256--xram-size 0--code-size 8192-c Delay.c sdcc-mmcs51--model-small--iram-size 256--xram-size 0--code-size 8192-c LCD1602.c sdcc-mmcs51--model-small--iram-size 256--xram-size 0--code-size 8192-c MatrixKey.c sdcc-mmcs51--model-small--iram-size 256--xram-size 0--code-size 8192-c 61_main.c sdcc-mmcs51--model-small--iram-size 256--xram-size 0--code-size 8192 Delay.rel LCD1602.rel MatrixKey.rel 61_main.rel-o 61_main.ihx objcopy-I ihex-O ihex 61_main.ihx 61_main.hex效果展示
延伸阅读

更多相关文章

2026/11/5 2:02:35

USB系统(四)

目录 1.批量传输: 2.中断传输: 3.实时传输: 4.控制传输: 一个事务: 1.批量传输: 批量传输用批量事务来实现,用于传输大量的数据,数据的正确性有保证,时效没有保证。批…

2026/11/5 2:02:35

工控机系统蓝屏怎么排查?从 CMOS 设置到三大件替换的顺序

— 智微工业FAE团队分享 —系统蓝屏是运行中突发、带终止代码和恢复进度的现象,原因既可能在系统与软件,也可能在硬件或外接设备。本文按「排查方法 → 排查步骤 → 解决方法」的顺序整理,文末另附一条排查时最容易做错的地方。 一、排查方法…

2026/11/5 2:02:35

FindCM差分服务怎么用?

园区采购北斗高精度定位时,"厘米级"是被提到最多的指标,但很少有人问一句:这个厘米级靠什么实现、需要什么条件、园区要自建什么。答案在差分服务上——它把基准站网络的改正数据播发给终端,是厘米级定位成立的关键环节…

2026/11/5 5:07:55

未来展望:Horizon路线图与即将推出的重磅功能预览

未来展望:Horizon路线图与即将推出的重磅功能预览 【免费下载链接】Horizon 📡 Your own AI-powered news radar. Generates daily briefings in English & Chinese. | 用 AI 构建你专属的新闻雷达 项目地址: https://gitcode.com/GitHub_Trending…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑