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

动态效果图


老套路,我们接下来进行分解,我们首先第一步就是让每个数码管都可控,不知道怎么使用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 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 我们再来看下效果,是不是没有乱码了,之前因为没有关闭,由于人眼的余晖效应,会造成乱码 然后我们稍微再提点速度≥50Hz的刷新率,6个数码管,每个耗时3ms,这样整个下来的总时间是18ms,基本上就不会看到闪烁。 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 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);} 总结 复杂的原理来自多年实验的总结,同样也来自生活实践。

但是,感觉显示有点乱,我们尝试在每个数码管显示过后给它关闭,在电视机邻域有个专业的名词叫消隐 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);

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);


上一篇:(9)趣味单片机新玩法-单片机虚拟仿真软件Proteus入门1
下一篇:(7)趣味单片机新玩法-认识不一样的数码管
推荐阅读最新更新时间:2026-03-26 12:07
- TCR6DA1828、200mA、1.8V 和 2.8V 输出电压双路输出 CMOS 低压降稳压器的典型应用
- RD-490,将 FSQ510 电源开关用于辅助电源应用的参考设计
- LT1307CMS8 单节 CCFL 电源典型应用电路
- 用于照明的 250W 电子镇流器灯驱动器
- LTC1291单片机12位数据采集系统典型应用
- DI-122 - 13W (17.2W峰值)非隔离电源,用于白色家电,带<150 mW空载功率消耗
- LTM8064EY 的典型应用电路在负载共享时从多个输入轨跟踪输入电流
- AL9901 通用高压 LED 驱动器的典型应用
- NCS36000GEVB:被动红外探测器控制器 (PIR) 评估板
- LT1021CIN8-5 2 极低通滤波电压基准的典型应用

Xilinx 早期FPGA/CPLD芯片开发工具基于foundation3的使用学习教程
LED点阵论文
功率集成电路技术理论与设计 (文进才,陈科明,洪慧,韩雁编著)
C51单片机实现双按键控制八位数码管滚动十六进制数
MOSFET和GaN FET应用手册
BTP-89PGCT-XX-H/W






京公网安备 11010802033920号