喬廣欣,李亞峻*,李 松,楊 堃斌,于寶
(天津科技大學(xué)電子信息與自動化學(xué)院 天津300222)
LED點陣顯示系統(tǒng)不僅能夠靜態(tài)顯示字符和圖像,而且能夠動態(tài)顯示文字、動畫、視頻等信息,具有亮度高、壽命長、價格低、視角大等優(yōu)點,得到廣泛應(yīng)用。
常用的 LED 點陣顯示系統(tǒng)由微控制器、LED點陣顯示屏及其行列驅(qū)動電路組成。所用微控制器的種類有基于AVR單片機的ATmega128[1]和基于51單片機的 AT89C51[2]、基于 ARM 的以 Cortex-M0+為內(nèi)核的 KW01-Zigbee[3]和以 Cortex-M3為內(nèi)核的STM32F103[4]、基于 FPGA 的 Xilinx Virtex4 系列XC4VSX25[5]等。單片機與 ARM 的開發(fā)語言有匯編語言或C/C++語言,F(xiàn)PGA的開發(fā)語言有VHDL語言或 Verilog語言。本文用 VHDL語言編程,采用DIGILENT公司的便攜式 Basys2開發(fā)板,其上嵌有Xilinx Spartan-3E系列FPGA器件XC3S100E[6]。
16×16點陣有32個引腳,不適合直接與微控制器相連,占用太多的引腳資源。實際上常將譯碼器、串并轉(zhuǎn)換芯片組成行列驅(qū)動電路用于控制LED點陣顯示,常見的有用3-8譯碼器74HC138或4-16譯碼器 74HC154輪詢掃描點陣行,用移位寄存器74HC595鎖存點陣列數(shù)據(jù)[1,4]。本文選用74HC138與74HC595驅(qū)動的點陣模塊。
16×16點陣的每一行接LED燈的正極,每一列接 LED燈的負(fù)極。點陣的 16行 H1—H16由兩片74HC138組合控制,Hi=1時第 i行被選通;點陣的16列L1—L16由兩片74HC595級聯(lián)進行控制,Hi=1、Lj=0時,第i行第j列的LED燈被點亮。
74HC138是一個 3-8譯碼器,當(dāng)使能信號E3E2E1=100時,A2A1A0從 000到 111依次取值,使輸出端Y0—Y7依次輸出低電平[7]。如圖1所示,用2個74HC138組合能夠?qū)崿F(xiàn)4-16譯碼器,在輸出端外接三極管(圖 1中只示意性地畫了一個)可以驅(qū)動16×16點陣的點陣行 H1—H16(高電平有效)。始終使 G=0,當(dāng) D=0時,74HC138-1使能,CBA從 000到 111依次取值,H1至H8行依次被選通;當(dāng) D=1時,74HC138-2使能,CBA從000到111依次取值,H9至H16行依次被選通。
圖1 用74HC138控制點陣行Fig.1 Control of dot matrix row with 74HC138
74HC595是一個移位寄存器,可實現(xiàn)數(shù)據(jù)的串行輸入/8位并行輸出或者串行輸出[8]。如圖 2所示,將 74HC595-1的 SQH與 74HC595-2的 SI相連,也就是將兩片74HC595級聯(lián),可實現(xiàn)16位數(shù)據(jù)的并行輸出,用于控制16×16點陣的16列L1—L16。
圖2 用74HC595控制點陣列Fig.2 Control of dot matrix column with 74HC595
74HC595有三個重要的輸入引腳,SCK(數(shù)據(jù)輸入時鐘)、SI(數(shù)據(jù)輸入)、RCK(輸出鎖存時鐘),分別對應(yīng)于點陣模塊上的引腳名稱為 CLK、DATA、LATCH。它們的工作時序如圖 3所示,當(dāng)RCK為低電平時,從SI串行輸入的數(shù)據(jù)D0—D15在每個SCK的上升沿依次被載入移位寄存器。從第 8個 SCK的下降沿開始,數(shù)據(jù)將出現(xiàn)在74HC595-2的輸入端SI。連續(xù)輸入 16位數(shù)據(jù)后,在 RCK的上升沿 D0—D15被鎖存到輸出存儲器中,立即更新點陣列 L16—L1上的信息。
圖3 74HC595的時序圖Fig.3 Timing diagram of 74HC595
圖4點陣顯示驅(qū)動模塊 disp_dot16×16實現(xiàn)的是點陣行控制信號的產(chǎn)生、16位點陣列數(shù)據(jù)的存取與串行輸出。
圖4 點陣顯示驅(qū)動模塊Fig.4 Dot matrix display driver module
點陣列數(shù)據(jù)從 74HC595串行輸入。由于74HC595只有一個輸出存儲器,只能存儲一行數(shù)據(jù)。所以需要通過編程輪詢掃描點陣的 H1—H16行,同時在 L1—L16列輸入待顯示的信息,利用人眼的視覺暫存現(xiàn)象實現(xiàn)16×16點陣圖形的顯示。
點陣圖像的數(shù)據(jù)較多,適于用ROM或RAM存儲起來,然后用查找表的方式輸出。本設(shè)計直接調(diào)用Xilinx ISE軟件開發(fā)環(huán)境提供的ROM IP核(romip模塊) ,在其上存儲了一幅16×16點陣的圖像信息。在時鐘clk_row的上升沿,根據(jù)ctrl_addr模塊地址addr從romip模塊中讀取數(shù)據(jù)dout,地址addr自加1。
ctrl_addr模塊的地址 addr不僅控制點陣列數(shù)據(jù)的存取,還控制ctrl_dot模塊的點陣行選通信號dcba和點陣列數(shù)據(jù)data的更新。為了使74HC595正常工作,需要按照圖 3所示的工作時序編寫它的 VHDL控制程序,將16位并行數(shù)據(jù)data_line(15∶0)轉(zhuǎn)換為串行數(shù)據(jù)輸出給 data,同時產(chǎn)生 74HC595芯片所需的數(shù)據(jù)輸入時鐘clk_hc595和輸出鎖存時鐘latch,它們分別與 16×16點陣模塊的 DATA、CLK、LATCH端相連,如圖2所示。點陣行列控制器的VHDL程序段用如下if語句編程實現(xiàn)。
g<='0'; --選通 74HC138
if rising_edge(clk)then
if latch_tmp='1' then -- ①
clk_hc595<='0';
if(addr_l=addr_tmp)then
data_tmp <= data_line;
addr_tmp:=addr_tmp+1;
latch_tmp<='0';
shift_f<='1';
else
dcba<=addr_l-1;
end if;
else
if shift_f='1' then -- ②
clk_hc595<='0';
data<=data_tmp(0) ;
data_tmp(14 downto 0)<=data_tmp
(15 downto 1);
shift_f<='0';
else -- ③
clk_hc595<='1';
if cnt=X"F" then
latch_tmp<='1';
cnt:=X"0";shift_f<='0';
else
cnt:=cnt+1;shift_f<='1';
end if;
end if;
end if;
latch<=latch_tmp;
end if;
① 裝載新數(shù)據(jù)/選通點陣行。當(dāng) latch_tmp為 1時,使 clk_hc595為 0。當(dāng) addr_l與預(yù)設(shè)的 addr_tmp不一致時,說明地址未更新,點陣顯示上一行的信息,繼續(xù)檢測。當(dāng)檢測到addr_l與addr_tmp相同時,說明有新數(shù)據(jù)到來,將新數(shù)據(jù) data_line裝載到data_tmp;addr_tmp自加 1,準(zhǔn)備下一個數(shù)據(jù)的地址;使latch_tmp為0,移位標(biāo)志位shift_f置1。
② 16位數(shù)據(jù)串行輸出,先低位后高位。當(dāng)latch_tmp為 0時,如果 shift_f為 1,則將 16位并行數(shù)據(jù)的最低位輸出給 data,其他數(shù)據(jù)右移一位,實現(xiàn)數(shù)據(jù)從低位到高位的串行輸出;使 clk_hc595為 0,shift_f為 0。
③ 產(chǎn)生時鐘clk_hc595和輸出鎖存信號latch的上升沿。當(dāng)latch_tmp為0時,如果shift_f為0,則使clk_hc595由 0變?yōu)?1,每移一位數(shù)產(chǎn)生一個clk_hc595時鐘;當(dāng) cnt<15時,說明 16位數(shù)據(jù)未傳完,使cnt自加1,shift_f為1,在下一個clk時鐘的上升沿轉(zhuǎn)到②繼續(xù)串行輸出。當(dāng)計數(shù)器 cnt=15時,表明16位數(shù)據(jù)全部串行輸出完畢,使latch_tmp由0變?yōu)?1,產(chǎn)生輸出鎖存信號 latch的上升沿,鎖存數(shù)據(jù)。使cnt清零,shift_f為0,在下一個clk時鐘上升沿轉(zhuǎn)到①,等待下一次數(shù)據(jù)更新。
對工程進行綜合、實現(xiàn)、產(chǎn)生可編程文件,下載到Basys2開發(fā)板上,實現(xiàn)了如圖5所示的顯示效果。
圖5 16×16點陣顯示效果(津門)Fig.5 16×16 dot matrix display effect(Jinmen)
在存儲器中存入更多幅圖像信息,然后對地址模塊 ctrl_addr進行更復(fù)雜的編程控制,即可實現(xiàn)圖像的動態(tài)顯示,使一幅幅圖像切換顯示,使點陣顯示信息向左或向右移,等等。
本文著重介紹了點陣行列控制器的 VHDL程序設(shè)計,用 if嵌套語句編程實現(xiàn)了數(shù)據(jù)的存儲調(diào)用與串行輸出、控制 74HC138驅(qū)動點陣行選通、控制74HC595驅(qū)動點陣列,從而在點陣屏上顯示出預(yù)設(shè)的圖像信息。