ETH官方钱包

創(chuàng)作內(nèi)容

17 GP

arduino 四位數(shù)七段顯示器

作者:貓貓風(fēng) ?●ω●?│2017-06-22 21:31:20│巴幣:34│人氣:9308
.











四位數(shù)的顯示器控制基本都跟單顆控制一樣,GOOGLE應(yīng)該都可以找到很多就不在這邊贅述

四位數(shù)的控制主要可以看下圖



角位 0 1 2 3 分別控制每段顯示,0為控制最右邊 3為最左邊  依此類推

剩下的 A B C D E F G H(DP) 則控制每個(gè)LED的亮與不亮,如下圖



接著為 arduino 控制器 與 四位數(shù)七段顯示器的接線圖



圖源: http://yehnan.blogspot.tw/2013/08/arduino_26.html

接著為程式碼部分主要分成控制端(PC)與顯示端(arduino)

控制端負(fù)責(zé)送訊號(hào) 顯示端接收到後進(jìn)行動(dòng)作

此程式會(huì)傳出 1 或 0 的訊號(hào)來(lái)控制arduino上面的燈亮與不亮

同時(shí)也會(huì)藉由 Serial Port接收從arduino產(chǎn)生的資料,並將資料儲(chǔ)存在指定資料夾中



以下為 arduino 程式碼,提供兩種方式控制燈光 1. 亂數(shù)>5000亮燈 2. 看 PC端送的訊號(hào)亮燈
註解掉的部分如果在角位A1接上燈就可以使用


  1. #define PIN_0 2  
  2. #define PIN_g 3  
  3. #define PIN_c 4  
  4. #define PIN_h 5  
  5. #define PIN_d 6  
  6. #define PIN_e 7  
  7. #define PIN_b 8  
  8. #define PIN_1 9  
  9. #define PIN_2 10  
  10. #define PIN_f 11  
  11. #define PIN_a 12  
  12. #define PIN_3 13  
  13.   
  14. // 共有4個(gè)七段顯示器,分別由針腳PIN_0、PIN_1、PIN_2、PIN_3控制  
  15. // 七段顯示器裡有8個(gè)LED(包含小數(shù)點(diǎn))  
  16. #define POS_NUM 4  
  17. #define SEG_NUM 8  
  18. const byte pos_pins[POS_NUM] = {PIN_0, PIN_1, PIN_2, PIN_3};  
  19. const byte seg_pins[SEG_NUM] = {PIN_a, PIN_b, PIN_c, PIN_d, PIN_e, PIN_f, PIN_g, PIN_h};  
  20.   
  21. // 底下定義由七段顯示器顯示數(shù)字時(shí)所需要的資料  
  22. const boolean data[10][SEG_NUM] = {  
  23.   {1, 1, 1, 1, 1, 1, 0, 0}, // 0  
  24.   {0, 1, 1, 0, 0, 0, 0, 0}, // 1  
  25.   {1, 1, 0, 1, 1, 0, 1, 0}, // 2  
  26.   {1, 1, 1, 1, 0, 0, 1, 0}, // 3  
  27.   {0, 1, 1, 0, 0, 1, 1, 0}, // 4  
  28.   {1, 0, 1, 1, 0, 1, 1, 0}, // 5  
  29.   {1, 0, 1, 1, 1, 1, 1, 0}, // 6  
  30.   {1, 1, 1, 0, 0, 0, 0, 0}, // 7  
  31.   {1, 1, 1, 1, 1, 1, 1, 0}, // 8  
  32.   {1, 1, 1, 1, 0, 1, 1, 0}, // 9  
  33. };  
  34.   
  35. // 以格式字串輸出到序列埠  
  36. void pf(const char *fmt, ... ){  
  37.     char tmp[128]; // max is 128 chars  
  38.     va_list args;  
  39.     va_start (args, fmt );  
  40.     vsnprintf(tmp, 128, fmt, args);  
  41.     va_end (args);  
  42.     Serial.print(tmp);  
  43. }  
  44.   
  45. // 設(shè)定某個(gè)七段顯示器所顯示的數(shù)字,  
  46. // 參數(shù)pos為0~3,指出想要更新哪一個(gè)七段顯示器,  
  47. // 參數(shù)n為0~9,顯示數(shù)字  
  48. void setDigit(int pos, int n){  
  49.   if(pos < 0 || 3 < pos){  
  50.     pf("error pos=%d\n", pos);  
  51.     return;  
  52.   }  
  53.   
  54.   // 控制想要更新哪一個(gè)七段顯示器,將其腳位設(shè)為L(zhǎng)OW  
  55.   // 其他腳位則設(shè)為HIGH,代表不更新。   
  56.   for(int p = 0; p < POS_NUM; p++){  
  57.     if(p == pos)  
  58.       digitalWrite(pos_pins[p], LOW);  
  59.     else  
  60.       digitalWrite(pos_pins[p], HIGH);  
  61.   }  
  62.     
  63.   // 寫入數(shù)字   
  64.   if(0 <= n && n <= 9){  
  65.     for(int i = 0; i < SEG_NUM; i++){  
  66.       digitalWrite(seg_pins[i], data[n][i] == 1 ? HIGH : LOW);  
  67.     }  
  68.   }  
  69. }  
  70.   
  71. // 設(shè)定整個(gè)四合一型七段顯示器想要顯示的數(shù)字  
  72. // 參數(shù)number的範(fàn)圍應(yīng)是0~9999  
  73. void setNumber(int number)  
  74. {  
  75.   int n0, n1, n2, n3;  
  76.   n3 = number / 1000; //位數(shù)轉(zhuǎn)換 千  
  77.   number %= 1000;  
  78.   n2 = number / 100;//位數(shù)轉(zhuǎn)換 百  
  79.   number %= 100;  
  80.   n1 = number / 10;//位數(shù)轉(zhuǎn)換 十  
  81.   n0 = number % 10;//位數(shù)轉(zhuǎn)換 個(gè)位數(shù)  
  82.   
  83.   // 求出每個(gè)位數(shù)的值後,分別更新  
  84.   //以delay(5)隔開每個(gè)位數(shù)的更新   
  85.   setDigit(0, n0); delay(5);  
  86.   setDigit(1, n1); delay(5);  
  87.   setDigit(2, n2); delay(5);  
  88.   setDigit(3, n3); delay(5);  
  89. }  
  90.   
  91. unsigned long time_previous;  
  92. void setup() {  
  93.   Serial.begin(9600); //baud rate太高會(huì)顯示亂碼  
  94.   randomSeed(analogRead(0));  //隨機(jī)亂數(shù)種子,讓每次產(chǎn)生的亂數(shù)都不相同  
  95.   pinMode(A0,OUTPUT);  
  96.   for(int i = 0; i < POS_NUM; i++){  
  97.     pinMode(pos_pins[i], OUTPUT);  
  98.     digitalWrite(pos_pins[i], HIGH);  
  99.   }  
  100.   for(int i = 0; i < SEG_NUM; i++){  
  101.     pinMode(seg_pins[i], OUTPUT);  
  102.     digitalWrite(seg_pins[i], LOW);  
  103.   }  
  104.   time_previous = millis();  
  105. }  
  106.   
  107. int number = 0;  
  108. void loop() {  
  109.   // 經(jīng)過(guò)一秒後就讓number改變  
  110.   unsigned long time_now = millis();  
  111.   if(time_now - time_previous > 1000){  
  112.     number = random(0,9999);  //亂數(shù)範(fàn)圍0-9999  
  113.     time_previous += 1000;  
  114.     //pf("number=%d\n", number);  
  115.     //Serial.println(String("") + "random number is " + number);
  116.     //用字串方式連接顯示文字  
  117.     Serial.println(number);//用字串方式連接顯示文字  
  118.     //如果產(chǎn)生值>5000 讓 LED1發(fā)亮 否則關(guān)閉  
  119.     /*if(number >= 5000)
  120.     {
  121.       analogWrite(A1, 200);
  122.     }
  123.     else
  124.     {
  125.        analogWrite(A1, 0);
  126.     }*/  
  127.     //讀取從PC SerialPort傳來(lái)的訊息  
  128.     char inByte = Serial.read();   
  129.     //如果為1讓LED2發(fā)亮 如果為0讓LED2熄滅  
  130.     if(inByte == '1')  
  131.     {  
  132.        analogWrite(A0, 200);  
  133.     }  
  134.     else  
  135.     {  
  136.        analogWrite(A0, 0);  
  137.     }  
  138.       
  139.   }  
  140.   setNumber(number); //顯示寫入數(shù)字  
  141.   
  142. }  

C# 控制端


  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using System.IO.Ports;  
  10. using System.Threading;  
  11. using System.IO;  
  12.   
  13. namespace Serial_Recieve  
  14. {  
  15.     public partial class Form1 : Form  
  16.     {  
  17.         string _command = "";  
  18.   
  19.         public Form1()  
  20.         {  
  21.             InitializeComponent();  
  22.         }  
  23.   
  24.         private void Form1_Load(object sender, EventArgs e)  
  25.         {  
  26.             serialPort1.BaudRate = 9600;  
  27.             serialPort1.Parity = Parity.None;  
  28.             serialPort1.DataBits = 8;  
  29.             serialPort1.StopBits = StopBits.One;  
  30.             serialPort1.Encoding = Encoding.GetEncoding("UTF-8");
  31.             //指定編碼格式 收到資訊才不會(huì)出現(xiàn)亂碼  
  32.             label1.Text = "PC狀態(tài):尚未連線";  
  33.             serialPort1.PortName = "COM3";  
  34.         }  
  35.   
  36.         private void button1_Click(object sender, EventArgs e)  
  37.         {  
  38.             try  
  39.             {  
  40.                 serialPort1.Open();  
  41.                 Thread.Sleep(1000);  
  42.                 timer1.Enabled = true;  
  43.                 button1.Enabled = false;  
  44.                 label1.Text = "PC狀態(tài):連線中";  
  45.             }  
  46.             catch  
  47.             {  
  48.                 label1.Text = "PC狀態(tài):Comport open fail";  
  49.             }  
  50.         }  
  51.   
  52.         private void timer1_Tick(object sender, EventArgs e)  
  53.         {  
  54.             string data = "";  
  55.             data = serialPort1.ReadLine();  
  56.             label2.Text = "Arduino回傳:" + data;  
  57.             store_data(data);  
  58.   
  59.             try  
  60.             {  
  61.                 serialPort1.Write(_command);  
  62.             }  
  63.             catch  
  64.             {  
  65.                 label1.Text = "PC狀態(tài):Comport disconnect";  
  66.             }  
  67.         }  
  68.   
  69.         private void store_data(string data)  
  70.         {  
  71.             string str = System.Windows.Forms.Application.StartupPath;  
  72.             string file = str + "\\data\\" + DateTime.Now.Year.ToString() +
  73.             DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() +  
  74.             DateTime.Now.Hour.ToString()+".txt";  
  75.             if (!System.IO.File.Exists(file))  
  76.             {  
  77.                 FileStream filestream = new FileStream(file, FileMode.Create);  
  78.                 filestream.Close();  
  79.             }  
  80.   
  81.             StreamWriter sw = new StreamWriter(file, true);  
  82.             sw.WriteLine("Recieve random number is "+data);  
  83.             sw.Close();  
  84.         }  
  85.   
  86.         private void button2_Click(object sender, EventArgs e)  
  87.         {  
  88.             _command = "1";  
  89.         }  
  90.   
  91.         private void button3_Click(object sender, EventArgs e)  
  92.         {  
  93.             _command = "0";  
  94.         }  
  95.   
  96.         private void button4_Click(object sender, EventArgs e)  
  97.         {  
  98.             button1.Enabled = true;  
  99.             timer1.Enabled= false;  
  100.             label1.Text = "PC狀態(tài):Comport disconnect";  
  101.             serialPort1.Close();  
  102.         }  
  103.     }  
  104. }  


執(zhí)行結(jié)果

控制端連上Comport接收資料並送訊號(hào)開啟LED,接收的資料每秒會(huì)不斷刷新


顯示端序列阜上面的結(jié)果



PC端將接收到的資料儲(chǔ)存(LOG)



LED燈光控制 與 顯示的亂數(shù) 在 arduino上的執(zhí)行狀況 (LED ON)



LED OFF



執(zhí)行畫面  拍影片的時(shí)候還沒(méi)接燈 @_@ 不過(guò)後來(lái)有補(bǔ)  如上圖


最後  由於手機(jī)很差  拍的圖片跟影片沒(méi)很清楚  請(qǐng)見諒 >A<



引用網(wǎng)址:http://www.jamesdambrosio.com/TrackBack.php?sn=3618207
All rights reserved. 版權(quán)所有,保留一切權(quán)利

相關(guān)創(chuàng)作

同標(biāo)籤作品搜尋:涼涼風(fēng)|C#|arduino

留言共 8 篇留言

羽翼ˊ● ω ●ˋ
暑假來(lái)玩一下ARDUINO,想做小臺(tái)的CNC

06-22 21:53

貓貓風(fēng) ?●ω●?
CNC感覺(jué)很讚耶>< 需要查一下還要買哪些元件06-22 21:54
小刀
好厲害!看不懂~[e5]

06-22 22:01

貓貓風(fēng) ?●ω●?
這次的對(duì)會(huì)的人來(lái)說(shuō)應(yīng)該算很基本~ 不過(guò)我弄有點(diǎn)久才稍為搞懂>A< 畢竟對(duì)電路超不熟
06-22 22:03
(?? ?)?╰U╯
雖不明 但覺(jué)厲

06-23 00:12

貓貓風(fēng) ?●ω●?
[e34]06-23 00:20
生不如死兔兔砲
之前學(xué)這個(gè)的時(shí)候做到睡著(#)整天除了玩麵包板就是寫七段顯示器的程式

06-23 01:38

貓貓風(fēng) ?●ω●?
有時(shí)候是會(huì)弄到蠻無(wú)聊的啦,真的會(huì)想睡XD06-23 13:23
珀伽索斯(Ama)
這讓我想起以前我讀高職時(shí),實(shí)習(xí)課時(shí)在麵包版上用過(guò)的七段顯示器,
看過(guò)後感覺(jué)有點(diǎn)懷念,另外我覺(jué)得拍的還好,你介紹的也不錯(cuò)喔!

06-23 12:38

貓貓風(fēng) ?●ω●?
謝謝你的稱讚哦,我覺(jué)得畫質(zhì)都沒(méi)很好><,原來(lái)你有學(xué)過(guò)呢,我都是自學(xué),常常遇到瓶頸待解決06-23 13:24
星砂彌雪
看到這個(gè)讓我想到這科差點(diǎn)被當(dāng)?shù)?哈[e6]

06-23 19:44

貓貓風(fēng) ?●ω●?
所以你是類似電子科的OWO?06-23 21:53
別動(dòng)肝火
以前高中玩過(guò)都忘記怎麼用了

06-23 20:38

貓貓風(fēng) ?●ω●?
這對(duì)高職來(lái)說(shuō)可能是基本~~~~06-23 21:53
(●′?`)ノ?
U質(zhì)文ㄛ

06-27 22:09

貓貓風(fēng) ?●ω●?
桑Q
06-27 22:11
我要留言提醒:您尚未登入,請(qǐng)先登入再留言

17喜歡★s1234567 可決定是否刪除您的留言,請(qǐng)勿發(fā)表違反站規(guī)文字。

前一篇:回創(chuàng)作列表 後一篇:arduino LCD ...

追蹤私訊切換新版閱覽

作品資料夾

colanncolann
【天文研究】2024/10/19 C/2023 A3 (紫金山-阿特拉斯)彗星 http://www.jamesdambrosio.com/creationDetail.php?sn=6024610看更多昨天23:31


face基於日前微軟官方表示 Internet Explorer 不再支援新的網(wǎng)路標(biāo)準(zhǔn),可能無(wú)法使用新的應(yīng)用程式來(lái)呈現(xiàn)網(wǎng)站內(nèi)容,在瀏覽器支援度及網(wǎng)站安全性的雙重考量下,為了讓巴友們有更好的使用體驗(yàn),巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁(yè)面呈現(xiàn)和功能。
屆時(shí)建議您使用下述瀏覽器來(lái)瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業(yè)系統(tǒng)版本才可使用)

face我們了解您不想看到廣告的心情? 若您願(yuàn)意支持巴哈姆特永續(xù)經(jīng)營(yíng),請(qǐng)將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學(xué)】