堃喬 USB 介面電路實習簡易說明書
介面電路實習從早期透過 8255,到利用印表機 port,再到目前是透過 USB 控制 I/O 周邊裝置,配合 107 年新課綱介面電路實習,利用目前電腦硬
體裝修乙級第一站試題再擴充控制其他周邊 I/O,讓學生可在二年級就提前熟悉透過 VB 程式直接控制 I/O,但由於
乙級公告試題的 ATMEGA8 韌體與
USBIO.dll 內容僅支援『輸出』控制,所以無法另外作輸入控制練習,除 AD0~AD7,僅 PC4、PC5 腳位可以利用
。
從 102 年開始的工科技藝競賽電腦修護第二題開始所使用的 ATMEGA8 內容是需由選手自行撰寫,搭配的『
USBHIO.dll
』
才具有輸入函數可運用
,
呼叫方式和乙級的 USBIO.dll 也不同,由於 ATMEGA8 韌體程式撰寫已經超過高職課綱範圍,故在此重點是利用乙級 ATMEGA8 與 USBIO.dll 控制 I/O 為主。
當然若有參加工科技藝競賽學校,選手也可利用這介面電路實驗板練習 102~105 年歷屆試題,光碟僅內附相關韌體的 HEX 檔案與 VB 執行檔參考解答。
介面實驗器各區塊功能介紹如下:
七段顯示電路
105 年試題電路
硬乙試題電路
104 年試題電路
ATMEGA8 主電路
103 與 105 年試題電路
102 年試題電路
16 位元擴充接腳
實驗板電源開關
『電腦硬體裝修乙級』區塊功能介紹:
1. 左上電路同電腦硬體裝修乙級術科第一站試題要求,請配合使用『
硬乙試場版本 IC
』
,利用 VB 控制 16 顆 LED,更詳細介紹可參閱台科大圖書的『電
腦硬體裝修乙級術科(乾龍工作室)』著作說明。
P10 與 P11
需套上短路套,其餘不接(僅套上單排,避免短路套遺失),並僅開啟
SW10
電源開關。
2. 若沒有連接電腦可利用『
硬乙自動測試 IC
』直接進行硬體測試,一開始 LED 全亮,接著從 1~10 題依序進行測試,此 IC 不提供 USB 電腦連線。
3. 實驗板『電源電路』與『ATMEGA8 核心電路』
、
『電腦硬體裝修乙級』相關電路圖如下所示:
透過 P12、P13 可自行控制 16 位元裝
置,如 8*8 點矩陣、七段顯示器、LCD
『102 年度工科技藝競賽電腦修護第二題試題』區塊功能介紹:
1. 主要是控制
8x32 單色 LED 廣告燈陣列與 2 個按鈕輸入按鈕開關 B0 與 B1
,由於電腦硬體裝修乙級 ATMEGA8 原始內容與 USBIO.DLL 都沒有做輸入控
制設計,所以須搭配使用『
102 電腦修護 IC
』與
USBHIO.dll
檔案進行測試。使用時
P21 與 P22 與 P23
需套上短路套,其餘不接(僅套上單排,避免短
路套遺失),並僅開啟
SW20
電源開關。
2. 四顆 74138 解碼器是用來進行 8x32 廣告燈矩陣
掃描
,再透過 U22 的 74244
傳送資料
,而 U21 的 74273 僅單獨用 VB 來控制 8 顆紅色 LED 亮滅,和
8x32 廣告燈完全
無關
。
3.
當沒接上電腦
,8 顆紅色 LED
全亮
,點矩陣 LED 顯示『23:59』,
分別按下
B0 與 B1 點矩陣會顯示不同內容,
同時按下
B0 與 B1 點矩陣會顯示試題指
定的 LOGO 動畫。
4.
當接上電腦
,8 顆紅色 LED 全滅,點矩陣 LED 顯示系統時間,分別按下 B0 與 B1 點矩陣會顯示不同內容,但和之前內容不同,同時按下 B0 與 B1,
點矩陣會顯示試題指定的 LOGO 動畫,只要按下任意按鈕,電腦亦要同步顯示對應的文字訊息。
5. 按下表單視窗的『Red LED』按鈕,8 顆紅色 LED 與表單○○○○○○○○須同步顯示試題指定的 LED 動態效果。
6. 更詳細功能說明請參閱光碟『102 年度電腦修護-術科 2 公告試題.pdf』
。
7. 在電腦硬體裝修乙級的 VB 透過 USB 介面傳輸控制,透過示波器量測約
mS
為單位,掃描速度太慢,所以僅能控制 8*8 點矩陣,否則
閃爍太嚴重
,
那為何電腦修護技藝競賽試題可以,那是因為掃描與傳送資料均利用 ATMEGA8 撰寫韌體程式
直接控制
,VB 僅是傳送欲顯示的相關訊息而已。
『103 年度工科技藝競賽電腦修護第二題試題』區塊功能介紹:
1. 103 年度工科技藝競賽第二站試題主要是控制
LCD 與 3*4 鍵盤掃描
,由於電腦硬體裝修乙級 ATMEGA8 原始內容與 USBIO.DLL 都沒有做輸入控制設計,
所以須搭配使用『
103 電腦修護 IC
』與
USBHIO.dll
檔案進行測試。使用時
P32 與 P33 與 P34
需套上短路套,其餘不接(僅套上單排,避免短路套遺失),
並僅開啟
SW30
電源開關。
2.
當沒接上電腦
,LCD 模組顯示『歡迎畫面』,左側圖形(需自行設定產生)每秒亮 0.5 秒,再滅 0.5 秒。右側上面顯示『WELCOME』字型,下面顯示
3 位數字由『001』至『105』向上計數,每 0.5 秒增加數字 1,到達『105』後,再由『001』開
始向上計數,循環顯示。按下介面卡『0』
、
『1』
、
『2』
、
『3』
、
『4』
、
『5』
、
『6』
、
『7』
、
『8』
、
『9』
、
『*』、
『#』鍵,對應 LCD 模組顯示該按鍵內容。同時按住介面卡『*』與『#』鍵 ,再放開雙鍵,LCD
顯示『Time HH:MM:SS』。
3.
當接上電腦
,LCD 顯示系統時間,按下介面卡『1』
、
『2』
、
『3』
、
『4』
、
『5』
、
『6』
、
『7』
、
『8』
、
『9』
、
『0』
、
『#』鍵,電腦畫面顯示『Output 250 Hz Signal』、
『Output 500 Hz Signal』
、
『Output 1000 Hz Signal』,並同時於介面卡『OUT』紅色輸出端點,產生
『250 Hz』、『500 Hz』、『1000 Hz』方波,頻率誤差正負 10%以內,按下介面卡『1』、『2』、『3』、
『4』、『5』、『6』、『7』、『8』、『9』、『0』、『#』鍵,電腦畫面『Key』欄位及 LCD 右下角分別對應
顯示『1』、『2』、『3』、『4』、『5』、『6』、『7』、『8』、『9』、『0』、『#』字元。
5. 部分電腦若無法偵測到此 USB 裝置,請先利用光碟安裝『
Intel(R)_USB_3.0_eXtensible_Host_Controller_Driver
』方可正常使用。
6. 『103 年電腦修護』公告試題電路圖如下:
『104 年度工科技藝競賽電腦修護第二題試題』區塊功能介紹:
1. 104 年度工科技藝競賽第二站試題主要是控制
8 顆串列式全彩 RGB LED 與 8 個按鈕輸入開關
(未用鍵盤掃描技巧),以及可變電阻 VR,由於電腦硬體
裝修乙級 ATMEGA8 原始內容與 USBIO.DLL 都沒有做輸入控制設計,所以須搭配使用『
104 電腦修護 IC
』與
USBHIO.dll
檔案進行測試。使用時
P40 與
P41
需套上短路套,其餘不接(僅套上單排,避免短路套遺失),並僅開啟
SW40
電源開關。
2.
當沒接上電腦
,8 顆 RGB LED 全亮,顯示『指定顏色畫面』,色階亮度最大。按下 USB 介面卡『S1』、『S2』、『S3』、『S4』、『S5』、『S6』、『S7』、『S8』
鍵,對應 RGB LED 顯示變為
黑色
,再按同一鍵,則恢復原指定顏色,而可變電阻 VR 暫時
無法測試使用
。
註:
實驗板 8 顆 RGB LED 與 8 顆按鈕配置順序和實際公告試題的電路圖順序左右相反
,要特別留意。
3.
當接上電腦
,USB 介面卡應立即改變 SA_LED1 至 SA_LED8 皆為黑色,按下『Red』按鈕,電腦畫面顯示 D1 為紅色,於 USB 介面卡 SA_LED1 立即
反應改變,每 0.5 秒移動向左一格至 D8,最後 D1 至 D8 皆為黑色。按下『Color DEMO』按鈕,顯示『變化彩色畫面』,USB 介面卡由全黑色,每
一彩色階亮 0.05 秒,再增加亮度數值,色階亮度由 0 至 255,循環顯示。按下『ALL OFF』按鈕,於 USB 介面卡 D1 至 D8 皆為黑色。
4.
當接上電腦
,按下 USB 介面卡『S1』、『S2』、『S3』、『S4』、『S5』、『S6』、『S7』、『S8』鍵,對應 RGB LED 顯示變為黑色,再按同一鍵,則由黑色重新
由 0 開始每一彩色階亮 0.05 秒,再增加亮度數值,色階亮度由 0 至 255,循環顯示。
5.
當接上電腦
,按下『ADC ON』按鈕,逆時針方向調整可變電阻,讀取 ADC in 最小值,將該數值輸入『Lx』欄位,順時針方向調整可變電阻,讀取
ADC in 最大值,將該數值輸入『Ux』欄位。逆時針方向調整可變電阻到底,則 ADC out 對應修正後之輸出最小值,本例為 0;再順時針方向調整可
變電阻到底,ADC out 對應修正後之輸出最大值,本例為 1023。另外,ADC Code 對應輸出值為 0 至 255,並將此值傳送至 USB 介面卡,控制亮度。
6. 更詳細功能說明請參閱光碟『104 年度電腦修護-術科 2 公告試題.pdf』
。
7. 『104 年電腦修護』公告試題電路圖如下:
8. 『104 年電腦修護』實驗板相關實際電路圖如下:
註:
實驗板 8 顆 RGB LED 與 8 顆按鈕順序和實際公告試題的電路圖順序相反
。
9. 串列式全彩 RGB LED 傳輸方式有兩種,如上方右圖所示,第一種是分別送出 GRB 順序(本電路採用),另一種順序是 RGB,拿到材料應先確認,由於
每位元傳送時間都有規定,且單位時間是 µS,若要用 VB 透過 USB 介面控制,因為單位僅 mS,故無法直接使用,因此,一定要在 ATMEGA8 撰寫韌
體程式直接控制 RGB LED 方可。
『105 年度工科技藝競賽電腦修護第二題試題』區塊功能介紹:
1. 105 年度工科技藝競賽第二站試題主要是控制
LCD 與 3*3 鍵盤
掃描(橫式)、全彩 RGB LED、蜂鳴器
,其中 LCD 與 3*3 鍵盤是
共用 103 年試題 3*4 鍵盤,但今年試題鍵盤僅剩 9 個按鍵,所
以是使用下半部鍵盤代替 K1~K7 與*、#,如右下角圖所示,因
此,原標示按鍵 4 相當於 K1 鍵、按鍵 0 相當於 K7 鍵,注意
P33 短路套的 PC0 不可以接上,而是自行利用跳線將 PC0 改接
到右上 P50 的蜂鳴器
,
P34 短路套的 PD0 不可以接上,而是自
行利用跳線接到右上角 P50 單顆的全彩 RGB LED
。
2. 由於電腦硬體裝修乙級 ATMEGA8 原始內容與 USBIO.DLL 都沒有
做輸入控制設計,所以須搭配使用『
105 電腦修護 IC
』與
USBHIO.dll
檔案進行測試。使用時
P32 與 P33(PC0 不接)與
P34(PD0 不接)
需套上短路套,其餘不接(僅套上單排,避免短
路套遺失),同時須開啟
SW30 與 SW50
電源開關,若 SW50 電
源開關沒有打開,則單顆全彩 LED 不亮。
3.
當沒接上電腦
,LCD 模組顯示『歡迎畫面』,中央圖形需自行
設定產生。右側上面顯示『ST:XX』字型,XX 表示崗位號碼 (此
例為 98)。按下 USB 介面卡『1』
、
『2』
、
『3』
、
『4』
、
『5』
、
『6』、
『7』、『*』、『#』鍵,對應蜂鳴器發出指定頻率聲音,以示波
器連接 Test Point『指定焊接點』測量波形(頻率容許正負誤差
10%)、SA_LED 顯示『指定顏色』、LCD 顯示『指定畫面』,如
下所示。同時按下 USB 介面卡『*』與『#』雙鍵,蜂鳴器發出 440Hz『指定頻率』聲音,以示波器連接 Test Point『指定焊接點』測量波形(頻率容
許正負誤差 10%)。
4.
當接上電腦
,LCD 模組顯示『歡迎畫面』程式執行後,USB 介面卡蜂鳴器不發出聲音,SA_LED 不亮,LCD 顯示『指定畫面』
。依序按下 『K1』
、
『K2』、
『K3』、『 K4』、『K5』、『K6』、『K7』按鈕,對應 USB 介面卡立即改變 SA_LED 顯示顏色,LCD 顯示『指定畫面』,蜂鳴器發出『指定頻率』聲音,持
續 0.5 秒自動停止發出聲音,並將 LCD 返回上一顯示畫面。將 USB 介面卡連接線拔除,電腦畫顯示『中空』,再插回 USB 連接線,不需按鍵盤任何
或滑鼠動作,電腦畫面應自回復拔除前狀態。
。
6. 『105 年電腦修護』公告試題電路圖如下:
『七段顯示器(共陽)』區塊功能介紹:
1. 七段顯示器雖然目前並沒出現電腦修護職種,但對於初學者仍是必學元件之一,從單一顆七段顯示器,到四顆七段顯示器,學習利用掃描同時顯示。
2. 使用時,在
P52 需套上短路套,用來連接 a~g
,其餘不接(僅套上單排,避免短路套遺失),各 COM 共用腳連接需自行使用跳線,連接方式是
DD 接
P22 的 PC4、dig3 接 PC3、dig2 接 PC2、dig1 接 PC1、dig0 接 PC0
,並僅開啟
SW50
電源開關。搭配使用『
七段顯示器 IC
』
,不用連接電腦直接進行測
試,當打開電源會直接動態顯示目前開機的持續時間,為方便觀察,時間會稍微加速顯示。 (註:單顆全彩 LED 因並接電源,所以會持續點亮)
『利用電腦硬體修乙級試場提供的 IC 練習』區塊擴充功能介紹:
上述資料均以歷年『工科技藝競賽電腦修護』職種試題為主,由於 ATMEGA8 韌體程式撰寫已經超過高職課綱範圍,也並非每位同學都要參加,所
以接下來是利用電腦硬體裝修乙級第一站試題『
硬乙試場版本 IC
』
,搭配『
USBIO.dll
』
,透過 VB 來進行相關輸出 I/O 控制,但在這練習之前,務必先徹
底了解電腦硬體裝修乙級第一站試題程式碼,保留原 Form1 表單,然後在右上專案視窗再新增 Form2 新表單,如左下圖,利用『
專案→Project1 屬性
→一般頁籤→啟動物件選擇 Form2
』
,如右下圖,讓程式一開始執行變成是先從 Form2 主表單開始,此範例原始檔案均蒐錄於光碟內,提供同學參考。
其實光這 16 顆 LED 就可以讓學生練習許久,透過 P13 的 74244 三態閘與 P12 的 74273 D 型正反器控制 16 位元的輸出,需融會貫通而非死背程式
碼而已,請參閱第 1~3 題範例,透過表單切換進行控制,簡易程式說明已加註於程式碼的註解中。
緊接著介紹是七段顯示器,實驗板為『
共陽
』連接方式,a~g 接 0 會亮,而共用腳是透過 AO4801(30V P-Channel MOSFET IC)驅動,當 V
GS為負才會
導通,因為 Vs 已經接到 5V,所以 dig0~3 也是接 0(V
GS<0) LED 才會亮,這要特別留意。因為 P12 的 74273 為 D 型正反器,可以鎖定資料,所以
P12 的
pin1~8 須使用跳線對應連接七段顯示器 P52 的 A~G 與 DP
(註:留意 P12 的 pin1 是在右邊,而 P52 的 A 靠左邊),而 P13 的 74244 是三態閘,無法鎖定資
料,僅適於當作掃描信號,須使用跳線將
P13 的 pin9~12 分別對應連接 P51 的 dig0~3 共用腳
。使用時
P10 與 P11
需套上短路套,而 P52 不可套上短路
套,上排需接到 P12,並僅開啟
SW10 與 SW50(所以全彩 LED 也會點亮)
電源開關,P12 與 P13 共可以控制 16 位元輸出裝置。
理論 AO4801 當 V
GS為負才會導通,而 Vs 已經接到 5V,所以 dig0~3 也是接 1(V
GS=0) LED 應該不會亮,但在實際測試中,會變成『微暗』現象,造
成在掃描時一直看到 8888,如右下圖所示,解決方式是將 RP10 排阻的共用腳增加開關(左下圖右側開關),當在掃描七段時,應將原本硬乙 16 顆 LED
關閉方可正常使用,但其他控制直接開啟即可,因為沒使用 AO4801 的 MOSFET,由於七段顯示器和單顆全彩 LED 共用電源,所以 WS2812B 會保持恆亮。
使用 8*32 在電腦硬體裝修乙級的 VB 透過 USB 介面傳輸
控制,透過示波器量測約 mS 為單位,掃描速度太慢,所以
僅能控制 8*8 點矩陣,否則閃爍太嚴重,那為何電腦修護技
藝競賽試題可以,那是因為掃描與傳送資料均利用 ATMEGA8
撰寫韌體程式直接控制,VB 僅是傳送欲顯示的相關訊息而
已。由於 P12 的 74273 為 D 型正反器,可以鎖定資料,所以
連接方式是使用跳線將
P22 上排的 S0~S6 對應連接到 P12 的
pin1~7 當作掃描
(註:留意 P12 的 pin1 是在右邊,而 P22 的
S0 靠左邊),而 P13 的 74244 是三態閘,無法鎖定資料,當
作資料須後送,並使用跳線將
P13 的 pin9~12 分別對應連接
P21 上排的 yD0~YD7 傳送資料
(註:留意 P13 的 pin1 是在右
邊,而 P21 的 yD0 靠左邊)。使用時
P23
需套上短路套,讓
U22 的 74244 致能腳 OE2 動作,而 P21 與 P22 不可套上短路
套,接到 P12 與 P13,並僅開啟
SW10 與 SW20
電源開關,
相關電路圖請參閱 102 年歷屆試題。
註:廣告燈字型碼可利用光碟內的『
點矩陣字型程式碼複製專用.xlsx
』
,填入 1 代表亮,且變為紅色背景,然後直接複製整列程式碼於 VB 即可。
接著介紹 Buzzer
蜂鳴器,透過不同脈波寬度與頻率產生不同聲響,連接方式是將
P50 的 Buzzer 接到 P52 的 AD0~AD7 任意一隻腳,並僅開啟
SW50(所
以全彩 LED 也會點亮)
電源開關,否則無法發出聲音,連接方式請參閱左下圖。
最後介紹 LCD 模組,初始設定操作請自行參閱相關書籍,由於 74244 無法鎖定資料,所以在此建議僅使用 74273(P12)即可,
DB7~DB4 利用跳線接
到 P12 的 pin8~pin5,而 RS、R/W、EN 三個控制信號分別接到 P12 的 pin3~pin1
,並僅開啟
SW10 與 SW30
電源開關,連接方式請參閱右上圖。由於僅
透過 4 位元傳輸,所以當要傳送資料時,要先送出最高 4 位元,然後再送出最低 4 位元方可,而 RS、R/W、EN 三個控制信號的設定方式也需了解才能
控制 LCD。
Form2 程式碼如下:
Dim c, no, b(99), n(4) As Integer
Dim d7(99, 1), scan7(3) As Integer '七段顯示器使用
Dim scan(32), e(32), d(10, 4) As Integer '8*8 廣告燈使用
Dim code, data As Integer 'LCD 使用
Private Sub Command1_Click(Index As Integer) '第 1~3 題
ex.Caption = Index '技巧,隱藏的標籤,讓另一表單也可以知道是按哪一個按鈕
Timer5.Interval = 0: Timer6.Interval = 0: Timer7.Interval = 0: Timer8.Interval = 0 If Index = 0 Then Form1.Timer1.Interval = 1000: Form1.Show
If Index = 1 Then Form1.Timer1.Interval = 200: Form1.Show If Index = 2 Then Form1.Timer2.Interval = 200: Form1.Show End Sub
Private Sub Command4_Click() '第 4 題:七段顯示器同時顯示 8888 數字
Timer5.Interval = 0: Timer6.Interval = 0: Timer7.Interval = 0: Timer8.Interval = 0 If OpenUsbDevice(&H1234, &H6789) Then
OutDataCtrl 0, 32 OutDataCtrl 0, 48 OutDataCtrl 0, 0 End If
End Sub
Private Sub Command5_Click() '第 5 題:七段顯示器同時每隔 1 秒依序顯示 0-9
c = 0
Timer5.Interval = 1000: Timer6.Interval = 0: Timer7.Interval = 0: Timer8.Interval = 0 End Sub
Private Sub Timer5_Timer() '第 5 題:七段顯示器同時每隔 1 秒依序顯示 0-9 數
If OpenUsbDevice(&H1234, &H6789) Then OutDataCtrl b(c), 32 OutDataCtrl b(c), 48 OutDataCtrl 0, 0 c = (c + 1) Mod 10 End If End Sub
Private Sub Command6_Click() '第 6 題:七段顯示器固定顯示『2468』數字,需
利用掃描
c = 0
Timer5.Interval = 0: Timer6.Interval = 10: Timer7.Interval = 0: Timer8.Interval = 0 End Sub
Private Sub Timer6_Timer() '第 6 題:七段顯示器固定顯示『2468』數字,需利用
掃描
display = "8642" '要相反,程式較易撰寫
If OpenUsbDevice(&H1234, &H6789) Then
OutDataCtrl b(Mid(display, c + 1, 1)), 32 '74273D 型正反器資料先送,因為可 LATCH OutDataCtrl b(Mid(display, c + 1, 1)), 48 OutDataCtrl scan7(c), 0 '再送出掃描信號 c = c + 1 If c = 4 Then c = 0 End If End Sub
Private Sub Command7_Click() '第 7 題:七段顯示器顯示 0000~9999,隨時可跳出
c = 0
Timer5.Interval = 0: Timer6.Interval = 0: Timer7.Interval = 10: Timer8.Interval = 0 End Sub
Private Sub Timer7_Timer() '第 7 題:七段顯示器顯示 0000~9999
If OpenUsbDevice(&H1234, &H6789) Then c = c + 1 no = c n(0) = b(no Mod 10) '個位數 no = no \ 10 n(1) = b(no Mod 10) '十位數 no = no \ 10 n(2) = b(no Mod 10) '百位數 no = no \ 10 n(3) = b(no Mod 10) '千位數 For j = 1 To 10 For k = 0 To 3
OutDataCtrl n(k), 32 '可省略 OutDataCtrl n(k), 48 '74273D 型正反器資料先送,因為可 LATCH OutDataCtrl scan7(k), 0 '再送出掃描信號 delay (10) Next k Next j OutDataCtrl 0, 32 OutDataCtrl 0, 48 OutDataCtrl 0, 0 End If End Sub
Private Sub Command8_Click() '第 8 題:七段顯示器每隔 0.2 秒顯示口字動畫
c = 0
Timer5.Interval = 0: Timer6.Interval = 0: Timer7.Interval = 0: Timer8.Interval = 200 End Sub
Private Sub Timer8_Timer() '七段顯示器每隔 0.2 秒顯示口字動畫
If OpenUsbDevice(&H1234, &H6789) Then
OutDataCtrl d7(c, 0) + 128, 48 '74273D 型正反器資料先送,因為可 LATCH
OutDataCtrl d7(c, 1), 0 '再送出掃描信號
c = (c + 1) Mod 12 '因為 口 有 12 個狀態
End If End Sub
Private Sub Command9_Click() '第 9 題:8*8 點矩陣顯示 8*8 自訂圖案
If OpenUsbDevice(&H1234, &H6789) Then
For kk = 0 To 60 '決定停留時間長度
For i = 9 To 17 'i = 0 To 31 顯示全部圖形,但因為掃描太慢,無法造成視覺暫
留,若改 i = 9 To 18 可看到第二個圖形,會有閃爍是正常
OutDataCtrl 0, 32 '由於 scan 是透過 74138 解碼電路,所以必須先送,並透
過 74273 鎖住資料
OutDataCtrl scan(i), 48 '先送接點矩陣 scan
OutDataCtrl e(i), 0 '再送接點矩陣資料,兩者若相反,雜訊較大
Next i Next End If End Sub
Private Sub Command10_Click() '第 10 題:8*8 廣告燈每隔約 1 秒依序顯示 0~9 數
字,會有閃爍是正常
If OpenUsbDevice(&H1234, &H6789) Then For kk = 0 To 9
For i = 0 To 15 For h = 0 To 4
OutDataCtrl 0, 32 '由於 scan 是透過 74138 解碼電路,所以必須先送,並透
過 74273 鎖住資料
OutDataCtrl scan(h), 48 '先送接點矩陣 scan
OutDataCtrl d(kk, h), 0 '再送接點矩陣資料,兩者若相反,雜訊較大 Next h Next i Next kk End If End Sub
Private Sub Command11_Click() '第 11 題:Buzzer 蜂鳴器發出三種聲音,Buzzer
接 AD0~AD7 任意一隻
If OpenUsbDevice(&H1234, &H6789) Then
R1 = 25 '發出第一種方波音調 R2 = 1 For i = 0 To R1 For j = 0 To R2 OutDataCtrl 0, 0 '送出低準位信號 Next j For j = 0 To R2 OutDataCtrl 255, 0 '送出高準位信號 Next j Next i R1 = 25 '發出第二種方波音調 R2 = 10 For i = 0 To R1 For j = 0 To R2 OutDataCtrl 0, 0 '送出低準位信號 Next j For j = 0 To R2 OutDataCtrl 255, 0 '送出高準位信號
Next j Next i R1 = 25 '發出第三種方波音調 R2 = 25 For i = 0 To R1 For j = 0 To R2 OutDataCtrl 0, 0 '送出低準位信號 Next j For j = 0 To R2 OutDataCtrl 255, 0 '送出高準位信號 Next j Next i End If End Sub
Private Sub Command12_Click() '第 12 題:LCD 顯示"Hello LCD"+今天日期
'四位元 LCD 初始狀態
wrins (&H30): delay (50) wrins (&H30): delay (10) wrins (&H30): delay (10) wrins (&H20): delay (10) wrins (&H20): delay (10) wrins (&H80): delay (10)
wrins (&H0): wrins (&H80) '令顯示器 OFF
wrins (&H0): wrins (&H10) '清除顯示
wrins (&H0): wrins (&H60) '令顯示器 ON,但游標不顯示
wrins (&H0): wrins (&HC0) '令 LCD 每收到 1BYTE 後,AC 值自動加 1
wrins (&H80) '游標移動到第 1 行,第 1 個字
wrins (&H0) '因為是四位元傳輸,所以游標位置要分兩次傳送
dd = "Hello LCD Module" For i = 1 To Len(dd)
wrdata (Val(Asc(Mid(dd, i, 1)))) '顯示 Hello LCD 字串內容
Next i
wrins (&HC0) '游標移動到第 2 行,第 1 個字
wrins (&H0) '因為是四位元傳輸,所以游標位置要分兩次傳送
dd = "DATE:" & Str(Date) For i = 1 To Len(dd)
wrdata (Val(Asc(Mid(dd, i, 1)))) '顯示今天日期
Next i End Sub
Private Sub wrins(code As Integer) 'LCD 使用,把『指令碼』送入 LCD
If OpenUsbDevice(&H1234, &H6789) Then OutDataCtrl 0, 32 'RS=0、RW=0、EN=0
OutDataCtrl 0, 48 'RS=0、RW=0、EN=0
OutDataCtrl 1, 32 'RS=0、RW=0、EN=1
OutDataCtrl 1, 48 'RS=0、RW=0、EN=1
OutDataCtrl code + 1, 32
OutDataCtrl code + 1, 48 '加 1 是因為 RS=0、RW=0、EN=1
OutDataCtrl 0, 32 'RS=0、RW=0、EN=0
OutDataCtrl 0, 48 'RS=0、RW=0、EN=0
End If End Sub
Private Sub wrdata(data As Integer) 'LCD 使用,把『資料』送入 LCD
If OpenUsbDevice(&H1234, &H6789) Then OutDataCtrl 4, 32 'RS=1、RW=0、EN=0 OutDataCtrl 4, 48 'RS=1、RW=0、EN=0 OutDataCtrl 5, 32 'RS=1、RW=0、EN=1 OutDataCtrl 5, 48 'RS=1、RW=0、EN=1 OutDataCtrl (data \ 16) * 16 + 5, 32
OutDataCtrl (data \ 16) * 16 + 5, 48 'RS=0、RW=0、EN=0,先送高 4 位元資料
OutDataCtrl 4, 32 'RS=1、RW=0、EN=0 OutDataCtrl 4, 48 'RS=1、RW=0、EN=0 OutDataCtrl 4, 32 'RS=1、RW=0、EN=0 OutDataCtrl 4, 48 'RS=1、RW=0、EN=0 OutDataCtrl 5, 32 'RS=1、RW=0、EN=1 OutDataCtrl 5, 48 'RS=1、RW=0、EN=1
OutDataCtrl (data Mod 16) * 16 + 5, 32 '加 5 是因為 RS=1、RW=0、EN=1
OutDataCtrl (data Mod 16) * 16 + 5, 48 'RS=0、RW=0、EN=0,後送低 4 位元資料
OutDataCtrl 4, 32 'RS=1、RW=0、EN=0
OutDataCtrl 4, 48 'RS=1、RW=0、EN=0
End If End Sub
For i = 0 To R For j = 0 To R Next j Next i End Sub
Private Sub Command0_Click() '離開
End End Sub
Private Sub Form_Load() scan7(0) = &HE scan7(1) = &HD scan7(2) = &HB scan7(3) = &H7 b(0) = 192 b(1) = 249 b(2) = 164 b(3) = 176 b(4) = 153 b(5) = 146 b(6) = 130 b(7) = 216 b(8) = 128 b(9) = 144 '七段顯示器顯示口字動畫 d7(0, 0) = 28 '上口 d7(0, 1) = scan7(0) d7(1, 0) = 28 '上口 d7(1, 1) = scan7(1) d7(2, 0) = 28 '上口 d7(2, 1) = scan7(2) d7(3, 0) = 28 '上口 d7(3, 1) = scan7(3) d7(4, 0) = 35 '下口 d7(4, 1) = scan7(3) d7(5, 0) = 35 '下口 d7(5, 1) = scan7(2) d7(6, 0) = 35 '下口 d7(6, 1) = scan7(1) d7(7, 0) = 35 '下口 d7(7, 1) = scan7(0) d7(8, 0) = 28 '上口 d7(8, 1) = 0 d7(9, 0) = 35 '下口 d7(9, 1) = 0 d7(10, 0) = 28 '上口 d7(10, 1) = 0 d7(11, 0) = 35 '下口 d7(11, 1) = 0 '8*8 廣告燈使用的字型,請配合光碟『點矩陣字型程式碼複製專用.xlsx』檔案 d(0, 0) = 126: d(0, 1) = 129: d(0, 2) = 129: d(0, 3) = 129: d(0, 4) = 126: d(1, 0) = 0: d(1, 1) = 130: d(1, 2) = 255: d(1, 3) = 128: d(1, 4) = 0: d(2, 0) = 194: d(2, 1) = 161: d(2, 2) = 145: d(2, 3) = 137: d(2, 4) = 134: d(3, 0) = 65: d(3, 1) = 129: d(3, 2) = 137: d(3, 3) = 149: d(3, 4) = 99: d(4, 0) = 56: d(4, 1) = 36: d(4, 2) = 34: d(4, 3) = 255: d(4, 4) = 32: d(5, 0) = 79: d(5, 1) = 137: d(5, 2) = 137: d(5, 3) = 137: d(5, 4) = 113: d(6, 0) = 124: d(6, 1) = 146: d(6, 2) = 145: d(6, 3) = 145: d(6, 4) = 96: d(7, 0) = 1: d(7, 1) = 1: d(7, 2) = 249: d(7, 3) = 5: d(7, 4) = 3: d(8, 0) = 102: d(8, 1) = 153: d(8, 2) = 145: d(8, 3) = 153: d(8, 4) = 102: d(9, 0) = 6: d(9, 1) = 137: d(9, 2) = 137: d(9, 3) = 73: d(9, 4) = 62: d(10, 0) = 0: d(10, 1) = 102: d(10, 2) = 102: d(10, 3) = 0: d(10, 4) = 0
e(0) = 63: e(1) = 161: e(2) = 225: e(3) = 225: e(4) = 225: e(5) = 225: e(6) = 161: e(7) = 63: e(8) = 0: e(9) = 6: e(10) = 5: e(11) = 9: e(12) = 145: e(13) = 225: e(14) = 225: e(15) = 145: e(16) = 9: e(17) = 5: e(18) = 6: e(19) = 0: e(20) = 192: e(21) = 192: e(22) = 248: e(23) = 136: e(24) = 143: e(25) = 129: e(26) = 143: e(27) = 136: e(28) = 248: e(29) = 192: e(30) = 192: e(31) = 0
scan(0) = 8: scan(1) = 9: scan(2) = 10: scan(3) = 11: scan(4) = 12: scan(5) = 13: scan(6) = 14: scan(7) = 15: scan(8) = 16: scan(9) = 17: scan(10) = 18: scan(11) = 19: scan(12) = 20: scan(13) = 21: scan(14) = 22: scan(15) = 23: scan(16) = 32: scan(17) = 33: scan(18) = 34: scan(19) = 35: scan(20) = 36: scan(21) = 37: scan(22) = 38: scan(23) = 39: scan(24) = 64: scan(25) = 65: scan(26) = 66: scan(27) = 67: scan(28) = 68: scan(29) = 69: scan(30) = 70: scan(31) = 71
c = 0 End Sub
Form1 程式碼如下:
Dim a, b(99), c As Integer
Private Sub Command1_Click(Index As Integer) a = Index
c = 0 End Sub
Private Sub display(no) For i = 0 To 7
If no Mod 2 = 1 And a = 1 Then G(i).FillColor = RGB(0, 255, 0) If no Mod 2 = 1 And a = 2 Then R(i).FillColor = RGB(255, 0, 0) no = no \ 2
Next i End Sub
Private Sub Timer1_Timer() b(0) = &H18
b(1) = &H24 b(2) = &H42 b(3) = &H81
Label1.Caption = vbCrLf & "Current Time:" & Time$ For i = 0 To 7
G(i).FillStyle = 1 R(i).FillStyle = 1 Next i
If OpenUsbDevice(&H1234, &H6789) Then
For i = 0 To 7 G(i).FillColor = RGB(0, 128, 0) R(i).FillColor = RGB(128, 0, 0) G(i).FillStyle = 0 R(i).FillStyle = 0 Next i OutDataCtrl 0, 0 OutDataCtrl 0, 16
If Form2.ex.Caption = 0 And a = 1 Then OutDataCtrl b(c), 0: display (b(c)) '第 1 題
If Form2.ex.Caption = 0 And a = 2 And c <= 7 Then '第 1 題
OutDataCtrl 2 ^ c, 32 OutDataCtrl 2 ^ c, 48 display (2 ^ c) End If
If Form2.ex.Caption = 1 Then '第 2 題,由於 74273 可以鎖定資料,紅色 LED 一
定要先亮,方可同時亮
OutDataCtrl 2 ^ (7 - c), 32 OutDataCtrl 2 ^ (7 - c), 48 no = 2 ^ (7 - c)
For i = 0 To 7
If no Mod 2 = 1 Then R(i).FillColor = RGB(255, 0, 0) no = no \ 2
Next i
OutDataCtrl 2 ^ c, 0 no = 2 ^ c
For i = 0 To 7
If no Mod 2 = 1 Then G(i).FillColor = RGB(0, 255, 0) no = no \ 2
Next i End If End If
If a = 3 Then CloseUsbDevice: a = 99: Timer1.Interval = 0: Unload Me If Form2.ex.Caption = 0 Then If c > 15 Then c = 15 Else c = c + 1 End If
End If
If Form2.ex.Caption = 1 Then c = (c + 1) Mod 8 End Sub
Private Sub Timer2_Timer() If Form2.ex.Caption = 2 Then
Label1.Caption = vbCrLf & "Current Time:" & Time$ For i = 0 To 7
G(i).FillStyle = 1 R(i).FillStyle = 1 Next i
If OpenUsbDevice(&H1234, &H6789) Then For i = 0 To 7 G(i).FillColor = RGB(0, 128, 0) R(i).FillColor = RGB(128, 0, 0) G(i).FillStyle = 0 R(i).FillStyle = 0 Next i OutDataCtrl 0, 0 OutDataCtrl 0, 16 If c <= 7 Then OutDataCtrl 2 ^ (7 - c), 0 no = (2 ^ (7 - c)) For i = 0 To 7
If no Mod 2 = 1 Then G(i).FillColor = RGB(0, 255, 0) no = no \ 2 Next i End If If c > 7 Then OutDataCtrl 2 ^ (15 - c), 32 OutDataCtrl 2 ^ (15 - c), 48 no = 2 ^ (15 - c) For i = 0 To 7
If no Mod 2 = 1 Then R(i).FillColor = RGB(255, 0, 0) no = no \ 2
Next i End If End If
If a = 3 Then CloseUsbDevice: a = 99: Timer2.Interval = 0: Unload Me
c = (c + 1) Mod 16 End If