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

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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

Java程序运行时出现乱码问题的排查与解决方法

《Java程序运行时出现乱码问题的排查与解决方法》本文主要介绍了Java程序运行时出现乱码问题的排查与解决方法,包括检查Java源文件编码、检查编译时的编码设置、检查运行时的编码设置、检查命令提示符的... 目录一、检查 Java 源文件编码二、检查编译时的编码设置三、检查运行时的编码设置四、检查命令提示符