基于Linux的LED点阵应用程序设计
2011-10-25张绍龙丁建国曹晓霞
张绍龙,赵 宁,丁建国,曹晓霞
(1.迁西县气象局,河北 唐山 064300;2.石家庄铁道大学 经济管理学院,河北 石家庄 050043;3.石家庄铁道大学 材料学院,河北 石家庄 050043;4.唐山市气象局 科技服务中心,河北 唐山 063000)
设备驱动程序在Linux内核中扮演着特殊的角色,它类似于一个独立的黑盒子,使某个特定的硬件可以响应一个良好的内部编程接口,同时完成隐藏设备的工作。凡是操作系统控制的外部设备,即使是最简单的硬件电路,也是需要驱动程序的。设备驱动程序在Linux里,除了直接修改系统的核心源代码,把设备驱动程序加进核心之外,还可以把设备驱动程序作为可加载的模块,由系统管理员动态加载,使之成为核心的一部分。编写驱动程序的主要工作就是编写子函数,并填充file_operations各个域。
此应用程序是在LED驱动加载之后使用,否则无法正常运行。本设计首先将LED点阵驱动起来,通过编写测试程序,使其能够按照设定的意图显示。
1 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可实现相应的灯亮。
2 驱动程序和应用程序的设计方案
在此设计中,整个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的数字循环
同样依照上述算法计算。
3 结束语
利用驱动程序实现最基本的显示,而后通过编写测试程序实现各种显示,如果再进一步完善,可以编写QT设计简单测试界面,在显示屏上可以有更直观的效果。