51单片机教程:数码管动态显示(0~99999999)74hc138驱动
数码管动态显示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驱动相关推荐
- 51单片机:数码管动态显示
要求 51单片机,用三个7段共阴极数码管动态显示0~99,每隔0.5s刷新一次数字.用keil与Proteus联合仿真. 硬件设计 以AT89C51单片机为核心,包括74HC573锁存器,三个7段共阴 ...
- 汇编语言 使用按键控制51单片机的数码管显示0~F
废话不多说,直接上代码: ORG 0000H LJMP MAIN MAIN: MOV P0,#0FFH :初始化P0.P1 MOV P1,#0FFH KEYDOWN: :延时,消除按键抖动 MOV P ...
- 51单片机基础——数码管数组动态显示0—F
/*四个数码管动态显示0--F用数组移位 */ #include<reg52.h> #define uchar unsigned char #define uint unsigned in ...
- 51单片机 16X192点阵程序动态显示汉字 PROTEUS 和51单片机教程(附仿真文件+源代码)
51单片机 16X192点阵程序动态显示任意汉字 程序参考源代码如下: #include<AT89X52.H> sbit ST=P3^5; sbit E1=P3^4; sbit MR=P3 ...
- STC 51单片机 多位数码管动态显示方法
51单片机多位数码管动态显示方法 1.数码管显示原理 2.多位数码管动态显示 3.示例程序 3.结语 1.数码管显示原理 相比学习单片机的同学一定对显示器,屏幕如OLED,LCD并不陌生,而在这些显示 ...
- 51单片机教程:51单片机驱动四个8*8点阵,拼凑16*16点阵显示标准汉字。
看此篇博文之前建议先看博主的上一篇博文: 51单片机教程:8*8 点阵显示字符.数字.简单汉字 取走点赞哦~ 教你如何用4个8乘8点阵拼成一个16乘16点阵 资料链接:点阵16乘16.rar 一.点阵 ...
- 51单片机八位数码管1到F动态滚动显示仿真及程序
51单片机八位数码管1到F动态滚动显示仿真及程序 动态滚动显示仿真及程序 #include<reg51.h> #define uchar unsigned char #define uin ...
- 51单片机教程:8*8 点阵显示字符、数字、简单汉字
点阵显示实验 一.什么是点阵? 我们用之前的方法一个IO口只能控制一个led,如果需要用更少的IO口控制更多的led怎么办呢,于是就有了点阵. 8X8点阵共由64个发光二极管组成,且每个发光二极管是放 ...
- 51单片机实现数码管显示小数
51单片机实现数码管显示小数 要求 1 Proteus 面向编程的模型搭建 2 代码实现 2.1. 实现数码管刷新 2.2 对小数进行分解的函数 3 测试用例 4 仿真结果 要求 要求1:根据整数部分 ...
最新文章
- centos6.8 yum mysql7_Centos6.8通过yum安装mysql5.7
- 一名 40 岁“老”程序员的反思~
- MyBatisPlus注入公共Sql问题
- jQuery——插入元素节点的方法
- 【链表】Add Two Numbers
- Mac插件分享——AE插件、PS插件、FCPX插件【持续更新中】
- Centos 7 更改系统语言为中文
- 〖Demo〗-- 计算器
- [渝粤教育] 西南科技大学 西方现代派文学 在线考试复习资料
- 学以致用------韩顺平老师说(如果不能学以致用,那就是白费。等于没学。贪多嚼不烂。)---无内容...
- Go语言的线程模型-Goroutine机制
- PyTorch基础(六)-- optim模块
- Python 一维数据
- Gif动图如何自制?一招教你快速完成gif制作
- Win10找不到飞行模式开关怎么办?
- Android 64位变32位
- 开机内存占用过高解决方案
- 导出富文本格式word
- Reference SoftReference WeakReference PhantomReference Cleaner 的研究与实践
- SQL多对多关系通过关联中间表查询
热门文章
- 滑动窗口 Sliding Window
- 干货 | 什么是FOC?一文带你看BLDC电机驱动芯片及解决方案
- 无需软件编程的FOC无传感器BLDC电机控制器AMT49406
- 毛毛虫组【Beta】Scrum Meeting 2
- jzoj3234. 阴阳
- 焊接LQFP48 和 LQFP64 封装的芯片的记录
- 西门子1500通讯与西门子1200通讯(1)
- 国外LEAD赚钱,做个网站真的很简单
- 发邮件 对方服务器未响应 重新投递中,邮件无法收到
- 关于C++编程vs2017 error: c2228的一种可能,或称基类位于派生类之后会出现的问题