数码管动态显示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       //定义数码管段数据接口P0u8 buff[8];       //显示缓冲数组
u8 a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//分别显示0 1 2 3 4 5 6 7 8 9void 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,直到溢出

51单片机教程:数码管动态显示(0~99999999)74hc138驱动相关推荐

  1. 51单片机:数码管动态显示

    要求 51单片机,用三个7段共阴极数码管动态显示0~99,每隔0.5s刷新一次数字.用keil与Proteus联合仿真. 硬件设计 以AT89C51单片机为核心,包括74HC573锁存器,三个7段共阴 ...

  2. 汇编语言 使用按键控制51单片机的数码管显示0~F

    废话不多说,直接上代码: ORG 0000H LJMP MAIN MAIN: MOV P0,#0FFH :初始化P0.P1 MOV P1,#0FFH KEYDOWN: :延时,消除按键抖动 MOV P ...

  3. 51单片机基础——数码管数组动态显示0—F

    /*四个数码管动态显示0--F用数组移位 */ #include<reg52.h> #define uchar unsigned char #define uint unsigned in ...

  4. 51单片机 16X192点阵程序动态显示汉字 PROTEUS 和51单片机教程(附仿真文件+源代码)

    51单片机 16X192点阵程序动态显示任意汉字 程序参考源代码如下: #include<AT89X52.H> sbit ST=P3^5; sbit E1=P3^4; sbit MR=P3 ...

  5. STC 51单片机 多位数码管动态显示方法

    51单片机多位数码管动态显示方法 1.数码管显示原理 2.多位数码管动态显示 3.示例程序 3.结语 1.数码管显示原理 相比学习单片机的同学一定对显示器,屏幕如OLED,LCD并不陌生,而在这些显示 ...

  6. 51单片机教程:51单片机驱动四个8*8点阵,拼凑16*16点阵显示标准汉字。

    看此篇博文之前建议先看博主的上一篇博文: 51单片机教程:8*8 点阵显示字符.数字.简单汉字 取走点赞哦~ 教你如何用4个8乘8点阵拼成一个16乘16点阵 资料链接:点阵16乘16.rar 一.点阵 ...

  7. 51单片机八位数码管1到F动态滚动显示仿真及程序

    51单片机八位数码管1到F动态滚动显示仿真及程序 动态滚动显示仿真及程序 #include<reg51.h> #define uchar unsigned char #define uin ...

  8. 51单片机教程:8*8 点阵显示字符、数字、简单汉字

    点阵显示实验 一.什么是点阵? 我们用之前的方法一个IO口只能控制一个led,如果需要用更少的IO口控制更多的led怎么办呢,于是就有了点阵. 8X8点阵共由64个发光二极管组成,且每个发光二极管是放 ...

  9. 51单片机实现数码管显示小数

    51单片机实现数码管显示小数 要求 1 Proteus 面向编程的模型搭建 2 代码实现 2.1. 实现数码管刷新 2.2 对小数进行分解的函数 3 测试用例 4 仿真结果 要求 要求1:根据整数部分 ...

最新文章

  1. centos6.8 yum mysql7_Centos6.8通过yum安装mysql5.7
  2. 一名 40 岁“老”程序员的反思~
  3. MyBatisPlus注入公共Sql问题
  4. jQuery——插入元素节点的方法
  5. 【链表】Add Two Numbers
  6. Mac插件分享——AE插件、PS插件、FCPX插件【持续更新中】
  7. Centos 7 更改系统语言为中文
  8. 〖Demo〗-- 计算器
  9. [渝粤教育] 西南科技大学 西方现代派文学 在线考试复习资料
  10. 学以致用------韩顺平老师说(如果不能学以致用,那就是白费。等于没学。贪多嚼不烂。)---无内容...
  11. Go语言的线程模型-Goroutine机制
  12. PyTorch基础(六)-- optim模块
  13. Python 一维数据
  14. Gif动图如何自制?一招教你快速完成gif制作
  15. Win10找不到飞行模式开关怎么办?
  16. Android 64位变32位
  17. 开机内存占用过高解决方案
  18. 导出富文本格式word
  19. Reference SoftReference WeakReference PhantomReference Cleaner 的研究与实践
  20. SQL多对多关系通过关联中间表查询

热门文章

  1. 滑动窗口 Sliding Window
  2. 干货 | 什么是FOC?一文带你看BLDC电机驱动芯片及解决方案
  3. 无需软件编程的FOC无传感器BLDC电机控制器AMT49406
  4. 毛毛虫组【Beta】Scrum Meeting 2
  5. jzoj3234. 阴阳
  6. 焊接LQFP48 和 LQFP64 封装的芯片的记录
  7. 西门子1500通讯与西门子1200通讯(1)
  8. 国外LEAD赚钱,做个网站真的很简单
  9. 发邮件 对方服务器未响应 重新投递中,邮件无法收到
  10. 关于C++编程vs2017 error: c2228的一种可能,或称基类位于派生类之后会出现的问题