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仿真二
51单片机 MAX7221控制数码管动态显示+Proteus仿真
51单片机定时器累加计数(000-999)+4位数码管(循环显示)+Proteus仿真