51单片机矩阵键盘在动态数码管上的显示

您所在的位置:网站首页 c51单片机应用与c语言程序设计 51单片机矩阵键盘在动态数码管上的显示

51单片机矩阵键盘在动态数码管上的显示

2023-07-18 03:49| 来源: 网络整理| 查看: 265

    51单片机上的矩阵键盘一般是4*4大小的,用矩阵键盘动态控制数码管,需要程序同时调用动态数码管模块和矩阵键盘模块。

1.1 矩阵键盘原理

    独立键盘与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的 I/O 口资源。单片机系统中 I/O 口资源往往比较宝贵,当用到多个按键时为了减少 I/O 口引脚,引 入了矩阵键盘。

    无论是独立键盘还是矩阵键盘,单片机检测其是否被按下的依据都是一样的,也就是检测与该键对应的 I/O 口是否为低电平。独立键盘有一端固定为低电平,单片机写程序检测时比较方便。而矩阵键盘两端都与单片机 I/O 口相连, 因此在检测时需编程通过单片机 I/O 口送出低电平。检测方法有多种,最常用的是行列扫描和线翻转法。

    行列扫描法检测时,先送一列为低电平,其余几列全为高电平(此时我们确 定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电 平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列 的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平, 这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。 当然我们也可以将行线置低电平,扫描列是否有低电平。从而达到整个键盘的检 测。

    线翻转法,就是使所有行线为低电平时,检测所有列线是否有低电平,如果有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值, 由于有按键按下,行线的值也会有变化,记录行线的值。从而就可以检测到全部按键。

  矩阵按键模块如下图所示:

    从上图中可以看出,该电路是集成的,4*4 矩阵按键引出的 8 根控制管脚直接连接到 51 单片机的 P1 的I/O 口上。电路中的 P17 表示矩阵键盘第 1 行,P14 表示矩阵键盘第 1 列。 

1.2 矩阵键盘动态控制数码管(线翻转法)

 

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 #define GPIO_DIG P0 //定义数码管管脚P0为变量GPIO_DIG #define GPIO_KEY P1 //定义矩阵键盘管脚P1为变量GPIO_KEY char KeyValue; //用来存放读取到的键值 char code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管的段码显示,显示0~F的值 void delay(int i) //延时函数,i=1时,大约延时10us { while(i--); } void KeyDown(void) //检测矩阵键盘有按键按下并读取键值 { char a=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { delay(1000);//延时10ms进行消抖 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下 { //测试列 GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=1;break; case(0X0d): KeyValue=2;break; case(0X0e): KeyValue=3;break; } //测试行 GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue;break; case(0Xb0): KeyValue=KeyValue+4;break; case(0Xd0): KeyValue=KeyValue+8;break; case(0Xe0): KeyValue=KeyValue+12;break; } } } while((a


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3