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

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仿真图
51单片机数码管显示历史键值_第1张图片

实验代码

#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);

	
	}
}



你可能感兴趣的:(51单片机,动态数码管,历史键值,单片机)