当前位置:主页 > 查看内容

51单片机数码管显示历史键值

发布时间:2021-07-30 00:00| 位朋友查看

简介:51单片机数码管显示历史键值 想说的话 单片机程序设计 实验目的 实验内容 实验原理 矩阵键盘 数码管动态显示 实验环境 实验代码 想说的话 这个单片机实验要求是我的同学把别人的设计要求发给我让我帮忙做一下但是做着做着发现自己设计的方案行不通到现在原因……

想说的话

这个单片机实验要求是我的同学把别人的设计要求发给我,让我帮忙做一下,但是做着做着发现自己设计方案行不通,到现在原因也不知道在哪,只能是又想了一种方案

方案是在按下键盘时,将按下的键值所对应的共阳值写入对应的数组中,在显示时在P0口(数码管段选口)写入刚存储完成的数组,该数组在未按下时所有数值均为 0xff (不显示)。
和最一开始的方案是相似的,但是我至今也没想明白最一开始的方案异常的原因在哪,也没有搜到类似的资源,于是就想着来CSDN随便水一篇。
Proteus仿真图和C代码文件可以参考我的另一篇资源,下载的话我应该设置的是0
51单片机数码管显示历史键值

单片机程序设计

实验目的

1、利用键盘作为输入信号控制系统的输出信息
2、熟悉键盘的构造并编写相应的扫描的程序

实验内容

利用Proteus搭建仿真电路图,并完成如下键盘程序:
1、四个数码管上分别显示最近连续四次按键的值。例如连续四次按下3456,则显示3456,再按下9,则显示4569
2、在1的基础上按下“F”键(第四行第四列),则所有数码管清屏(即所有数码管不显示),按下“E”键,显示“----”

实验原理

矩阵键盘

行列扫描:通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。

数码管动态显示

动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

实验环境

Keil开发环境,Proteus仿真环境
注意事项:
1、程序中需要4*4矩阵键盘以及4位数码管
2、数码管的编码(0~F)如下所示

smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

3、Proteus仿真图
在这里插入图片描述

实验代码

#include"reg52.h"

unsigned char smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned char cunchu[15]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};


int k=3,Keyvalve=20,a=3,num=0;


/*延时函数*/
void delay(unsigned int l)
{
	while(l--);
}

/*此只能记忆12个键值,如想记录更多键值可扩大cunchu数组*/
void Key_Scan()
{	
	P1=0xf0;
	if(P1!=0xf0)
	{
		delay(200);
		P1=0xf0;
		switch(P1)
		{
			case 0xe0:Keyvalve = 0;break;
			case 0xd0:Keyvalve = 1;break;
			case 0xb0:Keyvalve = 2;break;
			case 0x70:Keyvalve = 3;break;
		}
		P1=0x0f;
		switch(P1)
		{
			case 0x0e:Keyvalve = Keyvalve;break;
			case 0x0D:Keyvalve = Keyvalve + 4;break;
			case 0x0B:Keyvalve = Keyvalve + 8;break;
			case 0x07:Keyvalve = Keyvalve + 12;break;
		}
		if(Keyvalve!=14&&Keyvalve!=15)	
		{
			cunchu[a] = smgduan[Keyvalve];
			a=a+1;
			if(a>=5)
			{
				k=k+1;
			}
		}
		delay(30000);
	}

}


/*历史键值显示*/
void display1(int e)
{
	int j,u;
	u=e;
	for(j=0;j<4;j++)
	{
		switch(j)
		{
			case 0:P2=0x08;break;
			case 1:P2=0x04;break;
			case 2:P2=0x02;break;
			case 3:P2=0x01;break;
		}
		P0=cunchu[u];
		delay(100);
		P0=0xff;
		u=u-1;
		
	}
}

/*所有数码管不显示*/
void display2()
{
	int i;
	for(i=0;i<4;i++)
	{
		switch(i)
		{
			case 0:P2=0x08;break;
			case 1:P2=0x04;break;
			case 2:P2=0x02;break;
			case 3:P2=0x01;break;
		}
			
		P0=0xff;
				 
		delay(20);
		//P0=0xFF;
	}	
}

/*显示“----”*/
void display3()
{
	int i;
	for(i=1;i<5;i++)
	{
		switch(i)
		{
			case 1:P2=0x08;break;
			case 2:P2=0x04;break;
			case 3:P2=0x02;break;
			case 4:P2=0x01;break;
		}
			
		P0=0xBf;
				 
		delay(20);
		//P0=0xFF;
	}

}

void main()
{
	
	while(1)
	{			   
		
		Key_Scan();
		if(Keyvalve==14)
		{
			display2();
		}
		else if(Keyvalve==15)
		{
			display3();
		}
		else
		{
			display1(k);
		}
		delay(500);

	
	}
}



;原文链接:https://blog.csdn.net/thcsyzx/article/details/115797775
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐