這次我們用樹莓派的GPIO口驅(qū)動數(shù)碼管來顯示數(shù)字,進而制作一個簡單的電子鐘,通過按鈕來切換顯示時間或日期。
最終效果
樹莓派GPIO入門05-驅(qū)動數(shù)碼管顯示數(shù)字
硬件
- 數(shù)碼管一只。因為需要顯示日期時間所以需要能顯示4個數(shù)字的數(shù)碼管,也稱4位數(shù)碼管。淘寶買1塊多錢一只。注意數(shù)碼管有共陽和共陰的。我這里使用的是共陽的。至于區(qū)別,下面的原理說明里會詳細(xì)解釋。
- 杜邦線若干。
- 面包板一塊。
- 按鈕1只。
原理說明
- 標(biāo)準(zhǔn)的數(shù)碼管從顯示內(nèi)容上分7段和8段數(shù)碼管兩種。8段比7段多一個右下角的小數(shù)點。還有一些其他特殊的如可以顯示米字形的數(shù)碼管不在本文討論范圍內(nèi),其實原理都是一樣的。
- 8段數(shù)碼管由8個發(fā)光二極管組成,其中7個用于組成數(shù)字,1個用于顯示小數(shù)點。每一根的編號如下圖的右上角所示(A-G,DP)。
4位共陽8段數(shù)碼管原理圖
數(shù)碼管從電源極性上分共陽和共陰兩種。解釋一下,如果數(shù)碼管上每一個獨立的發(fā)光二極管都單獨引出兩根引腳,一根接正極(陽)一根接負(fù)極(陰),那么一個8段數(shù)碼管就需要16根引腳來控制。但其實這8段數(shù)碼管完全可以在內(nèi)部共用一個陽級,只控制各段發(fā)光二極管的陰級聯(lián)通即可,這就是共陽。反之亦然,叫共陰。共陽或共陰的每個8段數(shù)碼管只需要引出9個引腳,1個陽(陰)級接到樹莓派vcc(gnd)上,另外8個分別連到gpio口上,通過控制io口高低電平即可顯示所需數(shù)字。比如一只共陽數(shù)碼管想顯示數(shù)字1,看LED編號圖可知需要點亮b段和c段,其他全滅。那么連到共陽端引腳的io口輸出高電平,連到引腳b、c的io口輸出低電平,連到引腳a、d、e、f、g、dp的io口均輸出高電平即可。寫成代碼就是:
12345678910111213141516171819202122232425262728
# 定義各段發(fā)光二極管對應(yīng)的GPIO口LED_A = 26LED_B = 19LED_C = 13LED_D = 6LED_E = 5LED_F = 11LED_G = 9LED_DP = 10# 定義數(shù)碼管共陽極對應(yīng)的GPIO口VCC = 12# 避免閃爍,在輸出數(shù)字字形信號前先拉低共陽端,關(guān)閉顯示RPi.GPIO.output(VCC, False)# 輸出數(shù)字1的字形信號RPi.GPIO.output(LED_A, True)RPi.GPIO.output(LED_B, False)RPi.GPIO.output(LED_C, False)RPi.GPIO.output(LED_D, True)RPi.GPIO.output(LED_E, True)RPi.GPIO.output(LED_F, True)RPi.GPIO.output(LED_G, True)RPi.GPIO.output(LED_DP, True)# 最后拉高共陽段,顯示數(shù)字RPi.GPIO.output(VCC, True)
本文使用的數(shù)碼管是8段共陽4位(4個數(shù)字)數(shù)碼管,型號是F3461BH。上面說了共陽數(shù)碼管每個數(shù)字需要9個引腳來控制,那么4個數(shù)字就需要36個引腳嗎?顯然不現(xiàn)實,樹莓派的io口也完全不夠用。這就引出另一個概念,靜態(tài)顯示和動態(tài)掃描顯示。
靜態(tài)顯示,就是前面說的每一個數(shù)字需要占用8個io口,每多一個數(shù)字就需要額外的8個io口,如果數(shù)字位數(shù)不多,io口夠用的話,這樣做完全沒問題。實際應(yīng)用中往往需要顯示多個數(shù)字,io口基本上是不夠用的。這就需要動態(tài)掃描顯示了。下面摘一段百度百科關(guān)于動態(tài)掃描顯示的說明(稍有改動):
數(shù)碼管動態(tài)顯示接口是單片機中應(yīng)用最為廣泛的一種顯示方式之一,動態(tài)驅(qū)動是將所有數(shù)碼管的8個顯示筆劃”a,b,c,d,e,f,g,dp”的同名端連在一起引出8個引腳,每個數(shù)字再單獨引出共陽(陰)端,這樣總引腳數(shù)就只要8 + 數(shù)字個數(shù)即可,本文使用的8段4位數(shù)碼管正是引出了12個引腳。至于哪個引腳對應(yīng)哪一段,哪幾個引腳分別對應(yīng)各數(shù)字的共陽(陰)端,就需要商家提供電路圖了。當(dāng)然也可以自己慢慢試,這不在本文討論范圍,大家可以自己摸索。當(dāng)樹莓派輸出8個段信號時,所有數(shù)碼管都會接收到相同的信號,但究竟是哪個數(shù)碼管會顯示出字形,取決于這個數(shù)碼管對應(yīng)的共陽(陰)極(后統(tǒng)稱位選端)有無導(dǎo)通。所以我們只要將需要顯示的數(shù)碼管的位選端選通,該位就顯示出字形,沒有選通的數(shù)碼管就不會亮。通過分時輪流控制各個數(shù)碼管的的位選端,就使各個數(shù)碼管輪流受控顯示,這就是動態(tài)驅(qū)動。在輪流顯示過程中,每位數(shù)碼管的點亮?xí)r間為1~2ms,由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實際上各位數(shù)碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感,動態(tài)顯示的效果和靜態(tài)顯示是一樣的,能夠節(jié)省大量的I/O端口,而且功耗更低。
綜上,比如我們想要在4位共陽數(shù)碼管上顯示1234這4個數(shù)字,要做的就是:
- 避免閃爍,在輸出數(shù)字字形信號前先拉低所有4個共陽極,關(guān)閉所有顯示。
- 拉低1號數(shù)碼管的共陽極,關(guān)閉顯示。
- 輸出1號數(shù)碼管上希望顯示的數(shù)字字形信號。
- 只拉高1號數(shù)碼管的共陽極,讓1號數(shù)碼管顯示上面設(shè)置好的數(shù)字字形。
- 延時一段時間(1ms左右)
- 拉低1號數(shù)碼管的共陽極,關(guān)閉顯示。
- 輸出2號數(shù)碼管上希望顯示的數(shù)字字形信號。
- 只拉高2號數(shù)碼管的共陽極,讓2號數(shù)碼管顯示上面設(shè)置好的數(shù)字字形。
- 延時一段時間(1ms左右)
- 拉低2號數(shù)碼管的共陽極,關(guān)閉顯示。
- 輸出3號數(shù)碼管上希望顯示的數(shù)字字形信號。
- 只拉高3號數(shù)碼管的共陽極,讓3號數(shù)碼管顯示上面設(shè)置好的數(shù)字字形。
- 延時一段時間(1ms左右)
- 拉低3號數(shù)碼管的共陽極,關(guān)閉顯示。
- 輸出4號數(shù)碼管上希望顯示的數(shù)字字形信號。
- 只拉高4號數(shù)碼管的共陽極,讓4號數(shù)碼管顯示上面設(shè)置好的數(shù)字字形。
- 延時一段時間(1ms左右)
- 返回step2,循環(huán)執(zhí)行。
- 取得日期和時間的方法不是本文的重點,大家自己看代碼。
硬件連接
硬件連接圖
代碼
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
#!/usr/bin/env python# encoding: utf-8import RPi.GPIOimport time# 定義單個數(shù)碼管各段led對應(yīng)的GPIO口LED_A = 26LED_B = 19LED_C = 13LED_D = 6LED_E = 5LED_F = 11LED_G = 9LED_DP = 10# 定義1到4號數(shù)碼管陽極對應(yīng)的GPIO口DIGIT1 = 12DIGIT2 = 16DIGIT3 = 20DIGIT4 = 21# 定義按鈕輸入的GPIO口btn = 27RPi.GPIO.setmode(RPi.GPIO.BCM)RPi.GPIO.setup(LED_A, RPi.GPIO.OUT)RPi.GPIO.setup(LED_B, RPi.GPIO.OUT)RPi.GPIO.setup(LED_C, RPi.GPIO.OUT)RPi.GPIO.setup(LED_D, RPi.GPIO.OUT)RPi.GPIO.setup(LED_E, RPi.GPIO.OUT)RPi.GPIO.setup(LED_F, RPi.GPIO.OUT)RPi.GPIO.setup(LED_G, RPi.GPIO.OUT)RPi.GPIO.setup(LED_DP, RPi.GPIO.OUT)RPi.GPIO.setup(DIGIT1, RPi.GPIO.OUT)RPi.GPIO.setup(DIGIT2, RPi.GPIO.OUT)RPi.GPIO.setup(DIGIT3, RPi.GPIO.OUT)RPi.GPIO.setup(DIGIT4, RPi.GPIO.OUT)RPi.GPIO.output(DIGIT1, True)RPi.GPIO.output(DIGIT2, True)RPi.GPIO.output(DIGIT3, True)RPi.GPIO.output(DIGIT4, True)RPi.GPIO.setup(btn, RPi.GPIO.IN, pull_up_down=RPi.GPIO.PUD_UP)# 指定no(1-4)號數(shù)碼管顯示數(shù)字num(0-9),第三個參數(shù)是顯示不顯示小數(shù)點(true/false)def showDigit(no, num, showDotPoint): # 先將正極拉低,關(guān)掉顯示RPi.GPIO.output(DIGIT1, False)RPi.GPIO.output(DIGIT2, False)RPi.GPIO.output(DIGIT3, False)RPi.GPIO.output(DIGIT4, False)if (num == 0) :RPi.GPIO.output(LED_A, False)RPi.GPIO.output(LED_B, False)RPi.GPIO.output(LED_C, False)RPi.GPIO.output(LED_D, False)RPi.GPIO.output(LED_E, False)RPi.GPIO.output(LED_F, False)RPi.GPIO.output(LED_G, True)RPi.GPIO.output(LED_DP, not showDotPoint)elif (num == 1) :RPi.GPIO.output(LED_A, True)RPi.GPIO.output(LED_B, False)RPi.GPIO.output(LED_C, False)RPi.GPIO.output(LED_D, True)RPi.GPIO.output(LED_E, True)RPi.GPIO.output(LED_F, True)RPi.GPIO.output(LED_G, True)RPi.GPIO.output(LED_DP, not showDotPoint)elif (num == 2) :RPi.GPIO.output(LED_A, False)RPi.GPIO.output(LED_B, False)RPi.GPIO.output(LED_C, True)RPi.GPIO.output(LED_D, False)RPi.GPIO.output(LED_E, False)RPi.GPIO.output(LED_F, True)RPi.GPIO.output(LED_G, False)RPi.GPIO.output(LED_DP, not showDotPoint)elif (num == 3) :RPi.GPIO.output(LED_A, False)RPi.GPIO.output(LED_B, False)RPi.GPIO.output(LED_C, False)RPi.GPIO.output(LED_D, False)RPi.GPIO.output(LED_E, True)RPi.GPIO.output(LED_F, True)RPi.GPIO.output(LED_G, False)RPi.GPIO.output(LED_DP, not showDotPoint)elif (num == 4) :RPi.GPIO.output(LED_A, True)RPi.GPIO.output(LED_B, False)RPi.GPIO.output(LED_C, False)RPi.GPIO.output(LED_D, True)RPi.GPIO.output(LED_E, True)RPi.GPIO.output(LED_F, False)RPi.GPIO.output(LED_G, False)RPi.GPIO.output(LED_DP, not showDotPoint)elif (num == 5) :RPi.GPIO.output(LED_A, False)RPi.GPIO.output(LED_B, True)RPi.GPIO.output(LED_C, False)RPi.GPIO.output(LED_D, False)RPi.GPIO.output(LED_E, True)RPi.GPIO.output(LED_F, False)RPi.GPIO.output(LED_G, False)RPi.GPIO.output(LED_DP, not showDotPoint)elif (num == 6) :RPi.GPIO.output(LED_A, False)RPi.GPIO.output(LED_B, True)RPi.GPIO.output(LED_C, False)RPi.GPIO.output(LED_D, False)RPi.GPIO.output(LED_E, False)RPi.GPIO.output(LED_F, False)RPi.GPIO.output(LED_G, False)RPi.GPIO.output(LED_DP, not showDotPoint)elif (num == 7) :RPi.GPIO.output(LED_A, False)RPi.GPIO.output(LED_B, False)RPi.GPIO.output(LED_C, False)RPi.GPIO.output(LED_D, True)RPi.GPIO.output(LED_E, True)RPi.GPIO.output(LED_F, True)RPi.GPIO.output(LED_G, True)RPi.GPIO.output(LED_DP, not showDotPoint)elif (num == 8) :RPi.GPIO.output(LED_A, False)RPi.GPIO.output(LED_B, False)RPi.GPIO.output(LED_C, False)RPi.GPIO.output(LED_D, False)RPi.GPIO.output(LED_E, False)RPi.GPIO.output(LED_F, False)RPi.GPIO.output(LED_G, False)RPi.GPIO.output(LED_DP, not showDotPoint)elif (num == 9) :RPi.GPIO.output(LED_A, False)RPi.GPIO.output(LED_B, False)RPi.GPIO.output(LED_C, False)RPi.GPIO.output(LED_D, False)RPi.GPIO.output(LED_E, True)RPi.GPIO.output(LED_F, False)RPi.GPIO.output(LED_G, False)RPi.GPIO.output(LED_DP, not showDotPoint)if (no == 1) :RPi.GPIO.output(DIGIT1, True)elif (no == 2) :RPi.GPIO.output(DIGIT2, True)elif (no == 3) :RPi.GPIO.output(DIGIT3, True)elif (no == 4) :RPi.GPIO.output(DIGIT4, True)try:t=0.005while True:# 按鈕按下時顯示日期,否則顯示時間# 為了區(qū)別左右的數(shù)字,讓第二個數(shù)碼管的小數(shù)點顯示出來#(本來應(yīng)該是一個冒號,我們這個數(shù)碼管沒有,就用小數(shù)點代替了)if (RPi.GPIO.input(btn) == 1):time.sleep(t)showDigit(1, int(time.strftime("%H",time.localtime(time.time()))) / 10, False)time.sleep(t)showDigit(2, int(time.strftime("%H",time.localtime(time.time()))) % 10, True)time.sleep(t)showDigit(3, int(time.strftime("%M",time.localtime(time.time()))) / 10, False)time.sleep(t)showDigit(4, int(time.strftime("%M",time.localtime(time.time()))) % 10, False)else:time.sleep(t)showDigit(1, int(time.strftime("%m",time.localtime(time.time()))) / 10, False)time.sleep(t)showDigit(2, int(time.strftime("%m",time.localtime(time.time()))) % 10, True)time.sleep(t)showDigit(3, int(time.strftime("%d",time.localtime(time.time()))) / 10, False)time.sleep(t)showDigit(4, int(time.strftime("%d",time.localtime(time.time()))) % 10, False)except KeyboardInterrupt:pass# 最后清理GPIO口(不做也可以,建議每次程序結(jié)束時清理一下,好習(xí)慣)RPi.GPIO.cleanup()
性能改善
當(dāng)你照著這篇文章成功在數(shù)碼管上顯示出數(shù)字后,你可能會郁悶的發(fā)現(xiàn)數(shù)字有一點點閃爍,顯示的不是非常穩(wěn)定,這種情況在樹莓派1代上更明顯。
- python庫對gpio口不停操作時對cpu的占用率很高,而一旦cpu的占用率一高,就不能保證延時函數(shù)的準(zhǔn)確性,而在動態(tài)掃描時延時的不準(zhǔn)確會導(dǎo)致數(shù)碼管的亮度不穩(wěn)定,比如第一只數(shù)碼管顯示了2ms而第二只顯示了1ms的話,第一只數(shù)碼管的亮度就會略高于第二只數(shù)碼管,而參差不齊的延時最后就表現(xiàn)為數(shù)字顯示有閃爍的感覺。
- python庫本身翻轉(zhuǎn)gpio口的效率就不高,有興趣可以參照這個頁面,有各種語言各種庫對gpio的操作速度比較。比較結(jié)果是c的wiringPi庫完勝其他方式。其實python庫已經(jīng)是表現(xiàn)不錯的了,但還是被c甩了N條街。python翻轉(zhuǎn)io口的頻率在70kHz左右,而wiringPi則可以達到4MHz!這個已經(jīng)是數(shù)量級上的差距了。
抱著試一試的心情,我用c語言的wiringPi庫把上面這個程序重寫了一遍,代碼是這個樣子的:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
#include
#include #include // 定義單個數(shù)碼管各段led對應(yīng)的GPIO口// 使用命令 "gpio readall" 來獲取當(dāng)前pi版本對應(yīng)的各引腳的wiringPi和BCM的編號// 再本程序中應(yīng)該使用wiringPi編號// 我的pi2 Mode B執(zhí)行結(jié)果如下:(wPi列就是wiringPi編號)// 之前Python版本的代碼使用的是BCM編號,所以在不改變硬件接線的情況下,我們需要把原來BCM編號改成對應(yīng)的wiringPi編號。/* +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5V | | | | 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | | | 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 | | | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 | | 17 | 0 | GPIO. 0 | OUT | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 | | 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | | | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 | | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 | | 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | | | 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 | | 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 | | | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 | | 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 | | 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | | | 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 | | 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | | | 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 | | 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 | | | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+*/#define LED_A 25 //BCM:26#define LED_B 24 //BCM:19#define LED_C 23 //BCM:13#define LED_D 22 //BCM:6#define LED_E 21 //BCM:5#define LED_F 14 //BCM:11#define LED_G 13 //BCM:9#define LED_DP 12 //BCM:10// 定義1到4號數(shù)碼管陽極對應(yīng)的GPIO口#define DIGIT1 26 //BCM:12#define DIGIT2 27 //BCM:16#define DIGIT3 28 //BCM:20#define DIGIT4 29 //BCM:21// 定義按鈕輸入的GPIO口#define btn 2 //BCM:27#define FALSE 0#define TRUE 1#define t 5000 //usleep延時長度(單位um微秒,1000um=1ms,1000ms=1s)// 指定no(1-4)號數(shù)碼管顯示數(shù)字num(0-9),第三個參數(shù)是顯示不顯示小數(shù)點(1/0)void showDigit(int no, int num, int showDotPoint);time_t now;struct tm *tm_now;int main (void) { wiringPiSetup () ; pinMode (LED_A, OUTPUT) ; pinMode (LED_B, OUTPUT) ; pinMode (LED_C, OUTPUT) ; pinMode (LED_D, OUTPUT) ; pinMode (LED_E, OUTPUT) ; pinMode (LED_F, OUTPUT) ; pinMode (LED_G, OUTPUT) ; pinMode (LED_DP, OUTPUT) ; pinMode (DIGIT1, OUTPUT) ; pinMode (DIGIT2, OUTPUT) ; pinMode (DIGIT3, OUTPUT) ; pinMode (DIGIT4, OUTPUT) ; pinMode (btn, INPUT) ; pullUpDnControl (btn, PUD_UP) ; digitalWrite (DIGIT1, HIGH) ; digitalWrite (DIGIT2, HIGH) ; digitalWrite (DIGIT3, HIGH) ; digitalWrite (DIGIT4, HIGH) ; for (; ; ) { time(&now); tm_now=localtime(&now); // 按鈕按下時顯示日期,否則顯示時間 // 為了區(qū)別左右的數(shù)字,讓第二個數(shù)碼管的小數(shù)點顯示出來 //(本來應(yīng)該是一個冒號,我們這個數(shù)碼管沒有,就用小數(shù)點代替了) if (digitalRead(btn) == HIGH) { usleep(t); showDigit(1, tm_now->tm_hour / 10, FALSE); usleep(t); showDigit(2, tm_now->tm_hour % 10, TRUE); usleep(t); showDigit(3, tm_now->tm_min / 10, FALSE); usleep(t); showDigit(4, tm_now->tm_min % 10, FALSE); } else { // 取得的月份和日期都是從0開始的,所以顯示前需要加1 usleep(t); showDigit(1, (tm_now->tm_mon+1) / 10, FALSE); usleep(t); showDigit(2, (tm_now->tm_mon+1) % 10, TRUE); usleep(t); showDigit(3, (tm_now->tm_mday+1) / 10, FALSE); usleep(t); showDigit(4, (tm_now->tm_mday+1) % 10, FALSE); } } return 0 ;}void showDigit(int no, int num, int showDotPoint) { // 先將正極拉低,關(guān)掉顯示 digitalWrite (DIGIT1, LOW) ; digitalWrite (DIGIT2, LOW) ; digitalWrite (DIGIT3, LOW) ; digitalWrite (DIGIT4, LOW) ; if (num == 0) { digitalWrite (LED_A, LOW) ; digitalWrite (LED_B, LOW) ; digitalWrite (LED_C, LOW) ; digitalWrite (LED_D, LOW) ; digitalWrite (LED_E, LOW) ; digitalWrite (LED_F, LOW) ; digitalWrite (LED_G, HIGH) ; } else if (num == 1) { digitalWrite (LED_A, HIGH) ; digitalWrite (LED_B, LOW) ; digitalWrite (LED_C, LOW) ; digitalWrite (LED_D, HIGH) ; digitalWrite (LED_E, HIGH) ; digitalWrite (LED_F, HIGH) ; digitalWrite (LED_G, HIGH) ; } else if (num == 2) { digitalWrite (LED_A, LOW) ; digitalWrite (LED_B, LOW) ; digitalWrite (LED_C, HIGH) ; digitalWrite (LED_D, LOW) ; digitalWrite (LED_E, LOW) ; digitalWrite (LED_F, HIGH) ; digitalWrite (LED_G, LOW) ; } else if (num == 3) { digitalWrite (LED_A, LOW) ; digitalWrite (LED_B, LOW) ; digitalWrite (LED_C, LOW) ; digitalWrite (LED_D, LOW) ; digitalWrite (LED_E, HIGH) ; digitalWrite (LED_F, HIGH) ; digitalWrite (LED_G, LOW) ; } else if (num == 4) { digitalWrite (LED_A, HIGH) ; digitalWrite (LED_B, LOW) ; digitalWrite (LED_C, LOW) ; digitalWrite (LED_D, HIGH) ; digitalWrite (LED_E, HIGH) ; digitalWrite (LED_F, LOW) ; digitalWrite (LED_G, LOW) ; } else if (num == 5) { digitalWrite (LED_A, LOW) ; digitalWrite (LED_B, HIGH) ; digitalWrite (LED_C, LOW) ; digitalWrite (LED_D, LOW) ; digitalWrite (LED_E, HIGH) ; digitalWrite (LED_F, LOW) ; digitalWrite (LED_G, LOW) ; } else if (num == 6) { digitalWrite (LED_A, LOW) ; digitalWrite (LED_B, HIGH) ; digitalWrite (LED_C, LOW) ; digitalWrite (LED_D, LOW) ; digitalWrite (LED_E, LOW) ; digitalWrite (LED_F, LOW) ; digitalWrite (LED_G, LOW) ; } else if (num == 7) { digitalWrite (LED_A, LOW) ; digitalWrite (LED_B, LOW) ; digitalWrite (LED_C, LOW) ; digitalWrite (LED_D, HIGH) ; digitalWrite (LED_E, HIGH) ; digitalWrite (LED_F, HIGH) ; digitalWrite (LED_G, HIGH) ; } else if (num == 8) { digitalWrite (LED_A, LOW) ; digitalWrite (LED_B, LOW) ; digitalWrite (LED_C, LOW) ; digitalWrite (LED_D, LOW) ; digitalWrite (LED_E, LOW) ; digitalWrite (LED_F, LOW) ; digitalWrite (LED_G, LOW) ; } else if (num == 9) { digitalWrite (LED_A, LOW) ; digitalWrite (LED_B, LOW) ; digitalWrite (LED_C, LOW) ; digitalWrite (LED_D, LOW) ; digitalWrite (LED_E, HIGH) ; digitalWrite (LED_F, LOW) ; digitalWrite (LED_G, LOW) ; } if (showDotPoint == 1) { digitalWrite (LED_DP, LOW) ; } else { digitalWrite (LED_DP, HIGH) ; } if (no == 1) { digitalWrite (DIGIT1, HIGH) ; } else if (no == 2) { digitalWrite (DIGIT2, HIGH) ; } else if (no == 3) { digitalWrite (DIGIT3, HIGH) ; } else if (no == 4) { digitalWrite (DIGIT4, HIGH) ; }} c的wiringPi庫的安裝和代碼的編譯執(zhí)行方法請自行百度。
c語言測試結(jié)果是顯示穩(wěn)定了很多,但仍然有一點不穩(wěn)定不仔細(xì)觀察基本看不出來了。這個應(yīng)該跟我代碼的效率有關(guān),邏輯應(yīng)該還可以精簡節(jié)省cpu資源。這個以后再試了。我們這個系列主要是讓大家了解各種基本外設(shè)傳感器的原理和使用方法。用c語言也只是做一點延伸,以后的教程還是以python為主。
評論