51单片机day3——矩阵键盘控制数码管显示

发布者:Shuxiang最新更新时间:2025-09-30 来源: bilibili关键字:51单片机  矩阵键盘控制  数码管显示 手机看文章 扫描二维码
随时随地手机看文章

/***

*矩阵键盘控制数码管显示

*顺序:按键为4*4矩阵键盘,左上角为1号、横向排列

*数码管用单片机P0^0-P0^7引脚控制

*矩阵键盘接口:

*       1.单片机P1^0接口连接到第四列的右端

*       2.单片机P1^1接口连接到第三列的右端

*       3.单片机P1^2接口连接到第二列的右端

*       4.单片机P1^3接口连接到第一列的右端

*       4.单片机P1^4接口连接到第四行的左端

*       4.单片机P1^5接口连接到第三行的左端

*       4.单片机P1^6接口连接到第二行的左端

*       4.单片机P1^7接口连接到第一行的左端

*原理:

*   1.独立按键扫描原理是向其两端输入高低不同的电平,按键未按下时电平高低不动,按键按下时低电平会把高电平拉低,检测高电平引脚状态可得知按键是否按下

*   2.矩阵键盘是将按键n*n进行排列,每列的右端相连再连接到单片机的一个引脚上,每行的左端相连再连接到单片机的一个管脚上,使用时向按键的左右引脚发送不同的高低电平信息,检测高电平引脚电平是否被拉低(按键按下),若高电平引脚被拉低可以确定此行/列有按键被按下,然后向按键的左右引脚发送与原来相反的高低电平确定具体是哪个按键被按下

*思路:

*   1.定义行和列两个变量来确定被按下的具体是哪个按键

*   2.用两位数码管显示被按下的按键

***/


#include "reg52.h"


void delay(int a);     //延时函数

void ajpd(void);      //按键判断

void smgxs(void);  //数码管显示


sbit YMQA=P2^2;       //接到译码器A角

sbit YMQB=P2^3;       //接到译码器B角

sbit YMQC=P2^4;       //接到译码器C角


int smg[10]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};   //显示0-9的编码数组


int key=0;         //存放按键的值

void main(void)

 while(1)

 {

  ajpd();         //判断是否有按键,有按键的话把按键编号记录到变量key里

  smgxs();        //用数码管显示按键的编号,未按过键则显示key初始值(00)

 }

}


void ajpd(void)

{

 int hang=-1,lie=-1;    //存放按键的行和列

  P1 = 0X0F;       //向矩阵键盘的列发送高电平、行发送低电平,先确认被按下的列

  if(P1 != 0X0F)     //如果有按键按下(高电平被拉低)

  {

   delay(4000);     //消抖

   if(P1 != 0X0F)    //再次判断是否被按下

   {

    switch (P1)     //判断P1(矩阵键盘接口)的状态(哪列被按下(高电平被拉低))

    {

     case 0x0E : lie = 4; break;    //第四列被按下(P1^0接口电平被拉低)

     case 0x0D : lie = 3; break;    //第三列被按下(P1^1接口电平被拉低)

     case 0x0B : lie = 2; break;    //第二列被按下(P1^2接口电平被拉低)

     case 0x07 : lie = 1; break;    //第一列被按下(P1^3接口电平被拉低)

    }

    P1 = 0XF0;     //确认按下的列后给矩阵键盘的行发送高电平,列发送低电平,确认哪行被按下

    if(P1 != 0XF0)   //如果按键被按下

    {

     switch (P1)    //判断P1(矩阵键盘接口)的状态(哪行被按下(高电平被拉低))

     {

      case 0xE0 : hang = 4; break;  //第四行被按下(P1^4接口电平被拉低)

      case 0xD0 : hang = 3; break;  //第三行被按下(P1^5接口电平被拉低)

      case 0xB0 : hang = 2; break;  //第二行被按下(P1^6接口电平被拉低)

      case 0x70 : hang = 1; break;  //第一行被按下(P1^7接口电平被拉低)

     }

    }

   }

  }

   while((P1 != 0xF0) && (P1 != 0X0F)) ; //等待按键松手

  if(lie != -1 && hang != -1)       //如果列和行都有数据(判定是一次完整的按键)

  {

  key = lie + ((hang-1)*4);       //把按键的行和列转换为编号赋值给key(列+(行-1)*4)(4*4的矩阵键盘的第列个+上面行的行数*上面每行的个数)

  }

}


void smgxs(void)       //数码管后两位显示按键的数值

{

     /*显示最后一个个数码管(个位)*/

 YMQA = 0;          //给译码器的A引脚输送数据选中数码管的最后一个数码管

 YMQB = 0;          //给译码器的B引脚输送数据选中数码管的最后一个数码管

 YMQC = 0;          //给译码器的C引脚输送数据选中数码管的最后一个数码管

 P0 = smg[key%10];      //给P0口(控制数码管显示字符)输送数据显示key%10的数值(个位数)

 delay(5);          //延时以方便观察(延时后数码管亮度提高)

 P0=0X00;          //数码管消隐(多个数码管同时显示的时候不消隐会互相干扰)

     /*显示倒数第二个数码管(十位)*/

 YMQA = 1;          //给译码器的A引脚输送数据选中数码管的倒数第二个数码管

 YMQB = 0;          //给译码器的B引脚输送数据选中数码管的倒数第二个数码管

 YMQC = 0;          //给译码器的C引脚输送数据选中数码管的倒数第二个数码管

 P0 = smg[key/10];      //给P0口(控制数码管显示字符)输送数据显示key/10的数值(十位数)

 delay(5);          //延时以方便观察(延时后数码管亮度提高)

 P0=0X00;          //数码管消隐(多个数码管同时显示的时候不消隐会互相干扰

}


void delay(int a)  //延时函数

{

  int i;

  for(i=0;i<a;i++);

}


关键字:51单片机  矩阵键盘控制  数码管显示 引用地址:51单片机day3——矩阵键盘控制数码管显示

上一篇:C51单片机四位数码管动态显示2020
下一篇:一块51单片机能做出些什么东西?

推荐阅读最新更新时间:2026-03-19 10:42

51单片机矩阵键盘控制数码管显示数字
#include reg51.h //头文件 #define keys P1//宏定义矩阵键盘 #define smg P0//宏定义数码管 sbit SMGA=P2^2;//位定义 sbit SMGB=P2^3; sbit SMGC=P2^4; unsigned int table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管字形码 unsigned int k; void delay()//延时函数 { unsigned char a,b; for(a=0;a
[单片机]
51单片机】七段数码管显示实验+详细讲解
前言 继上次仿真实验—— 【51单片机】矩阵键盘线反转法实验仿真 之后,尽管也对点阵LED进行了学习,但是,点阵LED的显示效果不佳(仿真时的色彩、明亮程度等),加上大多数时候我们在计算器上看到的是七段数码管,所以在学习了学校课程之后,我也进行了尝试。这次主要是 记录七段数码管的使用方法 ,在此之后,我考虑 把键盘扫描(线反转法)、七段数码管、80C51结合起来 ,把整个计算器的功能完善,也算是完成一个小项目。 因为我认为光学理论只是很容易忘记,且容易磨灭兴趣,所以在学习过程中以做一个计算器为目标,循序渐进地学习,缺什么知识就补充什么知识,就像前几次所作的一样: 【51单片机】矩阵键盘线反转法实验仿真 【51单片机】点阵LED的
[单片机]
【<font color='red'>51单片机</font>】七段<font color='red'>数码管</font><font color='red'>显示</font>实验+详细讲解
51单片机 静态数码管显示
1.新建工程,选择芯片型号,这里注意——为了防止出现在插入头文件reg时出现某些引脚不定义的情况 可尝试切换为AT89C52型号的芯片,插入头文件即为reg52,当然,如果使用的是51型号的编译后成功的,也是可以的。 2.实现八位数码管上第三位显示6 首先看原理图,由于是第三位易知对应的是LED6 之后再看 结合两张图可以看到要使得第三位显示为6 LED6对应Y5,Y5对应的二进制为101,要让低电平Y5通电 对应由高位到低位得 P2_4=1; P2_3=0; P2_2=1; 之后再考虑排阻P0可得:由P07到P00,abcdefg dp——0111 1101 则有 P0=0
[单片机]
<font color='red'>51单片机</font> 静态<font color='red'>数码管</font><font color='red'>显示</font>
51单片机——共阳数码管的动态显示
数码管的原理图及基本原理 原理图 怎么工作的我就不介绍了 基本原理 动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果。在轮流显示过程中,每位数码管点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。 例题(附代码) 代码如下 #include reg52.h sbit HC138_A = P2^5; sbit HC138_B = P2^6; sbit HC138_C = P2^7; //相当于时
[单片机]
<font color='red'>51单片机</font>——共阳<font color='red'>数码管</font>的动态<font color='red'>显示</font>
51单片机——数码管静态显示
1、由原理图找到对应控制端口 这次是想要在数码管上显示出数值。同样的,先在开发板原理图中找到数码管对应的控制端口 发现要让数码管起作用的话,LEDS0要为低电平,则在74LS138译码器中,输入A2A1A0的值分别为000。而P0口可以控制数码管的显示。 2、程序部分 需要用到的对应控制端口找完,开始写程序。先写个简单一点数码管静态显示。 程序如下: #include reg52.h sbit ADDR0=P1^0; sbit ADDR1=P1^1; sbit ADDR2=P1^2; sbit ADDR3=P1^3; sbit ENLED=P1^4; void delay(
[单片机]
<font color='red'>51单片机</font>——<font color='red'>数码管</font>静态<font color='red'>显示</font>
51单片机——数码管动态显示
1、静态与动态不同的显示 在静态显示时所有数码管显示的是一样的,动态显示时可以单独决定每个数码管显示什么; 静态显示时,数码管是常亮的。动态显示时每时刻只有一个数码管在亮; 2、按原理图找对应控制端口 数码管的显示由P0口控制 可以用P1口选择哪个数码管亮 3、程序部分 程序如下: #include reg52.h sbit ADDR0=P1^0; sbit ADDR1=P1^1; sbit ADDR2=P1^2; sbit ADDR3=P1^3; sbit ENLED=P1^4; void delay(unsigned char x); unsigned char code
[单片机]
<font color='red'>51单片机</font>——<font color='red'>数码管</font>动态<font color='red'>显示</font>
51单片机动态数码管显示(新字符串思路)
新思路 对于数码管的动态显示,已经有了很多的基础教学,教学中多用数组的形式储存数据来进行动态显示,便于理解。对于纯数据来说,数组是一个很好的选择,但是如果有的特殊符号或者字母,数组似乎就没这么方便,总是需要记忆特殊字符所对应的数组下标。如果一定要用数组显示,也可以通过宏定义或枚举来减轻记忆的负担,但是总觉得没这么流畅。倘若能把所有需要显示的内容写成一个字符串,再对字符串进行处理,那么应该能够使程序更加可读,并可以简化操作。 字符串的处理 若想对字符串进行处理,那么第一步就是将字符串中的内容转化成数码管的段码。这里展示共阳极数码管的转化函数代码: #ifndef U8 #define U8 typedef unsigned
[单片机]
51单片机的静态和动态数码管显示
一、数码管显示原理: 数码管其实就是有8个LED构成,分为a、b、c、d、e、f、g、dp,而数码管又分为共阴极(左边,高电平点亮)和共阳极(右边,低电平点亮),点亮对应的LED即可显示对应的数字,共阴极编码表如下: 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d 、0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c,0x39 , 0x5e , 0x79 , 0x71 , 0x00 分别对应0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,而0x00则不显示。 注意:比如显示0,则要abcdef都为1,即是0011 1111,转为16进制就是
[单片机]
<font color='red'>51单片机</font>的静态和动态<font color='red'>数码管</font>的<font color='red'>显示</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved