LED和数码管及按键

目录

LED

LED灯亮的原理图

LED灯光闪烁

电路设计

keil文件

LED流水灯的实现

keil文件

数码管

显示的基本原理

LED数码管的显示方式

静态显示方式

动态显示方式

具体案例

数码管静态显示

电路图

keil文件

数码管动态显示

电路图

keil文件

74LS138译码器

译码表

译码器案例

电路图

keil文件

单片机之按键

键盘的结构

按键消抖

软件消抖

硬件消抖

键盘的分类

独立式键盘

行列式键盘

键盘的识别

独立按键案例

电路图

keil文件

行列式键盘案例

电路图

对应按键判断

keil文件

LED

前言:中文名为发光二极管,用途为:照明、广告灯、指引灯、屏幕等。

注意:以上分别为LED灯的元器件符号,元器件实物和区分元器件正负极的方法。

LED灯亮的原理图

注意:

  • 上面的接法为共阳极接法,左边的接口分别连到单片机的引脚上,若单片机给该引脚低电平,那么就可以形成回路,进而导致LED灯亮。
  • 单片机控制引脚的方式为寄存器,寄存器通常每8位为一组;既可以8位一起处理,也可以按位方式使用(CPU通过控制寄存器来控制我们的硬件电路,硬件电路来执行我们想要完成的功能)
  • 寄存器对应的脚位顺序:P1=01011101——对应脚位顺序:P1.7,P1.6,P1.5,P1.4,P1.3,P1.2,P1.1,P1.0

LED灯光闪烁

电路设计

keil文件

#include "reg51.h"
#共阳极接法
#P2的0号脚位
sbit LED0=P2^0;
#大概nms的延时
void delay(unsigned int n){
	unsigned int i=0,j=0;
	for(i=0;i<n;i++){
		for(j=0;j<120;j++);
	}
}
void main()
{
    #我们要让51单片机一直运行
	while(1){
		#共阳极接法,那么单片机接口处给低电平,灯方可亮
		LED0=0;
		delay(5);
		LED0=1;
		delay(5);
	}
}

LED流水灯的实现

电路设计:和上面LED灯泡闪烁的电路一样

keil文件
#include "reg51.h"
#共阳极接法
sbit LED0=P2^0;
#大概nms的延时
void delay(unsigned int n){
	unsigned int i=0,j=0;
	for(i=0;i<n;i++){
		for(j=0;j<120;j++);
	}
}
#流水灯的实现
void led(){
	int i=0;
	for(i=0;i<8;i++){
		P2=~(0x01<<i);//0000 0001
		delay(100);
	}
}
void main()
{
	while(1){
	led();
	}
}

数码管

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

注意:8个LED构成了数码管,数码管的连接方式有共阴极和共阳极连接。

显示的基本原理

LED数码管的显示方式

静态显示方式

特点

  • 公共端直接接地或接电源
  • 每个数码管的段选线与一组IO接口线相连
  • 每个数码管一直在显示

动态显示方式

特点

  • 所有的数码管的段选线与一组IO接口线并联在一起
  • 每个数码管的公共端由一根IO线控制
  • 显示为逐个显示(利用人眼的视觉暂留原理,数码管切换的速度够快就好像多个数码管一起显示)

注意:段码线决定晶体管显示的是什么,位码线决定是哪个晶体管要显示;若想要四个数码管均显示不同的数字那么就需要以很小的时间内不断地切换四个数码管的显示(人眼的视觉暂留)

具体案例

数码管静态显示

需求:共阴极的方式实现0——9的不断循环。

电路图

keil文件
#include "reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void delay(unsigned int n)
{
	unsigned int i=0,j=0;
	for(i=0;i<n;i++){
		for(j=0;j<120;j++);
	}
}
void seg()
{
	int i=0;
	for(i=0;i<10;i++)
	{
		P2=s[i];
		delay(500);
	}
}
void main()
{
	while(1)
	{
		seg();
	}
}

数码管动态显示

需求:在数码管上显示hello这个字符串

电路图

注意:英文字母为段码线,数字为位码线;

keil文件
#include "reg51.h"
unsigned char str[]={0x76,0x79,0x38,0x38,0x3F};
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10};
void delay(unsigned int n){
	unsigned int i=0,j=0;
	for(i=0;i<n;i++){
		for(j=0;j<120;j++);
	}
}
void seg(){
	int i=0;
	for(i=0;i<5;i++){
		P3=~wei[i];
		P2=str[i];
		delay(5);
	}
}
void main()
{
	while(1)
	{
		seg();
	}
}

74LS138译码器

前言:该译码器可以仅通过3个针脚来决定右面对应针脚的信号(其中一个为0剩下的全是1),进而对数码管的位选断进行选择。

理解:左边的针脚为数字输入端,右边的8个端口为数字输出端;上下两端分别为电源和接地;左下脚3个针脚为使能端(需要把G1接上高电平、G2A和G2B接上低电平)

译码表

  • 000——Y0
  • 001——Y1
  • 010——Y2
  • 011——Y3
  • 100——Y4
  • 101——Y5
  • 110——Y6
  • 111——Y7

注意:译码表输入端三个字母的排序为CBA 

译码器案例

需求:在特定位置显示特定数字。

电路图

keil文件
#include "reg51.h"
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
#1——9对应的段码
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void show(unsigned char location,unsigned char number){
	switch(location)
	{
		case 1:P3_0=0;P3_1=0;P3_2=0;break;
		case 2:P3_0=1;P3_1=0;P3_2=0;break;
		case 3:P3_0=0;P3_1=1;P3_2=0;break;
		case 4:P3_0=1;P3_1=1;P3_2=0;break;
		case 5:P3_0=0;P3_1=0;P3_2=1;break;
		case 6:P3_0=1;P3_1=0;P3_2=1;break;
		case 7:P3_0=0;P3_1=1;P3_2=1;break;
		case 8:P3_0=1;P3_1=1;P3_2=1;break;
	}
	P2=s[number];
}
void main()
{
	while(1){
		#展示第三列的数字为8
		show(3,8);
	}
}

单片机之按键

键盘的结构

按键消抖

前言:对于机械开关,当机械触点断开,闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随着一连串抖动

软件消抖

注意:这个抖动会有个抖动时间,这个时间大概在10ms到20ms之间;我们可以依据这个原理错开这个时间来实现软件消抖。 

硬件消抖

理解:本质上还是利用了延时进行消抖。 

键盘的分类

独立式键盘

特点:

  • 每个独力健占用一根并口线,键位多时占用的并口线多
  • 用于键位较少的情况
  • 处理简单,直接判并口线

行列式键盘

特点:

  • 键位分布在行列交叉点上
  • 占用并口较少,键位越多越明显
键盘的识别

两步:第一步首先检测键盘上是否有键按下;第二部识别是哪一个键按下

  • 检测键盘上是否有键按下的处理方法——全扫描
  • 识别键盘中的哪一个键按下的方法——逐行逐列扫描

独立按键案例

需求:通过独立式按键控制数码管上的显示(每按下一次按键,数码管中显示的值加一)

电路图

keil文件
#include "reg51.h"
sbit key0=P1^0;
unsigned int num=0,flag=0;
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void key(){
	#第一次按下
	if(key0==0&flag==0){
		flag=1;
	}
	#已经按下了,但是按键抬起
	if(flag==1&key0==1){
		num++;
		flag=0;
		if(num==10){
		num=0;
		}
	}
}
void seg(){
	P2=s[num];
}
void main()
{
	while(1){
		key();
		seg();
	}
}

行列式键盘案例

需求:按第一个键盘,按键亮1;按第二个键盘,按键亮2;

电路图

对应按键判断

原理:按键按下时,高电平会被低电平拉至低电平。

编码H3H2H1H0L3L2L1L0
初值11110000

判断被按下按键的行数:检测第一个按键被按下,L0将H0拉至低电平:1110 0000

编码H3H2H1H0L3L2L1L0
初值00001111

判断被按下案件的列数:检测第一个按键被按下,L0被H0拉至低电平:0000 1110

总结:

  • 由此观之:行数:0xe0;列数:0x0e。由此观之第一个按键的行列标识为——行数+列数=0xe0+0x0e=0xee。
  • 单片机IO口是一种弱上拉,强下拉的工作模式(输出的1驱动能力是有限的,而输出0驱动能力是比较强的)
keil文件
#include "reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char num=99;
void delay(unsigned int n){
	unsigned int i=0,j=0;
	for(i=0;i<n;i++){
		for(j=0;j<120;j++);
	}
}
void key_scan()
{
	unsigned char temp=0,temp0=0,temp1=0;
	P1=0xf0; //为P1置初值,判断被按下按键的行数
	//检测按键是否被按下
	if(P1!=0xf0){
		delay(20); //软件消抖
		temp0=P1; //取出P1的值
		P1=0x0f; //为P1置初值,判断被按下按键的列数
		if(P1!=0x0f){
		temp1=P1;
		}
	}
	//取得被按下按键的标识
	temp=temp0+temp1;
	//被按下对应的按键执行对应的操作
	if(temp==0xee){
		num=0;
	}
	if(temp==0xed){
		num=1;
	}
}
void display(){
	P2=s[num];
}
void main()
{
	while(1){
	key_scan();
	display();
	}
}	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/489574.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java程序设计】【C00367】基于(JavaWeb)Springboot的粮仓管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

Pandoc下载和安装笔记

目录 一、下载 二、安装 1、安装软件 2、测试是否安装成功 Pandoc 的作者是 John MacFarlane&#xff0c;John MacFarlane是美国加州大学伯克利分校的哲学系的一位教授。编写Pandoc 用来生成讲义、课件和网站等。程序开源免费&#xff0c;目前以 GPL 协议托管在 Github 网站…

国内用户掌握ChatGPT,你已超越万人!

在数字时代&#xff0c;掌握前沿技术往往意味着拥有更多的机遇和可能。ChatGPT&#xff0c;作为当前最热门的人工智能技术之一&#xff0c;已经证明了其在各个领域的广泛应用价值。但在中国&#xff0c;能熟练使用ChatGPT的人究竟领先了多少人&#xff1f;让我们深入探讨。>…

hbuilderx打包苹果证书获取步骤

简介&#xff1a; 目前app开发&#xff0c;很多企业都用H5框架来开发&#xff0c;而uniapp又是这些h5框架里面最成熟的&#xff0c;因此hbuilderx就成为了开发者的首选。然而,打包APP是需要证书的&#xff0c;那么这个证书又是如何获得呢&#xff1f; 生成苹果证书相对复杂一些…

一本通差分约束入门题

最关键的就是找好所有的要满足的不等式条件&#xff0c;注意隐含的条件还有一点就是注意没有源点 建立源点 #2436. 「SCOI2011」糖果 #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; #define int long long const in…

随身wifi排行榜前三名大对比,格行vs华为vs中兴随身wifi谁是你心中的第一名?

第一名&#xff1a;格行随身wifi 品牌实力&#xff1a;随身wifi国内领跑品牌&#xff0c;深耕物联网15年&#xff0c;专注研发随身wifi&#xff0c;国内市场占有率较高&#xff0c;综合实力和口碑领先行业其他品牌。 产品优势&#xff1a;小巧便捷&#xff0c;彩屏显示&#…

SGE 如何影响 SEO?

虽然谷歌的 “Search Generative Experience”&#xff08;SGE&#xff09;并不保证一定会推出&#xff08;谷歌以其废弃项目的坟场而闻名&#xff09;&#xff0c;但 SEO 人员不能忽视它&#xff0c;因为它预计会对有机搜索产生负面影响&#xff1a; 可见性流量转化率收入 S…

Vue js封装接口

天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1.安装axios npm install axios -g 2.在src下新建一个Api文件夹,再创建一个js文件 import axios from axios let configuration {url:"http://localhost:9090" } /*** 请求项目数据的请求体*/ async function h…

记录在项目中引用本地的npm包

1、先把需要的包下载下来&#xff0c;以Photo Sphere Viewer 为引用的npm包、项目以shpereRepo为例子 git clone https://github.com/mistic100/Photo-Sphere-Viewer2、拉下代码后修改之后执行 ./build.sh build.sh #!/usr/bin/env bashyarn run build targetDir"../sh…

桌面便签软件哪个好?哪种好用便签实用?

在繁忙的工作和生活中&#xff0c;能够在桌面上直接记录事项&#xff0c;无疑会为我们带来极大的便利。这时&#xff0c;一款好用的桌面便签软件就显得尤为重要。它能够轻松助我们一臂之力&#xff0c;让我们的工作和生活更加有条不紊。 在众多便签软件中&#xff0c;敬业签便…

k8s入门到实战(四)—— k8s核心概念以及基本操作命令详细介绍

k8s 核心概念及操作命令 namespace&#xff08;命名空间&#xff0c;简称 ns&#xff09; k8s 资源创建的两种方式&#xff1a;使用命令行创建、使用 yaml 文件创建 什么是 ns 在 k8s 中&#xff0c;ns 是一种用于对集群资源进行逻辑分组和隔离的机制。它允许将 k8s 集群划…

海量数据处理项目-账号微服务和流量包数据库表+索引规范(下)

海量数据处理项目-账号微服务和流量包数据库表索引规范&#xff08;下&#xff09; 第2集 账号微服务和流量包数据库表索引规范讲解《下》 简介&#xff1a;账号微服务和流量包数据库表索引规范讲解 账号和流量包的关系&#xff1a;一对多traffic流量包表思考点 海量数据下每…

迭代器模式(统一对集合的访问方式)

目录 前言 UML plantuml 类图 实战代码 Iterator ArrayList Client 自定义迭代器 TreeNode TreeUtils Client 前言 在实际开发过程中&#xff0c;常用各种集合来存储业务数据并处理&#xff0c;比如使用 List&#xff0c;Map&#xff0c;Set 等等集合来存储业务数…

一键采集主流电商平台商品详情数据以及接入演示示例

一键抓取电商平台数据通常涉及到网络爬虫技术&#xff0c;该技术可以自动化地从网页上提取信息。不过要注意&#xff0c;任何形式的数据采集都应遵守相关网站的使用条款和隐私政策&#xff0c;以及当地的法律法规。 以下是一个概念性的步骤说明&#xff0c;展示如何通过API采集…

数据结构-树-006

1二叉树 1.1目标二叉树 前序遍历&#xff1a;ABDHIEJCFKG 中序遍历&#xff1a;HDIBEJAFKCG 后序遍历&#xff1a;HIDJEBKFGCA 层序遍历&#xff1a;ABCDEFGHIJK运行结果&#xff1a; 运行结果符合目标二叉树的深度优先&#xff08;前序遍历&#xff0c;中序遍历&#xff0c;…

Bert基础(八)--Bert实战之理解Bert微调

到目前为止&#xff0c;我们已经介绍了如何使用预训练的BERT模型。现在&#xff0c;我们将学习如何针对下游任务微调预训练的BERT模型。需要注意的是&#xff0c;微调并非需要我们从头开始训练BERT模型&#xff0c;而是使用预训练的BERT模型&#xff0c;并根据任务需要更新模型…

基于单片机的太阳能充电系统设计

摘要:本文所设计的太阳能充电系统主要由以下几个模块组成:STC89C52 主控模块、TP4056 充电电路、电压AD 采集模块、LCD1602 液晶显示模块和太阳能充电电池等组成。此太阳能充电器制作简单,性价比高,性能稳定。 关键词:LCD1602;太阳能充电系统;ADC0832 太阳能充电系统的充…

【C++】基础:STL容器库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍STL容器库。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#x1f95…

vue动态渲染本地路径图片不显示的解决方案,v-fro 渲染本地图片路径不显示

1、第一种解决方法 如果直接使用本地路径渲染是渲染不出来的&#xff0c;因为这种情况下渲染时会发送网络请求加你的本地地址所以渲染不出来。 这样怎么能找到路径&#xff1f;解决方案如下 // 渲染正常渲染即可 <div v-for"(item, index) in imgPath" :key&quo…

【WEEK4】 【DAY4】AJAX第一部分【中文版】

2024.3.21 Thursday 目录 8.AJAX8.1.简介8.2.伪造ajax8.2.1.新建module&#xff1a;springmvc-06-ajax8.2.2.添加web支持&#xff0c;导入pom依赖8.2.2.1.修改web.xml8.2.2.2.新建jsp文件夹 8.2.3.新建applicationContext.xml8.2.4.新建AjaxController.java8.2.5.配置Tomcat8.…