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

单片机学习 专栏收录该内容
1 篇文章 0 订阅

昨天晚上做的单片机实验,我平时看到单片机代码倒是挺多,但是没正真动手去写代码,去设计一个电路(我本来是有一个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 line
					judge(0,0,1,2,3);	
				if(L2 == 0)        //press second line
					judge(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 line
					judge(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,按下其他的键没有用,我被这个问题困扰了一下午也没想出解决方法,希望做单片机大佬给我解答一下!提前谢谢您了,在这先给您拜个早年啦!

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值