数码管动态显示0~99999999
一、共阴极8位数码管原理
首先了解一些必要知识
1、多位数码管是扫描显示,也就是同一时刻只有一个数码管显示
2、视觉暂留效果:第一个数码管显示完,第二个数码管接着显示,接着后面数码管一次显示,当显示(扫描)足够快的时候,人眼是看不到闪烁的,就认为多个数码管是同时显示的
3、多位数码管只能同时显示多个一样的数字,要显示不同数字需要扫描显示
比如说要显示12345678,你看起来8个数码管是同时亮的,其实同一时刻只有一个数码管是亮的
我们把时间放慢,看看数码管都发生了什么变化:
1、第1毫秒
2、第二毫秒
3、第三毫秒
4、第四毫秒
5、第五毫秒
6、第六毫秒
7、第七毫秒
8、第八毫秒
当数码管的扫描频率大于50hz的时候人眼是基本分不清的,也就是你的扫描8个数码管的周期控制在20ms内就可以实现动态显示不闪烁。
二、了解原理后打开proteus仿真,画电路图
这里用了74hc138,不会用的可以百度一下芯片用法
三、编写代码
代码功能,显示从0自加到99999999
#include <reg51.h>
typedef unsigned long u32; //对数据类型进行声明定义
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P3^0; //74hc138的A B C引脚定义
sbit LSB=P3^1;
sbit LSC=P3^2;
#define SMG P0 //定义数码管段数据接口P0
u8 buff[8]; //显示缓冲数组
u8 a[]={
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//分别显示0 1 2 3 4 5 6 7 8 9
void delay_ms(u16 t)
{
u16 i,j;
for(i=0; i<t; i++)
for(j=0; j<120; j++);
}
void update(u32 val) //更新缓冲数组
{
//分离各位数据
buff[0]=val/10000000%10; //12345678/10000000%10=1;
buff[1]=val/1000000%10; //12345678/1000000%10=2;
buff[2]=val/100000%10; //12345678/100000%10=3;
buff[3]=val/10000%10; //12345678/10000%10=4;
buff[4]=val/1000%10; //12345678/1000%10=5;
buff[5]=val/100%10; //12345678/100%10=6;
buff[6]=val/10%10; //12345678/10%10=7;
buff[7]=val%10; //12345678%10=8;
}
void display(void) //显示函数
{
u8 n;
for(n=0; n<8; n++)
{
switch(n) //先位选
{
case 0:LSC=0;LSB=0;LSA=0;break;
case 1:LSC=0;LSB=0;LSA=1;break;
case 2:LSC=0;LSB=1;LSA=0;break;
case 3:LSC=0;LSB=1;LSA=1;break;
case 4:LSC=1;LSB=0;LSA=0;break;
case 5:LSC=1;LSB=0;LSA=1;break;
case 6:LSC=1;LSB=1;LSA=0;break;
case 7:LSC=1;LSB=1;LSA=1;break;
}
SMG=a[buff[n]]; //后发送段数据
delay_ms(1); //小延时,显示更稳定
}
}
void main(void)
{
u32 num=0; //要显示的数据
u16 t; //延时用
while(1)
{
update(num); //更新显示缓冲数组
for(t=0; t<50; t++) //用for循环来延时不然显示不正常
{
display(); //显示缓冲数组
}
num++; //显示数据自加
}
}
执行效果:一开始显示00000000,然后自动加一,一会变成00000035,直到溢出
今天的文章单片机数码管动态显示0和1_led数码管显示数字0-9[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87285.html