proteus-单片机-数码管显示

Posted 无乎648

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了proteus-单片机-数码管显示相关的知识,希望对你有一定的参考价值。

proteus单片机数码管显示

要求:
单片机AT89C51外接6个共阳LED数码管,P3.0和P3.1引脚分别外接一独立按键。开机时数码管显示123456,在按下P3.0按键时,数值减一,在按下P3.1按键时,数值加一。

Proteus仿真电路如下:

在这里插入图片描述

流程图如下:

在这里插入图片描述

顺序图:

在这里插入图片描述

代码分析:

首先初始化按键P3.0和P3.1两个按键,并且定义好共阳数码管0到9的字段码,,最初定义要显示的数值shu=123456,定义好延时Delay函数和动态显示dis函数。
动态显示dis函数显示过程:
先通过取余操作将shu的最低位取出,再传送当前数值数码管显示内容的七段码值,再传送位选信号使最后一位数码管显示,其他数码管全部关闭,然后延迟一段时间,随后对shu的值进行除10操作将最低位去掉。接下来,依次循环六次。
按键操作时候,先判断是否被按下,由于单片机扫描速度非常快,如果判断被按下就进行操作,那么可以会导致明明只按下一次但单片机会操作多次,于是用一个while循环来判断按键松开时才继续后面操作,这样每按一次键时只有松手的瞬间才会执行操作,增加了程序的灵敏度。

#include<reg51.h>
sbit key1=P3^0;
sbit key2=P3^1;
unsigned char code discode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void Delay(unsigned int x)
{
	unsigned char j;
	for(;x>0;--x)
		for(j=110;j>0;j--);
}
void dis(unsigned long temp)
{
	signed char i;
	for(i=5;i>=0;--i)
	{
		P2=(0x01<<i);
		P1=discode[temp%10];//每次显示最低位
		Delay(1);
		temp/=10;//去掉当前最低位
		P1=0xff;
	}
}
void main()
{
	unsigned long shu=123456;
	while(1)
	{
		dis(shu);//显示数值
		if(key1==0)
		{
			while(key1==0)//按下之后松手表示按键操作
			{
				dis(shu);
			}
			shu--;
		}
		if(key2==0)
		{
			while(key2==0)
			{
				dis(shu);
			}
			shu++;
		}
	}
}

以上是关于proteus-单片机-数码管显示的主要内容,如果未能解决你的问题,请参考以下文章

51单片机AD转换pcf8591+数码管显示+Proteus仿真二

proteus-单片机-数码管显示

51单片机 MAX7221控制数码管动态显示+Proteus仿真

51单片机定时器累加计数(000-999)+4位数码管(循环显示)+Proteus仿真

51单片机+DS18B20+数码管显示+超温提示+Proteus仿真

51单片机 MAX7221控制数码管动态显示+Proteus仿真