張紹龍,趙 寧,丁建國,曹曉霞
(1.遷西縣氣象局,河北 唐山 064300;2.石家莊鐵道大學(xué) 經(jīng)濟管理學(xué)院,河北 石家莊 050043;3.石家莊鐵道大學(xué) 材料學(xué)院,河北 石家莊 050043;4.唐山市氣象局 科技服務(wù)中心,河北 唐山 063000)
設(shè)備驅(qū)動程序在Linux內(nèi)核中扮演著特殊的角色,它類似于一個獨立的黑盒子,使某個特定的硬件可以響應(yīng)一個良好的內(nèi)部編程接口,同時完成隱藏設(shè)備的工作。凡是操作系統(tǒng)控制的外部設(shè)備,即使是最簡單的硬件電路,也是需要驅(qū)動程序的。設(shè)備驅(qū)動程序在Linux里,除了直接修改系統(tǒng)的核心源代碼,把設(shè)備驅(qū)動程序加進(jìn)核心之外,還可以把設(shè)備驅(qū)動程序作為可加載的模塊,由系統(tǒng)管理員動態(tài)加載,使之成為核心的一部分。編寫驅(qū)動程序的主要工作就是編寫子函數(shù),并填充file_operations各個域。
此應(yīng)用程序是在LED驅(qū)動加載之后使用,否則無法正常運行。本設(shè)計首先將LED點陣驅(qū)動起來,通過編寫測試程序,使其能夠按照設(shè)定的意圖顯示。
圖1 LED點陣示意圖
LED顯示選用8×8發(fā)光二極管點陣,用于發(fā)布消息、顯示漢字的點陣式LED顯示屏通常由若干塊LED點陣顯示模塊組成,8×8顯示點陣模塊每塊有64個獨立發(fā)光二極管,為了減少引腳且便于封裝,各種LED顯示點陣模塊都采用陣列形式排布,即在行列線的交點處接有顯示LED,因此,LED點陣顯示模塊的顯示驅(qū)動只能采用動態(tài)驅(qū)動方式,每次最多只能點亮一行LED(共陽形式LED顯示點陣模塊)或一列LED(共陰形式LED顯示點陣模塊)。如圖1所示的顯示驅(qū)動原理圖中,點陣為共陰,由總線鎖存芯片74573為點陣顯示模塊提供列驅(qū)動電流,8個行信號則由集電極開路門驅(qū)動器7407控制,行線和列線都掛在總線上,微處理器可以通過總線操作來完成對每一個LED點陣顯示模塊內(nèi)每個LED顯示點的亮、暗控制。
當(dāng)對應(yīng)的某一列置1電平,某一行置0電平,則相應(yīng)的二極管就亮;控制一個燈亮需使某一列的置‘1’,其它行為‘0’,其余的都為‘1’;如第一行,第八列的燈亮,其它的都滅,則DR8,DR7,DR6,DR5,DR4,DR3,DR2,DR1為 11111110,OC8,OC7,OC6,OC5,OC4,OC3,OC2,OC1為10000000可實現(xiàn)相應(yīng)的燈亮。
在此設(shè)計中,整個LED顯示模塊是作為一個I/O進(jìn)行控制的,共16位輸入數(shù)據(jù),LED的鎖存信號由系統(tǒng)總線的寫信號和地址信號經(jīng)過簡單的組合邏輯而成,在板載的CPLD中完成??刂圃擄@示模塊的IO地址為0x08000000。
圖2 系統(tǒng)電路連接圖
編寫驅(qū)動程序?qū)崿F(xiàn)在Linux下控制LED點陣顯示,加載驅(qū)動程序后,顯示的效果是64位全亮。實驗步驟為打開終端窗口,利用ifconfig命令設(shè)置網(wǎng)絡(luò)設(shè)備,將宿主PC機的根目錄掛載到S3C2410-RP目標(biāo)板的mnt目錄下,而后通過insmod加載驅(qū)動程序,通過lsmod命令查看系統(tǒng)已經(jīng)加載好的驅(qū)動程序,最后運行測試程序。
可將DR8-DR1作為高8位和OC8-OC1作為低8位連接起來構(gòu)成16位二進(jìn)制數(shù),再將此數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)控制所有燈的滅與亮。例如上述的就可以用111111101000000來表示,對應(yīng)的十進(jìn)制數(shù)65152來控制燈亮。以下函數(shù)可實現(xiàn)點亮64個點:
Int moban[8]={1,2,4,8,16,32,64,128};
For(i=0;i<8;i++)
For(j=0;j<8;j++)
A[i][j]=256*(255-moban[i])+moban[j];
以此可求出控制每一個的相應(yīng)數(shù)字,就可以輸出任何一種圖形。采用一個循環(huán)實現(xiàn)控制控制點的移動;再分別設(shè)計豎柱的右移,行柱的下移,平面的右移,平面的下移,數(shù)字循環(huán)顯示等。每種顯示的方案如下:
(1)豎柱循環(huán)右移
采用moban[8]中的數(shù)字依次顯示可以實現(xiàn)豎柱的右移。
(2)行柱的下移
采用語句
for(i=0;i<8;i++)
Row[i]=256*(255-moban[i])+255;求出每一行的控制數(shù)字后讓它們依次顯示,就是行柱下移。
(3)平面右移
先點亮一列,再點亮兩列,依次增加,直至全亮,可實現(xiàn)平面右移的效果。采用語句
for(i=0;i<8;i++) MianR[i]=2i+1-1;
求出的八個數(shù)實現(xiàn)平面右移的數(shù)字。
(4)平面下移
同上,先點亮一行,再點亮兩行,依次增加,直到八行全亮。采用語句
for(i=0;i<8;i++)
MianD[i]=256*(255-(2i+1-1))+255;
求出八個數(shù)就是實現(xiàn)平面下移的數(shù)字。
(5)0-9的數(shù)字循環(huán)
同樣依照上述算法計算。
利用驅(qū)動程序?qū)崿F(xiàn)最基本的顯示,而后通過編寫測試程序?qū)崿F(xiàn)各種顯示,如果再進(jìn)一步完善,可以編寫QT設(shè)計簡單測試界面,在顯示屏上可以有更直觀的效果。