草庐IT

单片机实验四 矩阵键盘实验

石去皿 2024-06-14 原文

实验四 矩阵键盘实验

一、实验目的

1.熟悉实验软件和硬件,进行正确的接线;
2.按下按键,1602显示其键值;

二、实验软硬件

1.Keil uVision4
2.PZISP自动下载软件
3.HC6800S开发板

三、实验原理

按键:

矩阵键盘
4X4 的矩阵键盘,一共是16 个按键。我们照习惯称横为“行”,“竖”为列。那么5、6、7、8 我们称之为“行线”,则1、2、3、4 称为“列线”。要正确记住各个行列线各自对应的IO。每一个按键的两端,都分别接在某一个列线和行线上,即:“行线和列线是通过某个按键的按下和抬起实现联通和断开的”,和“导线两端上的信号是经过“与”的关系再体现到导线上的。”这两句话便构成了矩阵键盘扫描的全部。

液晶屏:
液晶显示器(Liquid Crystal Display, LCD)的主要原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。1602的意思是每行显示16个字符,一共可以显示两行 。

LCD硬件原理图

用1602LED显示按键结果,利用了:
LCD1602写入8位命令子函数:void LcdWriteCom(uchar com)
LCD1602写入8位数据子函数:void LcdWriteData(uchar dat)
LCD1602初始化子程序:void LcdInit();
一般初始化(复位)过程:
延时15mS→写指令38H(不检测忙信号)→延时5mS→写指令38H(不检测忙信号)→延时5mS→写指令38H(不检测忙信号)(以后每次写指令、读/写数据操作均需要检测忙信号)→写指令38H:显示模式设置→写指令08H:显示关闭→写指令01H:显示清屏→写指令06H:显示光标移动设置→写指令0CH:显示开及光标设置。

四、软件流程图

矩阵键盘程序流程图

五、实验代码

LCD使用模块化的程序,调用LCD.C中的LcdInit( )、LcdWriteData( )、LcdWriteCom( )等函数。这里的LCD.C是直接调用的,没有改动,下只展示main.c中的内容。

1.#include<reg51.h>   
2.#include"lcd.h"  
3.#define GPIO_KEY P1  
4.unsigned char One[17]="The key value is:";  
5.unsigned char KeyValue;  
6.void Delay10ms(unsigned int c)     
7.{  
8.    unsigned char a, b;  
9.    for (;c>0;c--)  
10.    {  
11.        for (b=38;b>0;b--)  
12.        {  
13.            for (a=130;a>0;a--);  
14.        }            
15.    }         
16.}  
17.void KeyScan(void)  
18.{  
19.    char a = 0;  
20.    GPIO_KEY=0x0f;  
21.    if(GPIO_KEY!=0x0f)//读取按键是否按下  
22.    {  
23.        Delay10ms(1);//延时10ms进行消抖  
24.        if(GPIO_KEY!=0x0f)//再次检测键盘是否按下  
25.        {  
26.            //列  
27.            GPIO_KEY=0X0F;  
28.            switch(GPIO_KEY)  
29.            {  
30.                case(0X07): KeyValue=0;break;  
31.                case(0X0b): KeyValue=4;break;  
32.                case(0X0d): KeyValue=8;break;  
33.                case(0X0e): KeyValue=12;break;  
34.            }  
35.            //行  
36.            GPIO_KEY=0XF0;  
37.            switch(GPIO_KEY)  
38.            {  
39.                case(0X70): KeyValue=KeyValue+3;break;  
40.                case(0Xb0): KeyValue=KeyValue+2;break;  
41.                case(0Xd0): KeyValue=KeyValue+1;break;  
42.                case(0Xe0): KeyValue=KeyValue;break;  
43.            }  
44.            while((a<50) && (GPIO_KEY!=0xf0))      
45.            {  
46.                Delay10ms(1);  
47.                a++;  
48.            }  
49.        }  
50.    }  
51.}  
52.void main(void)  
53.{  
54.    unsigned char i;  
55.    LcdInit();  
56.    for(i=0; i<17; i++)  
57.    {         
58.        if(i == 14)  
59.        {  
60.            LcdWriteCom(0x80 + 0x40);  
61.        }  
62.        LcdWriteData(One[i]);             
63.    }  
64.    while(1)  
65.    {  
66.        KeyScan();  
67.        LcdWriteCom(0x80 + 0x44);  
68.        if(KeyValue < 10)  
69.        {  
70.            LcdWriteData('0' + KeyValue);  
71.        }  
72.        else  
73.        {  
74.            LcdWriteData('7' + KeyValue);     
75.        }     
76.    }                 
77.} 

六、实验步骤

1.连接试验相关模块

硬件接线图
2.编写1602显示键值程序
扫描键值的函数,要能防抖,做到行列扫描无逻辑错误,返回一个状态数据,根据返回数据对lcd1602进行显示。
3.下载1602显示键值程序

程序下载界面
4.调试按键显示功能
检查LCD屏是否可以正常显示,不能的话需要调节电位器。检查排线是否插好,检查J21是否接在左边,JP165是否断开,然后按按键看是否可以正常显示。

七、实验思考

矩阵键盘对于独立按键来说,相对负责了一点。矩阵键盘可以用8个IO口得到16个输入。而独立按键只能用8个IO口得到8个输入。能力提高了一倍。
无论什么按键都是需要进行消除抖动的,因为电平不可能一直稳定不变,会有短暂的剧烈的变化惨杂其中。这时就可能出行误判,所以消除抖动是必要的。有一些重要的工作的执行,比如说医生开刀手术、武器发射,还需要反复确认,以免误判。
但是对于多个按键同时按下,键盘的扫描就有可能出行纰漏,对付这样的情形,键盘就显得无力,这也是它的一个缺点。

有关单片机实验四 矩阵键盘实验的更多相关文章

  1. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  2. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  3. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  4. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  5. 网络实验之RIPV2协议(一) - 2

    一、RIPV2协议简介  RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对

  6. 欧拉角表示的姿态矩阵(313和312转序) - 2

    一、习惯约定图片来自PSINS(高精度捷联惯导算法)PSINS工具箱入门与详解.pptx二、基本旋转矩阵绕x轴逆时钟旋转α\alphaα角度Rx(α)=[ 1000cos⁡αsin⁡α0−sin⁡αcos⁡α]R_x(\alpha)=\begin{bmatrix}\1&0&0\\0&\cos\alpha&\sin\alpha\\0&-\sin\alpha&\cos\alpha\end{bmatrix}Rx​(α)=​ 100​0cosα−sinα​0sinαcosα​​绕y轴逆时钟旋转α\alphaα角度Ry(α)=[ cos⁡α0−sin⁡α010sin⁡α0cos⁡α]R_y(\alpha

  7. 欧拉角、旋转矩阵及四元数 - 2

    欧拉角、旋转矩阵及四元数1.简介2.欧拉角2.1欧拉角定义2.2右手系和左手系2.3转换流程3.旋转矩阵4.四元数4.1四元数与欧拉角和旋转矩阵之间等效变换4.2测试Matlab代码5.总结1.简介常用姿态参数表达方式包括方向余弦矩阵、欧拉轴/角参数、欧拉角、四元数以及罗德里格参数等。高分辨率光学遥感卫星主要采用欧拉角与四元数对姿态参数进行描述。这里着重讲解欧拉角、旋转矩阵和四元数。2.欧拉角2.1欧拉角定义欧拉角是表征刚体旋转的一种方法之一,由莱昂哈德·欧拉引入的三个角度,用于描述刚体相对于固定坐标系的方向。在摄影测量、空间科学或其它技术领域,一般用一组(三个)欧拉角描述两个空间坐标之间的旋

  8. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  9. ruby - 如何修改矩阵(Ruby std-lib Matrix 类)? - 2

    我理解RubystdlibMatrix是不可修改的,也就是说,例如。m=Matrix.zero(3,4)不会写m[0,1]=7但我非常想做...我可以用笨拙的编程来做,比如defmodify_value_in_a_matrix(matrix,row,col,newval)ary=(0...m.row_size).map{|i|m.rowi}.map(&:to_a)ary[row][col]=newvalMatrix[*ary]end...或者作弊,比如Matrix.send:[]=,0,1,7但我想知道,这一定是人们一直遇到的问题。有没有一些标准的、习惯的方法可以做到这一点,而不必使用

  10. 第1部分 实验拓扑、终端服务器 - 2

    目录1.1访问Cisco路由器的方法1.1.1通过Console口访问路由器1.1.2通过Telnet访问路由器1.1.3终端访问服务器1.2终端访问服务器配置命令汇总1.1访问Cisco路由器的方法    路由器没有键盘和鼠标,要初始化路由器需要把计算机的串口和路由器的Console口进行连接。访问Cisco路由器的方法还有Telnet、WebBrowser和网络管理软件(如CiscoWorks)等,本节讨论前2种。1.1.1通过Console口访问路由器    计算机的串口和路由器的Console口是通过反转线(Rollover)进行连接的,反转线的一端接在路由器的Console口上,另一

随机推荐