我的第一个单片机程序!!!但是有些问题需要请教一下在座的各位大佬们

2023-10-14 01:59

本文主要是介绍我的第一个单片机程序!!!但是有些问题需要请教一下在座的各位大佬们,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

昨天晚上做的单片机实验,我平时看到单片机代码倒是挺多,但是没正真动手去写代码,去设计一个电路(我本来是有一个51的单片机板子的,但是学校不开学,我也没法回去拿,只能在家一直看代码,我可真是太难了)
实验的题目就是做一个4*4 的矩阵键盘(0~F),然后用两位数码管显示,比如按下了“1”,数码管显示“01”;按下了“F”,数码管显示“15”,下面把代码和proteus仿真的电路图给各位大佬双手奉上来:

代码:

#include <reg51.h>
#include <intrins.h>
#define  uchar  unsigned char
#define Time 50	sbit L1 = P1^0;	
sbit L2 = P1^1; 
sbit L3 = P1^2; 
sbit L4 = P1^3;
sbit L5 = P1^4;
sbit L6 = P1^5;
sbit L7 = P1^6;
sbit L8 = P1^7;uchar dis[16] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};unsigned  int  time;
void delay(time)     //delay_function	
{unsigned  int j,i;for( j=0;j<80;j++)for(i=0;i<time;i++);
}void display(i,k)    //display_function
{P2 = 0x01; P0 = dis[i];delay(Time);P2 = 0x02; P0 = dis[k];delay(Time);
}void judge(i,a,b,c,d) 
{if(L5 == 0) while(1) display(i,a);if(L6 == 0) while(1) display(i,b);if(L7 == 0) while(1) display(i,c);if(L8 == 0) while(1) display(i,d);
}main()
{uchar temp,i; while(1){P1= 0xef;for(i=0;i<4;i++){if(L1 == 0)        //press first linejudge(0,0,1,2,3);	if(L2 == 0)        //press second linejudge(0,4,5,6,7);if(L3 == 0)        //press third line{if(L5 == 0) while(1) display(0,8);if(L6 == 0) while(1) display(0,9);	if(L7 == 0) while(1) display(1,0);if(L8 == 0) while(1) display(1,1);}if(L4 == 0)        //press forth linejudge(1,2,3,4,5);temp = P1;temp = temp|0x0f;temp = temp<<1;temp = temp|0X0f;P1 = temp;}}
}

先解释某些代码吧,judge函数,它需要五个形参,分别是i,a,b,c,d,“i”在这里代表十位数,所以i只可能又“0”和“1”两个值,a,b,c,d分别代表个位数。

举个例子吧,假设按下了“F”,那么进入"if(L4 == 0)“条件语句,进入judge函数,再进入"if(L8 == 0)”,然后再进入while循环执行display函数,此时,传进display函数的两个参数i,d分别是 1,5,通过P2口控制数码管的亮灭(此处我用的是数码管的动态显示,因为延时时间很短,利用视觉暂留使我们看到的是两个数码管一直显示),P1口就是送1和5 对应的十六进制编码了,最终我们看到的数码管显示一直是15。

还要多说一点的是,当第三行有按键按下时,是没法放进judge函数的,因为第三行的按键在数码管显示的是08,09,10,11,十位数是不一样的,起初打算向judge函数里面传入六个参数,但是后来发现这样无法实现,所以单独拿了出来。

下面是proteus仿真的电路图:
在这里插入图片描述
电路比较简单(上面的晶振电路可以不用画,我看很多同学都没画),点击“F”后显示15

上面呢是标题的前半部分,标题后半部分的问题来了:
我这个电路无法循环检测,也就是说我按下“F”键后,数码管一直显示15,按下其他的键没有用,我被这个问题困扰了一下午也没想出解决方法,希望做单片机大佬给我解答一下!提前谢谢您了,在这先给您拜个早年啦!

这篇关于我的第一个单片机程序!!!但是有些问题需要请教一下在座的各位大佬们的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/207359

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如