目录

  • 一、任务简述
  • 二、实现方法
  • 三、参考代码

一、任务简述

在CT107D单片机上,使按键S4-S19组成4X4的矩阵键盘,在扫描按键的过程中,发现有按键触发信号后(不做去抖动处理),待按键松开后,在数码管的第一位显示相应的数字:从左至右,从上到下,依次显示0-F。

二、实现方法

数码管显示和573锁存器选择设置可以参考上几篇博客,在此就不再做过多讲解。重点讲解下怎么构成矩阵键盘:

第一行(R1):S7,S11,S15,S19;
第一行(R2):S6,S10,S14,S18;
第一行(R3):S5,S9,S13,S17;
第一行(R4):S4,S8,S12,S16;
第一列(C1):S7,S6,S5,S4;
第一列(C2):S11,S10,S9,S8;
第一列(C3):S15,S14,S13,S12;
第一列(C4):S19,S18,S17,S16;
即 P3引脚控制矩阵键盘。
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;

sbit C4 = P3^4;
sbit C3 = P3^5;
sbit C2 = P3^6;
sbit C1 = P3^7;
如何判断是哪一个按键按下:令R1为低电平,其他行为高电平;先令C1为低电平,其他列为高电平,判断是否为S7按下,若不是则令C2为低电平,其他为高电平,判断是否为S6按下,若不是,则继续依次方法类推,直至判断出是哪一个按键按下。

三、参考代码

#include "reg52.h"sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3; sbit C4 = P3^4;
sbit C3 = P3^5;
sbit C2 = P3^6;
sbit C1 = P3^7;unsigned char code SEG[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};void Select_HC573(unsigned char channel)
{switch(channel){case 4:P2 = (P2 & 0x1f) | 0x80;break;case 5:P2 = (P2 & 0x1f) | 0xa0;break;case 6:P2 = (P2 & 0x1f) | 0xc0;break;case 7:P2 = (P2 & 0x1f) | 0xe0;break;}
}
void dispaly(unsigned char val)
{Select_HC573(6);P0 = 0x01;Select_HC573(7);P0 = val;
}
unsigned char KeysVal;
void ScanKeysMulti()
{R1 = 0;R2 = R3 = R4 = 1;C1 = C2 = C3 = C4 = 1;if(C1 == 0){while(C1 == 0);KeysVal = 0;dispaly(SEG[KeysVal]);}else if(C2 == 0){while(C2 == 0);KeysVal = 1;dispaly(SEG[KeysVal]);}else if(C3 == 0){while(C3 == 0);KeysVal = 2;dispaly(SEG[KeysVal]);}else if(C4 == 0){while(C4 == 0);KeysVal = 3;dispaly(SEG[KeysVal]);}//2R2 = 0;R1 = R3 = R4 = 1;C1 = C2 = C3 = C4 = 1;if(C1 == 0){while(C1 == 0);KeysVal = 4;dispaly(SEG[KeysVal]);}else if(C2 == 0){while(C2 == 0);KeysVal = 5;dispaly(SEG[KeysVal]);}else if(C3 == 0){while(C3 == 0);KeysVal = 6;dispaly(SEG[KeysVal]);}else if(C4 == 0){while(C4 == 0);KeysVal = 7;dispaly(SEG[KeysVal]);}//3R3 = 0;R2 = R1 = R4 = 1;C1 = C2 = C3 = C4 = 1;if(C1 == 0){while(C1 == 0);KeysVal = 8;dispaly(SEG[KeysVal]);}else if(C2 == 0){while(C2 == 0);KeysVal = 9;dispaly(SEG[KeysVal]);}else if(C3 == 0){while(C3 == 0);KeysVal = 10;dispaly(SEG[KeysVal]);}else if(C4 == 0){while(C4 == 0);KeysVal = 11;dispaly(SEG[KeysVal]);}//4R4 = 0;R2 = R3 = R1 = 1;C1 = C2 = C3 = C4 = 1;if(C1 == 0){while(C1 == 0);KeysVal = 12;dispaly(SEG[KeysVal]);}else if(C2 == 0){while(C2 == 0);KeysVal = 13;dispaly(SEG[KeysVal]);}else if(C3 == 0){while(C3 == 0);KeysVal = 14;dispaly(SEG[KeysVal]);}else if(C4 == 0){while(C4 == 0);KeysVal = 15;dispaly(SEG[KeysVal]);}}void main()
{while(1){ScanKeysMulti();}
}

学习来源于:https://www.bilibili.com/video/BV1Bt41187hw?p=3

学习笔记——矩阵键盘的扫描原理与基本应用相关推荐

  1. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  2. Zemax学习笔记(12)- 扫描系统实例

    Zemax学习笔记(12)- 扫描系统实例 1. 概述 2.设计过程 2.1 先设计一个单透镜代替整个扫描镜头组. 2.2 添加反射镜 2.3 多重结构下的扫描角度设置 3. 总结 1. 概述 在成像 ...

  3. Apollo星火计划学习笔记——Apollo开放空间规划算法原理与实践

    文章目录 前言 1. 开放空间规划算法总体介绍 1.1 Task: OPEN_SPACE_ROI_DECIDER 1.2 Task: OPEN_SPACE_TRAJECTORY_PROVIDER 1. ...

  4. 模电学习笔记 (一) 晶体三极管工作原理

    大家好,我是一名从事硬件电路设计的小工程师一名.我决心从今天开始撰写自己的博客,一方面是为了对知识进行总结记录,加深理解与认识,另一方面希望大家可以多多批评指正,同时结识更多志同道合的朋友,一起学习进 ...

  5. Cadence学习笔记第9讲-元件原理图库的创建-20191116

    Cadence学习笔记第9讲-元件原理图库的创建-20191116 本人 也是刚刚学习,如有错误欢迎指正. 在开始设计原理图前,我们需要创建所需要的器件的原理图,这时就需要库,原理图库来存放器件的原理 ...

  6. 最大熵学习笔记(二)最大熵原理

    生活中我们经常听到人们说"不要把鸡蛋放到一个篮子里",这样可以降低风险.深究一下,这是为什么呢?其实,这里边包含了所谓的最大熵原理(The Maximum Entropy Prin ...

  7. 第五讲:独立键盘、矩阵键盘的检测原理及实现(郭天祥)

    说明:此文章仅是我学习过程中的一些记录,如有侵权,请联系我删除,文章中难免有遗漏错误之处,欢迎指出. 目录 一.键盘的分类 二.独立键盘的识别 三.一个读取独立按键状态的程序 四.矩阵键盘的识别 五. ...

  8. c++矩阵类_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...

    当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...

  9. 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试

    按照这篇文章日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用里的代码,对下列方法进行单步调试: 因为我们调用的是 info 方法,所以生成的日志,leve ...

  10. c++ 二维矩阵 转vector_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...

    当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...

最新文章

  1. ROM,RAM,DRAM,SDRAM,SRAM
  2. java 线程强制停止线程_java多线程之停止线程
  3. (二)ElasticSearch6.1.1 Python API
  4. 手把手教你用Flutter做炫酷动画
  5. edpluse怎么运行c语言,[JSP]小菜也来学Editplus+Tomcat配置jsp运行环境
  6. 【C语言】能不能更快?
  7. 成都五月花计算机网教,【强调】成都五月花计算机学校网址是什么
  8. Linux 内存管理之 SLUB分配器(1): Object-layout
  9. AllenNLP入门笔记(一)
  10. php上传504,nginx+php设置大文件请求上传(502及504问题处理)
  11. 在线微信公众号调查数据分析报告
  12. android webView 全屏播放网络视频
  13. 短信验证码是什么?在网站中起到什么作用?
  14. 我最喜欢的五款手机APP 简直就是生活的小帮手
  15. Linux7/CentOS7 磁盘结构与分区
  16. <script>标签通过src属性调用js文件
  17. iPhone4s刷机教程
  18. 医药数据治理数字化方案
  19. 小米平板一直android,小米平板下架,号称最好用的安卓平板也退出了市场
  20. 谷歌老闪退啊 和 pycharm版本问题 and 微信闪退

热门文章

  1. linux-巴斯勒相机 GigE通信配置步骤
  2. java 异或加密_Java异或技操作给任意的文件加密原理及使用详解
  3. ios yylabel 加载html,iOS关于YYLabel的富文本点击事件
  4. ASM-第二章寄存器
  5. JAVA编写一个加密及解密程序
  6. mac win7 计算机,几步教会你win7更改mac地址_win7电脑改mac地址方法
  7. 约束优化内罚函数c语言程序,约束优化惩罚函数法.pdf
  8. 思维导向树6级节点_树形图或思维导图类似的数据结构中如何删除特定节点?
  9. DllMain 用法
  10. 编程之道(英汉对照)[转载]