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

实验四 矩阵键盘实验

一、实验目的

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

二、实验软硬件

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

三、实验原理

按键:
单片机实验四 矩阵键盘实验_第1张图片

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

液晶屏:
液晶显示器(Liquid Crystal Display, LCD)的主要原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。1602的意思是每行显示16个字符,一共可以显示两行 。
单片机实验四 矩阵键盘实验_第2张图片

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:显示开及光标设置。

四、软件流程图

单片机实验四 矩阵键盘实验_第3张图片

矩阵键盘程序流程图

五、实验代码

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.连接试验相关模块
单片机实验四 矩阵键盘实验_第4张图片

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

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

七、实验思考

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

你可能感兴趣的:(单片机,单片机,矩阵,嵌入式硬件)