(8)趣味单片机新玩法-多个数码管扫描显示

发布者:Yuexiang666最新更新时间:2025-03-25 来源: jianshu关键字:数码管  扫描显示 手机看文章 扫描二维码
随时随地手机看文章

我们先来看第一个效果,数码管以秒计数显示

动态效果图



老套路,我们接下来进行分解,我们首先第一步就是让每个数码管都可控,不知道怎么使用74HC595的可以参考之前写的文章

代码

/* Main.ino file generated by New Project wizard

 *

 * Created:   周六 3月 20 2021

 * Processor: Arduino Uno

 * Compiler:  Arduino AVR (Proteus)

 */// Peripheral Configuration Code (do not edit)//---CONFIG_BEGIN---#pragma GCC push_options#pragma GCC optimize ('Os')#include // Required by cpu#include #pragma GCC pop_options// Peripheral ConstructorsCPU &cpu = Cpu;void peripheral_setup () {}void peripheral_loop() {}//---CONFIG_END---int STCP_Pin = 6;int SHCP_Pin = 4;int DS_Pin = 5; 


 char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void setup () {peripheral_setup();// TODO: put your setup code here, to run once:

    pinMode(STCP_Pin,OUTPUT);

    pinMode(SHCP_Pin,OUTPUT);

    pinMode(DS_Pin,OUTPUT);}void loop() {peripheral_loop();// TODO: put your main code here, to run repeatedly:


    digitalWrite(STCP_Pin,LOW); 

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xDF);

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[0]);

    digitalWrite(STCP_Pin,HIGH); 

    delay(500);



    digitalWrite(STCP_Pin,LOW); 

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xEF);

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[1]);

    digitalWrite(STCP_Pin,HIGH); 

    delay(500);


    digitalWrite(STCP_Pin,LOW); 

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xF7);

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[2]);

    digitalWrite(STCP_Pin,HIGH); 

    delay(500);


    digitalWrite(STCP_Pin,LOW); 

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFB);

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[3]);

    digitalWrite(STCP_Pin,HIGH); 

    delay(500);


    digitalWrite(STCP_Pin,LOW); 

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFD);

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[4]);

    digitalWrite(STCP_Pin,HIGH); 

    delay(500);


    digitalWrite(STCP_Pin,LOW); 

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFE);

    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[5]);

    digitalWrite(STCP_Pin,HIGH); 

    delay(500);}


我们接下来把速度提一提,延时改成50ms


感觉还是有点慢,我们再提点速度,改成10ms



但是,感觉显示有点乱,我们尝试在每个数码管显示过后给它关闭,在电视机邻域有个专业的名词叫消隐



    digitalWrite(STCP_Pin,LOW); 
    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xDF);
    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[0]);
    digitalWrite(STCP_Pin,HIGH); 
    delay(10);
    // 消隐
    digitalWrite(STCP_Pin,LOW); 
    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFF);
    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0x00);
    digitalWrite(STCP_Pin,HIGH); 
    delay(1);

我们再来看下效果,是不是没有乱码了,之前因为没有关闭,由于人眼的余晖效应,会造成乱码

然后我们稍微再提点速度≥50Hz的刷新率,6个数码管,每个耗时3ms,这样整个下来的总时间是18ms,基本上就不会看到闪烁。


    digitalWrite(STCP_Pin,LOW); 
    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xDF);
    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[0]);
    digitalWrite(STCP_Pin,HIGH); 
    delay(2);
    // 消隐
    digitalWrite(STCP_Pin,LOW); 
    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFF);
    shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0x00);
    digitalWrite(STCP_Pin,HIGH); 
    delay(1);

18ms刷新的效果,基本看不到闪烁的变化

文章开头效果总代码:




/* Main.ino file generated by New Project wizard

 *

 * Created:   周六 3月 20 2021

 * Processor: Arduino Uno

 * Compiler:  Arduino AVR (Proteus)

 */// Peripheral Configuration Code (do not edit)//---CONFIG_BEGIN---#pragma GCC push_options#pragma GCC optimize ('Os')#include // Required by cpu#include #pragma GCC pop_options// Peripheral ConstructorsCPU &cpu = Cpu;void peripheral_setup () {}void peripheral_loop() {}//---CONFIG_END---int STCP_Pin = 6;int SHCP_Pin = 4;int DS_Pin = 5; 


 char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void setup () {peripheral_setup();// TODO: put your setup code here, to run once:

    pinMode(STCP_Pin,OUTPUT);

    pinMode(SHCP_Pin,OUTPUT);

    pinMode(DS_Pin,OUTPUT);}int count = 0;int sec = 0;void loop() {peripheral_loop();


    count++;

    if(count>50)

    {

        count=0;

        sec++;

        if(sec>10)sec=0;

    }

    // TODO: put your main code here, to run repeatedly:


        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xDF);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[sec]);

        digitalWrite(STCP_Pin,HIGH); 

        delay(2);

        // 消隐

        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFF);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0x00);

        digitalWrite(STCP_Pin,HIGH); 

        delay(1);



        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xEF);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[sec]);

        digitalWrite(STCP_Pin,HIGH); 

        delay(2);

        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFF);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0x00);

        digitalWrite(STCP_Pin,HIGH); 

        delay(1);


        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xF7);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[sec]);

        digitalWrite(STCP_Pin,HIGH); 

        delay(2);

        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFF);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0x00);

        digitalWrite(STCP_Pin,HIGH); 

        delay(1);


        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFB);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[sec]);

        digitalWrite(STCP_Pin,HIGH); 

        delay(2);

        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFF);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0x00);

        digitalWrite(STCP_Pin,HIGH); 

        delay(1);


        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFD);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[sec]);

        digitalWrite(STCP_Pin,HIGH); 

        delay(2);

        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFF);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0x00);

        digitalWrite(STCP_Pin,HIGH); 

        delay(1);


        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFE);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, table[sec]);

        digitalWrite(STCP_Pin,HIGH); 

        delay(2);

        digitalWrite(STCP_Pin,LOW); 

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0xFF);

        shiftOut(DS_Pin,SHCP_Pin,MSBFIRST, 0x00);

        digitalWrite(STCP_Pin,HIGH); 

        delay(1);}

总结

复杂的原理来自多年实验的总结,同样也来自生活实践。


关键字:数码管  扫描显示 引用地址:(8)趣味单片机新玩法-多个数码管扫描显示

上一篇:(9)趣味单片机新玩法-单片机虚拟仿真软件Proteus入门1
下一篇:(7)趣味单片机新玩法-认识不一样的数码管

推荐阅读最新更新时间:2026-03-26 12:07

(7)趣味单片机新玩法-认识不一样的数码管
我们先来看下实际效果 连接示意图 动态工作效果,实现的是1~9的一个数码管计数 然后我们来一步一步分解下 原理图,从左到右边,依次时a,b,c,d,e,f,g,dp连接 然后我们来看下效果 数码管本身是由一个一个的LED灯拼装而成的,原则上它可以拼接成我们任何想要的图案,比如说电池电量,空调面板,电磁炉面板发光图案等等 智能家居显示屏 电动车仪表面板 总结: 剖开实物的本质,我们往往能看到很多东西都是由一些简单的、基础的东西组成
[单片机]
51单片机-定时器&数码管扫描显示
1.定时器中断实现间隔切换 在第六章第4讲的测试代码中提到过数码管微闪烁问题,这是由于三八译码器的IO端口切换的间隔时间不均匀导致,这部分的问题宋老师已经在《手把手教你学51单片机》文档6.4.2节有详细解释,并在6.5.2节里解决了这个问题。数码管扫描函数我们使用定时器0强制实现间隔1ms切换三八译码器的IO输出,这样保证了每个数码管被点亮的时间都是均匀的。我们在主函数里不停地执行数码管显示函数。这里是测试代码,用定时器1实现add间隔50ms自增1,数码管显示add的值。 #include reg52.h #include function.h //详见第六章第8讲 #include timer.h u32 a
[单片机]
51<font color='red'>单片机</font>-定时器&<font color='red'>数码管</font><font color='red'>扫描</font><font color='red'>显示</font>
PIC单片机开发板:数码管动态扫描程序,显示静态效果
//------------------------------------------------------------------------------------------------------------------------- /*这是自已写的:数码管动态扫描,显示静态效果 心得,显示看起来像乱码,实际上是位置不对(要选送段选,再打开位选)的缘故。 改为delay(300);则流水速度加快 */ #include pic.h #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31);// void delay(uchar x)
[单片机]
PIC<font color='red'>单片机</font>开发板:<font color='red'>数码管</font>动态<font color='red'>扫描</font>程序,<font color='red'>显示</font>静态效果
数码管动态扫描显示方式
数码管依次显示1-6,并保持造成视觉停留状态,也叫动态扫描显示 1#include reg52.h 2#define uint unsigned int 3#define uchar unsigned char 4sbit dula=P2^6; 5sbit wela=P2^7; 6uchar timer,numwe,numdu; //timer定时器计数 temp数字临时存放 7//数字字码表 0-F 8uchar code table ={ 90x3f,0x06,0x5b,0x4f, 100x66,0x6d,0x7d,0x07, 110x7f,0x6f,0x77,0x7c, 120x39,0x5e,0x79,0
[单片机]
扫描法读出4×4矩阵键盘,在数码管显示按键值
//电路说明如下。 //单片机:使用51系列兼容的即可; //4 4矩阵键盘:接在P1口; //两位数码显示器: P0口输出七段码,P2口输出位选码。 //============================================================== //C语言程序如下。 /************************************************************* * 文件名: KEY_LED.c * 功能 : 对4 4矩阵键盘进行输出,在数码管后两位显示按键值。 ***************************************************
[单片机]
用<font color='red'>扫描</font>法读出4×4矩阵键盘,在<font color='red'>数码管</font><font color='red'>显示</font>按键值
(12)趣味单片机新玩法-“趁热打铁”基于Proteus搭建几个电路
1、LED电路并用 电压探测器 测量LED的导通电压 说明:我们看到这三个模型LED灯的电压都是相等的,而实际生活中的LED灯不同颜色导通电压有一定的差异 2、虚拟仪器函数发生器和示波器使用 3、半波&全波整流 交流半波整流下的两个波形,黄色的是交流电,蓝色的是半波整流后的波形 全波整流:黄色的是交流电,蓝色的是全波整流后的波形 全波整流加大容量滤波电容:绿色是220AC,黄色是经过变压器后的12AC,红色和蓝色则是整流后的正反两个波形
[单片机]
英飞凌MEMS扫描仪为眼镜和汽车抬头显示带来增强现实应用
全新英飞凌MEMS扫描仪为眼镜和汽车抬头显示系统带来增强现实应用 【2021年8月13日,德国慕尼黑讯】如果你日常佩戴的眼镜成为增强现实应用的下一个媒介会怎样?如果每辆汽车都能在整个挡风玻璃上显示有价值的数据,从而引导你安全地穿梭在车流中会怎样?英飞凌科技股份公司推出的全新MEMS*扫描仪解决方案,由MEMS镜片和MEMS驱动器组成,可助力实现全新的产品设计。由于尺寸小,功耗低,它是使增强现实(AR)解决方案能够更广泛地应用于消费市场(如可穿戴设备)和汽车抬头显示系统的基础。 英飞凌汽车级MEMS产品线主管Charles Chan指出:“增强现实解决方案是借助有价值的数字数据来增强现实场景,以帮助人们在日常生活中更便捷、更
[物联网]
24课:动态扫描显示接口电路及程序
在单片机系统中动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。其接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以我们就能自行决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的办法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。在 http://www.51hei.com 还有很多关于单片机显示接口的文章,大家可以参考一下 在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved