独立键盘接口设计(Keil+Proteus)

前言

软件的操作参考这篇博客。

LED数码管的静态显示与动态显示(Keil+Proteus)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/134101256?spm=1001.2014.3001.5501实验:用4个独立按键控制8个LED指示灯。

按下k1键,P3口8个LED正向(由上至下)流水点亮;

按下k2键,P3口8个LED反向(由下而上)流水点亮;

按下k3键,高、低4个LED交替点亮;

按下k4键,P3口8个LED闪烁点亮。

Keil

这个程序就很好理解了,通过检查P1口的引脚来判断是否有按键被按下(每次只允许一个键被按下),然后调用相对应的函数即可。

由于采用的是共阳极,所以端口为0的时候表示LED亮,所以LED流水灯、交替这种就是通过控制端口是1还是0来实现的。

#include<reg51.h>
sbit S1=P1^0;//将S1位定义为P1.0引脚
sbit S2=P1^1;//将S2位定义为P1.1引脚
sbit S3=P1^2;//将S3位定义为P1.2引脚
sbit S4=P1^3;//将S4位定义为P1.3引脚unsigned char keyval;//定义键值储存变量单元void key_scan(void);//扫描键盘
void forward(void);//正向流水点亮
void backward(void);//反向流水点亮
void alter(void);//高、低位交替点亮
void blink(void);//闪烁点亮
void led_delay(void);//LED显示延时
void delay10ms(void);//软件消除抖动,延时void main(void){keyval=0;//键值初始化为0while(1){key_scan();//键盘扫描switch(keyval){case 1:forward();break;//键值为1,调用正向流水点亮函数case 2:backward();break;//键值为2,调用反向流水点亮函数case 3:alter();break;//键值为3,调用高、低位交替点亮函数case 4:blink();break;//键值为4,调用闪烁点亮函数}}
}//键盘扫描
void key_scan(void){P1=0xFF;if((P1&0x0F)!=0x0F){delay10ms();if(S1==0)keyval=1;//按键K1被按下if(S2==0)keyval=2;//按键K1被按下if(S3==0)keyval=3;//按键K1被按下if(S4==0)keyval=4;//按键K1被按下}
}//正向流水点亮LED
void forward(void){P3=0xFE;//LED0亮1111 1110led_delay();P3=0xFD;//LED1亮1111 1101led_delay();P3=0xFB;//LED2亮1111 1011led_delay();P3=0xF7;//LED3亮1111 0111led_delay();P3=0xEF;//LED4亮1110 1111led_delay();P3=0xDF;//LED5亮1101 1111led_delay();P3=0xBF;//LED6亮1011 1111led_delay();P3=0x7F;//LED7亮0111 1111led_delay();
}//反向流水点亮LED
void backward(void){P3=0x7F;//LED7亮0111 1111led_delay();P3=0xBF;//LED6亮1011 1111led_delay();P3=0xDF;//LED5亮1101 1111led_delay();P3=0xEF;//LED4亮1110 1111led_delay();P3=0xF7;//LED3亮1111 0111led_delay();P3=0xFB;//LED2亮1111 1011led_delay();P3=0xFD;//LED1亮1111 1101led_delay();P3=0xFE;//LED0亮1111 1110led_delay();
}//交替点亮高4位与低4位LED
void alter(void){P3=0x0F;//高4位亮0000 1111led_delay();P3=0xF0;//低4位亮1111 0000led_delay();
}//闪烁点亮LED
void blink(void){P3=0xFF;//全灭1111 1111led_delay();P3=0x00;//全亮0000 0000led_delay();
}//LED显示延时
void led_delay(void){unsigned char i,j;for(i=0;i<220;i++){for(j=0;j<220;j++);}
}//软件消除抖动,延时
void delay10ms(void){unsigned char i,j;for(i=0;i<100;i++){for(j=0;j<100;j++);}
}

Proteus

这里需要用到的器件前面基本上都出现过了。

元件名称Proteus关键字
51单片机AT89C51
复位按钮BUTTON
电阻RES
LED灯LED
LED-BIBY
LED-BIGY
LED-BIRG
LED-BIRY
LED-BLUE
LED-GREEN
LED-RED
LED-YELLOW

 这种LED灯蓝色表示灯亮,红色表示灯灭,所以不是很明显。

可以换成这种LED灯(如果这里还是没有亮的话需要调整右边一列电阻的阻值,调至220

K1被按下

K2被按下

K3被按下

K4被按下

总结

继续努力。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql进阶-视图篇

介绍 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图只保存了查询的SQL逻辑&#xff0c;不保存查询结果。…

Si4010 一款带有MCU SoC RF发射机芯片 无线遥控器

Si4010是一款完全集成的SoC RF发射机&#xff0c;带有嵌入式CIP-51 8051 MCU&#xff0c;专为1GHz以下ISM频带设计。该芯片针对电池供电的应用进行了优化&#xff0c;工作电压为1.8至3.6 V&#xff0c;待机电流小于10 nA的超低电流消耗。高功率放大器可提供高达10 dBm的输出功率…

手术训练系统项目

★ 手术训练系统项目 项目描述&#xff1a;手术训练系统&#xff0c;它提供了多项功能&#xff0c;包括账户登录与创建、数据库与账户管理、课程管理、小组管理、成绩统计、证书发布、训练和系统设置。 职责描述: 1、训练功能开发&#xff08;任务概述、任务指导、评分规则、评…

【数据结构】手撕单链表

目录 前言 1 链表 1.1 链表的概念及结构 1.2 链表的分类 1.2.1 单向或者双向 1.2.2 带头或者不带头 1.2.3 循环或者非循环 1.2.4 无头单向非循环链表 1.2.5 带头双向循环链表 2 链表的实现 2.1 结构 2.2 结点的创建 2.3 尾插 2.4 头插 2.5 尾删 2.6 头删 2.7 …

数据结构与算法之美学习笔记:17 | 跳表:为什么Redis一定要用跳表来实现有序集合?

目录 前言如何理解“跳表”&#xff1f;用跳表查询到底有多快&#xff1f;跳表是不是很浪费内存&#xff1f;高效的动态插入和删除跳表索引动态更新解答开篇内容小结 前言 本节课程思维导图&#xff1a; 二分查找底层依赖的是数组随机访问的特性&#xff0c;所以只能用数组来实…

2.求100-999之间的水仙花数

#include<stdio.h>void fun(void){int i,a,b,c;for(i100;i<1000;i) {ai%10;//个 b(i/10)%10;//十 ci/100;//百 if(ia*a*ab*b*bc*c*c)printf("%d ",i);}}int main(){fun();return 0;}

STM32 GPIO 描述

一、GPIO功能描述 每个GPIO端口有两个32位配置寄存器(GPIOx_CRL&#xff0c;GPIOx_CRH) &#xff0c;两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) &#xff0c;一个32位置位/复位寄存器(GPIOx_BSRR)&#xff0c;一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR…

数据可视化:地图

1.基础地图的使用 如何添加颜色表示层级 代码实现 """基础地图的使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 9),("上海市…

实验记录之——git push

平时做开发的时候经常push代码不成功&#xff0c;如下图 经好友传授经验&#xff0c;有如下方法 Win cmd使用Clash&#xff08;端口是7890&#xff09;代理操作&#xff0c;在cmd中输入&#xff1a; set http_proxy127.0.0.1:7890 set https_proxy127.0.0.1:7890Linux export …

有关LED显示屏对比度的知识

LED显示屏的对比度是指显示屏的亮度范围&#xff0c;即显示屏能够显示的最亮和最暗的部分之间的差异。对比度是一个重要的显示参数&#xff0c;它影响图像和视频的质量&#xff0c;以及用户对显示内容的感知。你知道LED显示屏的亮度和对比度是如何调节的吗&#xff1f; 一般来说…

【渗透测试】垂直越权(高危)、水平越权(中危)

目录 一、简介1.1 水平越权&#xff08;中危&#xff09;1.2 垂直越权&#xff08;高危&#xff09;1.3 方便记忆方法 二、修复方案2.1 水平越权修复2.2 垂直越权修复 一、简介 1.1 水平越权&#xff08;中危&#xff09; 漏洞危害&#xff1a; 水平越权 是相同级别&#xff0…

智能井盖传感器实时批发价格

城市之中高楼大厦林立&#xff0c;越来越多的人群涌入一线城市或二线城市。同时即便是县城之中接连不断的高楼大厦拔地而起&#xff0c;住宅小区的面积在不断拓宽。随着这一系列情况的出现&#xff0c;首先要完善的是每一个地区的城市道路设施建设。无论小区还是在城市路面之中…

antv G6 开发踩坑记录

1、通过键盘 鼠标拖拽创建边 根据官方实例&#xff0c;在画布上创建边基本都是点击端点构建边&#xff0c;或者固定端点后拖拽创建边&#xff0c;但是倘若有个这样的需求&#xff1a;“键盘按住ctrl后&#xff0c;鼠标从一个端点拖拽出边到另一个端点来创建边” 改如何应对呢…

使用c++解压rar文件,基于UnRAR64,非命令行

最近项目需要解压缩rar文件&#xff0c;我们都知道rar是闭源收费软件&#xff0c;如果直接采用命令行可能会有限制&#xff0c;或者盗版问题&#xff0c;使用正版的winrar命令行解压rar文件是否有限制&#xff0c;这个我没来得及测试&#xff0c;但是从交互体验上来说&#xff…

面试—如何介绍项目中的多级缓存?

项目中使用的多级缓存也就是 分布式缓存 Redis 本地缓存 Caffeine&#xff0c;那么令 Caffeine 作为一级缓存&#xff0c;Redis 作为二级缓存&#xff0c;在项目中通过记录数据的访问次数&#xff0c;将热点数据放在 本地缓存&#xff0c;将非热点数据放在 Redis缓存 中&#…

11月1日 mybatis入门

java程序与数据库对接端: jdbc 步骤固定, 代码固定, 大量重复代码 SQL写在代码中, 修改sql,需要重新编译代码, 动态sql, 手动拼接 结果集与java对象转换, java程序与前端对接端: javaWeb 手动获取请求参数, 需要手动进行数据转换 一个请求对应一个Servlet,造成Servlet类暴增…

【MongoDB】索引 - 复合索引

一、准备工作 这里准备一些学生数据 db.students.insertMany([{ _id: 1, name: "张三", age: 20, class: { id: 1, name: "1班" }},{ _id: 2, name: "李四", age: 22, class: { id: 2, name: "2班" }},{ _id: 3, name: "王五…

2023年最热门的五大编程技术趋势

2023年最热门的五大编程技术趋势 摘要&#xff1a;本文将介绍2023年最热门的五大编程技术趋势&#xff0c;包括人工智能、区块链、WebAssembly、5G和边缘计算以及自动化。我们将详细讨论这些趋势的当前状态、未来展望以及如何利用这些技术来提高您的编程技能。 一、前言 随着…

linux+python3.6.8+uwsgi+postgresql+django部署web服务器

linuxpython3.6.8uwsgipostgresqldjango部署web服务器 1.查看系统信息2.配置postgresql数据库2-1.安装postgresql数据库2-2.设置密码2-3.修改postgresql数据库配置文件 3.Python虚拟环境激活虚拟环境 4.Django4-1.Python 安装Django4-2.创建Django项目4-3.配置Django 5.uwsgi5-…

解决docker tag打标签时报错:Error response from daemon: no such id

现象&#xff1a; 原因&#xff1a; docker tag时不仅仅要Repository仓库名&#xff0c;也需要原有的tag作为版本号 解决办法&#xff1a; docker tag 原有仓库名: 原有tag值 新的打标名称 问题解决&#xff01;