第六章-数字显示驱动程序-Linux设备驱动程序-教学课件.ppt
设备驱动程序第六章 数字显示驱动程序 目录l数字显示器 l数码管显示电路的硬件设计 l数码管驱动程序实例 l数码管显示电路测试程序设计 目录l数字显示器 l数码管显示电路的硬件设计 l数码管驱动程序实例 l数码管显示电路测试程序设计 数字显示器l在数字系统中,经常需要将测量、时钟或数值运算结果等字符显示出来,便于人们监视数字系统的工作情况。可见,数字显示电路是数字设备中不可或缺的组成部分。同样,在嵌入式系统中数字显示器也是常见的外围设备之一。l数字显示器有很多种不同类型的产品,如发光二极管、荧光数码管、液晶数字显示器等。数码管的分类l共阴极数码管l如图3-2,7段数码管有公共的地,即7个发光二极管的负极全部连接在了一起,只要给想点亮的二极管高电平就可以使其发光。l如果采用了拉电流连接,就要选择共阴极数码管。l共阳极数码管l如图3-4,共同的正向电压,然后通过控制负极的电压来控制二极管的发光或者熄灭。l如果采用了灌电流连接,就要选择共阳极数码管。数码管显示原理l7段数码管是由7个独立的二极管采用共阴或共阳的方法连接而成。通常将这7个独立的二极管做成a、b、c、d、e、f、g这7个笔画,如图3-5。l通过一个7位的二进制电平信号就可以显示出想要的结果。目录l数字显示器 l数码管显示电路的硬件设计 l数码管驱动程序实例 l数码管显示电路测试程序设计 数码管的驱动方式l静态驱动l当使用数码管数量较少时,可以将每个数码管都与一个译码器相连接。然后,通过级联来实现多位数码管显示逻辑。l可以解决数码管的显示驱动问题。数码管的驱动方式l动态驱动l将所有的数码管并联接在同一个译码器上,再通过专门的数据选择器来实现数码管的逐个轮流受控显示,可以极大减少BCD码的输入线,同时也就节约了对嵌入式处理器I/O端口的使用数量。串/并变换的译码设计l串并变换芯片74LV164是8位的边沿触发的串行输入、并行输出的转换器。串行的数据从两个输入端的其中一个输入,两个输入端必须连接在一起,或者不用的一个接高电平。l在时钟信号CP的上升沿到来的时候,数据向右移位。数据从Q0进入,它是两个输入管脚(DSA、DSB)逻辑与的结果。在MR管脚输入低电平可以把所有输入清0,并把输出置为低电平。l采用串并变换的驱动方式也属于静态驱动的一种,每个数码管都对应一个专门的串并信号转换器。唯一不同的是,串并信号转换器的输入信号可以是串行信号,大大节省了对嵌入式CPUI/O端口的使用,其电路设计如图3-14。硬件电路图说明l使用ZLG7290驱动数码管显示有两种方法,第一种方法是向命令缓冲区(07H-08H)写入复合指令,向07H写入命令并选通相应的数码管,向08H写入所要显示的数据,这种方法每次只能写入一个字节的数据,多字节数据的输出可在程序中用循环写入的方法实现;第二种方法是向显示缓存寄存器(10H17H)写入所要显示的数据的段码,段码的编码规则为从高位到低位为abcdefgdp,这种方法每次可写入18个字节数据。驱动程序lstatic int s3c2410_xfer(struct i2c_adapter*i2c_adap,struct i2c_msg msgs,int num)s3c2410_sendbytes(i2c_adap,pmsg,IIC_SINGLE_XFER);数码管测试程序lInt main()fd=open(/dev/i2c/0,O_RDWR);buf7=0 x05;buf6=0 x03;buf5=0 x0C;buf4=0 x02;buf3=0 x04;buf2=0 x01;buf1=0 x00;buf0=0 x0A;zlg7290_disp(buf,8)数码管测试程序lvoid zlg7290_disp(unsigned char*buf,unsigned char num)unsigned char i;unsigned char temp3;for(i=0;inum;i+)temp0=0 x07;/命令缓冲区的地址 temp1=0 x60+i;/按位下载数据且译码指令,依次从第0位到第7位 temp2=*buf;/第i位数码管显示的数字 buf+;write(fd,temp,3);usleep(5000);驱动程序的初始化static int _init HW_GPIO_LED_CTL_init(void)int ret=-ENODEV;printk(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhnn);showversion();GPDR3|=0 x00000001;/SET GPIO96 OUTPUT MODEGPSR3|=0 x00000001;/OFF THE LED#ifdef OURS_GPIO_LED_DEBUG printk(GPLR3=%x n,GPLR3);printk(GPDR3=%x n,GPDR3);#endifret=devfs_register_chrdev(SIMPLE_GPIO_LED_MAJOR,gpio_led_ctl,&GPIO_LED_ctl_ops);if(ret 0)printk(pxa270:init_module failed with%dn -kernel-,ret);return ret;elseprintk(pxa270 gpio_led_driver register success!-kernel-n);return ret;文件操作结构模块struct GPIO_LED_ctl_ops=open:SIMPLE_GPIO_LED_open,read:SIMPLE_GPIO_LED_read,write:SIMPLE_GPIO_LED_write,ioctl:SIMPLE_GPIO_LED_ioctl,release:SIMPLE_GPIO_LED_release,;数码管的读取模块ssize_t SIMPLE_GPIO_LED_read(struct file*buf,size_t count,loff_t*f_ops)#ifdef OURS_GPIO_LED_DEBUGprintk(SIMPLE_GPIO_LED_read -kernel-n);#endif return count;数码管写入模块ssize_t SIMPLE_GPIO_LED_write(struct file*char*buf,size_t count,loff_t*f_ops)#ifdef OURS_GPIO_LED_DEBUG printk(SIMPLE_GPIO_LED_write -kernel-n);#endifreturn count;数码管的I/O控制模块ssize_t SIMPLE_GPIO_LED_ioctl(struct inode*inode,struct file*file,unsigned int cmd,long data)#ifdef OURS_GPIO_LED_DEBUG printk(SIMPLE_GPIO_LED_ioctl -kernel-n);#endif switch(cmd)case LED_ON:GPCR3|=0 x1;break;case LED_OFF:GPSR3|=0 x1;break;default:printk(lcd control:no cmd run -kernel-n);return(-EINVAL);return 0;驱动程序的模块加载static int _init pxa270_GPIO_LED_CTL_init(void)int ret=-ENODEV;#ifdef OURS_GPIO_LED_DEBUG printk(pxa270_GPIO_LED_CTL_init -kernel-n);#endif ret=HW_GPIO_LED_CTL_init();if(ret)return ret;return 0;驱动程序的模块卸载static void _exit cleanup_GPIO_LED_ctl(void)#ifdef OURS_GPIO_LED_DEBUG printk(cleanup_GPIO_LED_ctl -kernel-n);#endif devfs_unregister_chrdev(SIMPLE_GPIO_LED_MAJOR,gpio_led_ctl);目录l数字显示器 l数码管显示电路的硬件设计 l数码管驱动程序实例 l数码管显示电路测试程序设计 数码管测试设计l在完成了数码管显示设备驱动程序的设计后,同样需要编写相应的测试程序来验证驱动程序的正确与否。l测试程序的方法多种多样,但主要的目的是观察数码管能否正常显示数字,即0-9的显示。数码管测试效果