巧用c語言數組來操作數字邏輯電路

 

這個算是開發中的小技巧了,也不知道如何起標題。

通常爲了節省單片機的引腳,我我們同城會使用比較多的數字電路來擴展,比如74hc574的D觸發器,74ls138的38譯碼器,3態八路緩衝器/線路驅動器74hc541,還有就是串進並出的74hc595.

當然還有與非門、與門、或門等等最基本的數字邏輯電路來構成gpio的擴展。

數字電路的擴展的理解:

這裏有兩點比較值得注意的,
1、很多時候,8個引腳會控制16個引腳,通過d觸發器來進行選擇哪個8路,而且有可能前級的觸發器引腳也是有幾個(比如3個)來控制的,因此引腳1的上升沿輸出的時候,就不能影響到引腳2的電平,因此前三個引腳在真值表設計的時候,就要注意,1上升沿的時候,2引腳保持高電平或保持低電平,反過來同理。

2、38譯碼器當中也有使能端的,比如74ls138,只有e3=H,E1=L,E2=L的情況下,就會正常輸出某一路低電平,而如果上述三個是能引尖叫有一個電平不正常就會輸出全H。這樣就可以兩個引腳同時互斥的控制兩個38譯碼器。從而到達引腳的擴展。


軟件編程
通常硬件工程師在設計的時候是有一定的規律的,但是不一定十分符合軟件的編寫,因爲涉及到pcb的佈局等,因此需要軟件來完成。
舉個例子:

 

 D觸發器的輸出引腳是這樣的,對應到電路上面某一個設備的序號是紅色標註的,很明顯,不太符合我們軟件上面的操作,我們希望Q0-Q7按順序遞增,但是很無奈,實際是亂序的,因此可以保存一個枚舉,把後面的亂序的做一個整理。

舉個例子:
左邊是實物上器件的序號,右邊是D觸發器的引腳序號。
typedef enum
{
VAT0=5
VAT1=0
VAT2=2
VAT3=1
.
.
VAT6=7
VAT7=4
};

然後定義一個數組:
const static vat_conv[]=
{
[0] = VAT0
[1] = VAT1
[2] = VAT2
[3] = VAT3
.
.
.
};

從這個數組可以看到,我要控制0通道的設備,實際上,軟件是操作VAT0的引腳。省去了窮舉法的if語句。

最後在函數中的參數如下:
void set( uint8_t ch)
{
set_driver(vat_conv[ch]);
}

這樣,set函數參數ch可以直接是0-7,具體的驅動由set_driver來完成,期間用數組來轉換即可,非常類似以前數碼管的操作。
總不可能用窮舉法的方式,點亮1,輸出8bit數據,點亮2,在數據,8個if語句,多浪費。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章