当前位置: 首页 > news >正文

51单片机:数码管和矩阵按键

目录

一:动态数码管模块

1:介绍

 2:共阴极和共阳极

A:共阴极

B:共阳极

C:转化表

 3:74HC138译码器

4:74HC138译码器控制动态数码管

5:数码管显示完整代码

二:矩阵按键模块

1:介绍

2:原理图

 3:矩阵按键代码


一:动态数码管模块

1:介绍

        LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件;

        我们的51单片机的1个数码管就相当于由8个发光二极管封装在一起, 所以我们只需要控制8个发光二极管封就可以实现数码管的显示,这款单片机是共阴极连接

        数码管扫描(输出扫描)     原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果,节省I/O口

 2:共阴极和共阳极

我们这款单片机是共阴极所以我们主要介绍共阳极连接

A:共阴极

1.LED共阴极是指LED灯中的二极管的阴极有一个共同的接点,并且该接点连接在GND端,即处于低电平状态。      我们只需要给它一个高电频(1)就可以点亮他

 从高位到低位读取

eg:让第一个数码管显示0

数码管段码表对应的0,1,2,3,4,5,6,7,8,9

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

B:共阳极

        LED共阳极是指LED灯中的二极管的阳极有一个共同的接点,并且该接点连接在VCC端,即处于高电平状态。  我们只需要给它一个低电频(0)就可以点亮他

 

    数码管段码表对应的0,1,2,3,4,5,6,7,8,9

unsigned char LED7Code[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8, 0x80, 0x90};

C:转化表

 3:74HC138译码器

        概述 D74HC138D 是一种三通道输入、八通道输出译码器,主要应用于消费类电子产品

        3个io口控制8位,因为单片机上面的资源有限

 

 

 通过A0~A2数据的输入来控制Y0~Y7数据的输出;实现 3个io口控制8位,

4:74HC138译码器控制动态数码管

 eg:点亮LED8

        EDL1对应的是Y7的输出端口,所以只需要控制A,B,C输出Y7即可

        从高位到低位读和写;   (只需要将二进制转化位10进制的7即可)

P2_4=1;P2_3=1;P2_2=1;//二进制111转化十机制为:7,输出Y7;当用户选择1时点亮LED8

5:数码管显示完整代码

#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//延时函数的声明
void Delay(unsigned int xms);
/*** @brief  数码管的选择和读取* @param  Location:选择那一个数码管; Number:选择显示那个数字(0~9)* @retval 无*/
void Nixie(unsigned char Location,Number)
{switch (Location)  {case 1:P2_4=1;P2_3=1;P2_2=1;break;//二进制111转化十机制为:7,当用户选择1时点亮LED8case 2:P2_4=1;P2_3=1;P2_2=0;break;//二进制110转化十机制为:6,当用户选择2时点亮LED7case 3:P2_4=1;P2_3=0;P2_2=1;break;//二进制101转化十机制为:5,当用户选择3时点亮LED6case 4:P2_4=1;P2_3=0;P2_2=0;break;//二进制100转化十机制为:4,当用户选择4时点亮LED5case 5:P2_4=0;P2_3=1;P2_2=1;break;//二进制11(高位补零)转化十机制为:3,当用户选择5时点亮LED4case 6:P2_4=0;P2_3=1;P2_2=0;break;//二进制10(高位补零)转化十机制为:2,当用户选择6时点亮LED3case 7:P2_4=0;P2_3=0;P2_2=1;break;//二进制1(高位补零)转化十机制为:1,当用户选择7时点亮LED2case 8:P2_4=0;P2_3=0;P2_2=0;break;//二进制0(高位补零)转化十机制为:0,当用户选择3时点亮LED1 }  P0=NixieTable[Number];	//段码输出Delay(1);				//显示一段时间P0=0x00;				//段码清0,消影  
}void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
void main()
{while(1){Nixie(1,1);		//在数码管的第1位置显示1Delay(20);Nixie(2,2);		//在数码管的第2位置显示2Delay(20);Nixie(3,3);		//在数码管的第3位置显示3Delay(20);}
}

二:矩阵按键模块

1:介绍

        矩阵键盘扫描(输入扫描)     原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果,节省I/O口

2:原理图

 按下为0;我们使用列扫描,

eg:按下1,5,9,13

1:使他P1端口全部为1

2:1,5,9,13为一列,他们的共同端口为P1^3,显示共同端口为P1^3为0;

3:依次使P1_7,  P1_6,  P1_5, P1_4为0,

 3:矩阵按键代码

#include <REGX52.H>//声明
void Delay(unsigned int xms)
/*** @brief  矩阵键盘读取按键键码* @param  无* @retval KeyNumber 按下按键的键码值如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0*/
unsigned char MatrixKey()
{unsigned char KeyNumber=0;P1=0xFF;P1_3=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}P1=0xFF;P1_2=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}P1=0xFF;P1_1=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}P1=0xFF;P1_0=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}return KeyNumber;
}
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}

http://www.lryc.cn/news/99199.html

相关文章:

  • Django + Xadmin 数据列表复选框显示为空,怎么修复这个问题?
  • 《向量数据库指南》——Milvus Cloud2.2.12 易用性,可视化,自动化大幅提升
  • Python web实战 | 用 Flask 框架快速构建 Web 应用【实战】
  • 十、数据结构——链式队列
  • Improving Cross-Modal Retrieval with Set of Diverse Embeddings
  • 物联网阀控水表计量准确度如何?
  • 【C语言数据结构】模拟·顺序表·总项目实现
  • 自然语言处理从入门到应用——LangChain:模型(Models)-[文本嵌入模型Ⅰ]
  • 使用Gradio构建生成式AI应用程序; Stability AI推出Stable Diffusion XL 1.0
  • Java 递归计算斐波那契数列指定位置上的数字
  • ai数字人透明屏的应用场景有哪些?
  • 一、1、Hadoop的安装与环境配置
  • 剑指YOLOv7改进最新MPDIoU损失函数(23年7月首发论文):论文实测YOLOv7模型涨点,超越现有多种G/D/C/EIoU,高效准确的边界框回归的损失
  • 前端JavaScript面试100问(上)
  • C语言第九课------------------数组----------------C中之将
  • MySQL的安装
  • 在Chrome(谷歌浏览器)中安装Vue.js devtools开发者工具及解决Vue.js not detected报错
  • 用Python实现概率矩阵分解(PMF)算法在MovieLens ml-100k数据集上构建精确的推荐系统:深入理解GroupLens数据的操作
  • WPF icon的设置
  • 使用frp中的xtcp映射穿透指定服务实现不依赖公网ip网速的内网穿透p2p
  • 2023-07-28 LeetCode每日一题(并行课程 III)
  • 8.11 PowerBI系列之DAX函数专题-TopN中实现N的动态
  • 后端性能测试的类型
  • 关闭Tomcat的日志输出
  • express 路由匹配和数据获取
  • 62 | Python 操作 PDF
  • [SQL挖掘机] - 左连接: left join
  • Android 之 使用 SoundPool 播放音效
  • 防火墙的ALG、NAT、双机热备知识点详解
  • 传染病模型