張紹龍,趙 寧,丁建國,曹曉霞
(1.遷西縣氣象局,河北 唐山 064300;2.石家莊鐵道大學 經濟管理學院,河北 石家莊 050043;3.石家莊鐵道大學 材料學院,河北 石家莊 050043;4.唐山市氣象局 科技服務中心,河北 唐山 063000)
設備驅動程序在Linux內核中扮演著特殊的角色,它類似于一個獨立的黑盒子,使某個特定的硬件可以響應一個良好的內部編程接口,同時完成隱藏設備的工作。凡是操作系統控制的外部設備,即使是最簡單的硬件電路,也是需要驅動程序的。設備驅動程序在Linux里,除了直接修改系統的核心源代碼,把設備驅動程序加進核心之外,還可以把設備驅動程序作為可加載的模塊,由系統管理員動態加載,使之成為核心的一部分。編寫驅動程序的主要工作就是編寫子函數,并填充file_operations各個域。
此應用程序是在LED驅動加載之后使用,否則無法正常運行。本設計首先將LED點陣驅動起來,通過編寫測試程序,使其能夠按照設定的意圖顯示。

圖1 LED點陣示意圖
LED顯示選用8×8發光二極管點陣,用于發布消息、顯示漢字的點陣式LED顯示屏通常由若干塊LED點陣顯示模塊組成,8×8顯示點陣模塊每塊有64個獨立發光二極管,為了減少引腳且便于封裝,各種LED顯示點陣模塊都采用陣列形式排布,即在行列線的交點處接有顯示LED,因此,LED點陣顯示模塊的顯示驅動只能采用動態驅動方式,每次最多只能點亮一行LED(共陽形式LED顯示點陣模塊)或一列LED(共陰形式LED顯示點陣模塊)。如圖1所示的顯示驅動原理圖中,點陣為共陰,由總線鎖存芯片74573為點陣顯示模塊提供列驅動電流,8個行信號則由集電極開路門驅動器7407控制,行線和列線都掛在總線上,微處理器可以通過總線操作來完成對每一個LED點陣顯示模塊內每個LED顯示點的亮、暗控制。
當對應的某一列置1電平,某一行置0電平,則相應的二極管就亮;控制一個燈亮需使某一列的置‘1’,其它行為‘0’,其余的都為‘1’;如第一行,第八列的燈亮,其它的都滅,則DR8,DR7,DR6,DR5,DR4,DR3,DR2,DR1為 11111110,OC8,OC7,OC6,OC5,OC4,OC3,OC2,OC1為10000000可實現相應的燈亮。
在此設計中,整個LED顯示模塊是作為一個I/O進行控制的,共16位輸入數據,LED的鎖存信號由系統總線的寫信號和地址信號經過簡單的組合邏輯而成,在板載的CPLD中完成。控制該顯示模塊的IO地址為0x08000000。

圖2 系統電路連接圖
編寫驅動程序實現在Linux下控制LED點陣顯示,加載驅動程序后,顯示的效果是64位全亮。實驗步驟為打開終端窗口,利用ifconfig命令設置網絡設備,將宿主PC機的根目錄掛載到S3C2410-RP目標板的mnt目錄下,而后通過insmod加載驅動程序,通過lsmod命令查看系統已經加載好的驅動程序,最后運行測試程序。
可將DR8-DR1作為高8位和OC8-OC1作為低8位連接起來構成16位二進制數,再將此數轉換為十進制數控制所有燈的滅與亮。例如上述的就可以用111111101000000來表示,對應的十進制數65152來控制燈亮。以下函數可實現點亮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];
以此可求出控制每一個的相應數字,就可以輸出任何一種圖形。采用一個循環實現控制控制點的移動;再分別設計豎柱的右移,行柱的下移,平面的右移,平面的下移,數字循環顯示等。每種顯示的方案如下:
(1)豎柱循環右移
采用moban[8]中的數字依次顯示可以實現豎柱的右移。
(2)行柱的下移
采用語句
for(i=0;i<8;i++)
Row[i]=256*(255-moban[i])+255;求出每一行的控制數字后讓它們依次顯示,就是行柱下移。
(3)平面右移
先點亮一列,再點亮兩列,依次增加,直至全亮,可實現平面右移的效果。采用語句
for(i=0;i<8;i++) MianR[i]=2i+1-1;
求出的八個數實現平面右移的數字。
(4)平面下移
同上,先點亮一行,再點亮兩行,依次增加,直到八行全亮。采用語句
for(i=0;i<8;i++)
MianD[i]=256*(255-(2i+1-1))+255;
求出八個數就是實現平面下移的數字。
(5)0-9的數字循環
同樣依照上述算法計算。
利用驅動程序實現最基本的顯示,而后通過編寫測試程序實現各種顯示,如果再進一步完善,可以編寫QT設計簡單測試界面,在顯示屏上可以有更直觀的效果。