MF幹活——C#數位管與跑馬燈之舞(視頻)

來源:互聯網
上載者:User

    通過《C#點燈神話》,我們瞭解到單片機最基礎的輸入輸出功能,也就是所謂的GPIO
    這一次,我們來點更多的“燈”——數位管,並且還是四位元碼管
    先上結果,看視頻:

    這個視頻混合了四位元碼管、液晶屏和跑馬燈,比上一次的小燈閃爍要效果好點。

數位管原理簡述
    現
在的數位管也叫七段數位管,一個完整的數字8就剛好用到七段小燈,加上小數點就是8個小燈。嗯,每一段就是一個小燈,那麼操作方式跟點燈神話裡面是一樣
的,只不過多了很多而已。四位元字,每個數字用8個小燈,那麼一共就有32個,加上接地或者高電平,至少得33腳,接線那可是一個非常複雜的工程。
    但是,我們的四位元碼管,只有12腳,其中8個負責每一個數位同一段小燈,剩下四個選擇給哪個數字供電。這就涉及一個非常悲催的事情:當你控制點亮個位,準備控制輸出十位的時候,個位會熄滅,因為選擇腳選擇了十位;如果你同時選擇個位,那麼只會落得個位跟十位一樣數字,因為它們不同數位同一段共用同一個針腳
    怎麼辦??呵呵,有些人就以為數位管設計上有問題,應該有類似液晶屏一樣的鎖存的東西,每顯示一位後就鎖定。
    其
實,這些數位管設計沒有問題,相反,還非常精妙!上面說了,如果採用傳統的GPIO做法,那麼四位元碼管就得需要33腳,那是非常非常浪費針腳資源的。仿
照電腦串口硬碟的原理,我們也可以採用串口的方式來控制多位元碼管。那麼,N位元碼管,其實只需要N+8個針腳就已經足夠了。
    那個“鎖存”問題怎麼解決呢?其實不用解決,我們完全可以利用人眼的視覺誤差,要知道,動畫的基本原理也是這樣子。在顯示個位後,維持一小段時間,然後顯示十位,然後百位千位,依次逐位顯示,只要整個過程很快,我們人眼就會以為它們是一起亮起來的!

接線
    先看看全域,這裡接好了液晶屏、數位管(液晶屏上面那個)、10個小燈。別的東西都是擺設,東西太多太亂不好意思!杜邦線不夠的同學可以分開實驗。

10個各種顏色的小燈,接在麵包板上,準備做跑馬燈。下方的線是接地GND。
下右圖是板子左針腳原理圖,我們依箭頭從PG0到PG1選10個,另外接左下角的GND即可。
這裡故意犯一個錯誤,用了那個PB2針腳,其實探索者一號上PB2是接蜂鳴器的,現在共用了,如果驅動能力足夠,除了小燈亮以為,大家在視屏裡面應該還能聽到嘟嘟嘟的背景聲。


位元碼管12腳的接法。這裡有個地方不得不說,大家也許發現板子上很多針腳插有綠色跳線帽。其實那是我做的一個標記,標明這個腳已經別別的裝置使用,避免
衝突。細心的同學可以發現,探索者一號板子的數位管常式,在沒有接上液晶屏的時候是正常工作的,接上液晶屏後,就不動了,液晶屏也不正常了。這就是針腳沖
突,剛好那一片好多腳被液晶屏用了的。
所以,這裡另外取12個接數位管,從PC0依箭頭的順序到PC1。
數位管方面,正面面向你,有小數點一邊在下方,那麼,背後左下角是針腳1,逆時針輸下去,一直到左上方的12。按照這個順序接好數位管和板子排針。

原始碼
數位管源碼。原理上很簡單,開個線程不斷的刷要顯示的數字,不能停下來。哦,沒錯,單片機也可以用.Net裡面的線程!

數位管原始碼

using System;using System.Threading;using Microsoft.SPOT.Hardware;namespace MFTest{    /// <summary>四位元碼管</summary>    class Led4    {        /// <summary>每個數位段數,一個位元組只用七位,表示數位管七段順時針</summary>        static readonly Byte[] LedDigitals = new Byte[] { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 };        /// <summary>數位管公用腳</summary>        public Int32[] PublicPins = new Int32[] { 6, 8, 9, 12 };        /// <summary>數位管七段腳</summary>        public Int32[] SevenPins = new Int32[] { 11, 7, 4, 2, 1, 10, 5, 3 };        /// <summary>實際控制板針腳</summary>        public Cpu.Pin[] LedPins;        OutputPort[] ports;        private Int32 _Value;        /// <summary>要顯示的數字</summary>        public Int32 Value { get { return _Value; } set { _Value = value; } }        private Boolean _IsHex;        /// <summary>進位。只支援十進位和十六進位</summary>        public Boolean IsHex { get { return _IsHex; } set { _IsHex = value; } }        Thread th;        public void Start()        {            if (LedPins == null || LedPins.Length < 1) throw new Exception("No Pins For Led4!");            ports = new OutputPort[LedPins.Length];            for (int i = 0; i < LedPins.Length; i++)            {                // i==2就是腳3,是DP                ports[i] = new OutputPort(LedPins[i], i == 2 || Array.IndexOf(PublicPins, i + 1) >= 0);            }            for (int i = 0; i < LedPins.Length; i++)            {                ports[i].Write(false);            }            th = new Thread(dis);            th.Start();        }        public void Stop()        {            if (th == null) return;            th.Abort();            th = null;        }        void dis()        {            if (IsHex)                while (true) ShowNumber16(Value);            else                while (true) ShowNumber(Value);        }        void ShowNumber(Int32 n)        {            for (int i = 0; i < 4; i++)            {                // 如果現在要顯示的是0,並且不是第一個數字,那麼應該關閉顯示                if (n == 0 && i > 0)                {                    ShowDigital(i, 0, false);                }                else                {                    // 這一次應該顯示的數字                    ShowDigital(i, n % 10, true);                    n = n / 10;                }            }        }        void ShowNumber16(Int32 n)        {            for (int i = 0; i < 4; i++)            {                // 如果現在要顯示的是0,並且不是第一個數字,那麼應該關閉顯示                if (n == 0 && i > 0)                {                    ShowDigital(i, 0, false);                }                else                {                    // 這一次應該顯示的數字                    ShowDigital(i, n & 0xF, true);                    n = n >> 4;                }            }        }        void ShowDigital(Int32 index, Int32 n, Boolean show)        {            // 找到控制腳            var pin = ports[PublicPins[index] - 1];            // 如果不顯示,關閉後直接返回            if (!show)            {                pin.Write(false);                return;            }            // 輸出數位七段表示            var d = LedDigitals[n];            for (int i = 0; i < 7; i++)            {                var p = ports[SevenPins[i] - 1];                p.Write((d >> i & 0x1) == 0);            }            // 關閉小數點            ports[SevenPins[7] - 1].Write(true);            // 先輸出數字,再開啟開關            pin.Write(true);            // 然後停留一會,形成一個視覺效果            Thread.Sleep(5);            // 最後關閉,為下一個顯示做準備            pin.Write(false);        }    }}

 

控制源碼。

 

控制碼

// 探索者一號// 跑馬燈針腳var pins = new Cpu.Pin[] {    Pins.PG1, Pins.PF15, Pins.PF13, Pins.PF11, Pins.PB1,    Pins.PC5, Pins.PG0, Pins.PF14, Pins.PF12, Pins.PB2 };var leds = new OutputPort[pins.Length];for (int i = 0; i < pins.Length; i++){    leds[i] = new OutputPort(pins[i], i % 2 == 0);}var led4 = new Led4();// 數位管針腳led4.LedPins = new Cpu.Pin[] {    Pins.PC0, Pins.PF9, Pins.PF7, Pins.PF5, Pins.PF3, Pins.PF1,    Pins.PF2, Pins.PF4, Pins.PF6, Pins.PF8, Pins.PF10, Pins.PC1 };led4.IsHex = true; // 按十六進位顯示led4.Start();var k = 0;for (int i = 0; i < 20000; i++){    for (int j = 0; j < leds.Length; j++)    {        leds[j].Write(k == j);    }    if (k++ >= leds.Length) k = 0;    led4.Value = i;    Thread.Sleep(50);}led4.Stop();

 

 

萬事俱備!把程式寫入探索者一號板子,重啟後,數位管在數數,10個小燈從左至右依次亮過去。
使用其它板子的同學,自己選好針腳,稍微修改控制碼即可!針腳不夠可分開實驗!

 

歡迎感興趣的同學一起學習研究!頁頭有群號和論壇資料地址。

 

如果您認為本文對你有用,麻煩給個推薦,謝謝!o(∩_∩)o

如果您覺得本文很爛,有誤導他人的嫌疑,還請一定給個反對,給出您尊貴的意見,我們一定改進!謝謝!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.