我們先來看第一個效果,數碼管以秒計數顯示
動態效果圖
老套路,我們接下來進行分解,我們首先第一步就是讓每個數碼管都可控,不知道怎么使用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)趣味單片機新玩法-認識不一樣的數碼管
推薦閱讀最新更新時間:2025-07-03 16:48


設計資源 培訓 開發板 精華推薦
- LSM330D適配器板,標準DIL24插座
- 使用 Raspberry Pi Foundation 的 2711ZPKFSB06B0T 的參考設計
- LTC6957 的典型應用 - 低相位噪聲、雙輸出緩沖器/驅動器/邏輯轉換器
- 2019年電賽D題-簡易電路特性測試-設計方案及報告(國一,南京理工)
- EVAL-ADF4193EB1,用于無線 LAN 的 ADF4193 PLL 時鐘發生器的評估板
- 用于微功率 A/D 轉換器的 LT1634BIS8-2.5 電壓基準的典型應用
- 使用 Analog Devices 的 LTC3588EDD-1 的參考設計
- 用于照明的 PSoC 嵌入式系統
- LM358DR2G 運放函數發生器的典型應用
- ADL5387-EVALZ,基于 ADL5387 30 MHz 至 2 GHz 正交解調器的評估板