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