您好,欢迎访问三七文档
嵌入式键盘驱动广州嵌入式软件公共技术支持中心梁老师2007年04月矩阵式键盘原理矩阵式键盘一般适用于按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上。如图所示,一个4×4的行、列结构可以构成一个有16个按键的键盘。矩阵式键盘原理按键设置在行、列交叉点上,行、列分别连接到按键开关的两端。行线通过上拉电阻接到十5V上。平时无按键动作时,行线处于高电平状态;而当有健按下时,行线电平状态将由通过此按键的列线电平决定:列线电平如果为低,行线电平为低;列线电平如果为高,则行线电平亦为高。这一点是识别矩阵式键盘是否被按下的关键所在。矩阵式键盘原理矩阵键盘按键的识别方法分两步进行:①识别键盘哪一行的键被按下。让所有列线均为低电平,检查各行线电平是否为低。如果有行线为低,则说明该行有键被按下,否则说明无键被按下。②如果某行有键被按下,识别键盘哪一列的键被按下(亦称之为扫描法)。逐列置低电平,并置其余各列为高电平.检查各行线电平的变化。如果行电平变为低电平,则可确定此行此列交叉点处按键被按下。S3C2410的I/O介绍S3C2410有117个复用功能输入输出端口引脚,这些引脚是:PortA(GPA):32个输入/输出端口PortB(GPB):11个输入/输出端口PortC(GPC):16个输入/输出端口PortD(GPD):16个输入/输出端口PortE(GPE):16个输入/输出端口PortF(GPF):8个输入/输出端口PortG(GPG):16个输入/输出端口PortH(GPH):11个输入/输出端口S3C2410的I/O介绍端口控制说明端口配置寄存器(GPACON――GPHCON)大部分的引脚是复用的,所以必须对于每个引脚要求定义一个功能,端口配置寄存器定义了每个引脚的功能。端口数据寄存器(GPADAT――GPHDAT)如果端口配置成输出端口,数据能够被写到端口数据寄存器的对应位,然后通过管脚输出。如果端口配置成输入端口,能从端口数据寄存器对应的位中读出管脚上的电平端口上拉寄存器(GPBUP――GPHUP)端口上拉寄存器控制着每个端口组的上拉寄存器的使能或禁止,当对应位为0,这个引脚的上拉寄存器是允许的,当为1时,上拉寄存器是禁止的。MIZI提供的S3C2410.H使用一个32位的数来表示端口的使用情况。模式|上拉|端口|端口引脚MODE|PULLUP|PORT|OFS不需要自己手动组合,通过宏定义以及SHIFT和MASK组合。见程序MIZI提供的S3C2410.H端口的表示#definePORTA_OFS0#definePORTB_OFS1#definePORTC_OFS2#definePORTD_OFS3#definePORTE_OFS4#definePORTF_OFS5#definePORTG_OFS6#definePORTH_OFS7MIZI提供的S3C2410.H端口引脚的表示#defineGPIO_A0MAKE_GPIO_NUM(PORTA_OFS,0)#defineGPIO_A1MAKE_GPIO_NUM(PORTA_OFS,1)#defineGPIO_A2MAKE_GPIO_NUM(PORTA_OFS,2)#defineGPIO_A3MAKE_GPIO_NUM(PORTA_OFS,3)。。。#defineMAKE_GPIO_NUM(p,o)((pGPIO_PORT_SHIFTT)|(oGPIO_OFS_SHIFT))MIZI提供的S3C2410.Hset_gpio_ctrl(x)功能:配置端口引脚的功能,设置IO口控制寄存器和上拉寄存器用法:set_gpio_ctrl(模式|上拉?|IO脚)模式|是否上拉|IO脚,在S3C2410.h中都有其定义好的名字。set_gpio_ctrl(GPIO_E11|GPIO_PULLUP_DIS|GPIO_MODE_OUT);MIZI提供的S3C2410.Hwrite_gpio_bit(x,v)功能:把端口对应的端口数据寄存器x位设置为vwrite_gpio_bit(GPIO_E11,0);read_gpio_bit(x)功能:把端口数据寄存器x位的状态读入,函数返回值既是其状态read_gpio_bit(GPIO_G11);MIZI提供的S3C2410.Hwrite_gpio_reg(x,v)功能:把端口数据寄存器x设置为vread_gpio_reg(x)功能:读取端口数据寄存器x,函数返回值既是其数据键盘的硬件实现键盘的硬件实现4X4矩阵键盘四个输入引脚:EINT0-----(GPF0)----INPUTEINT2-----(GPF2)----INPUTEINT11-----(GPG3)----INPUTEINT19-----(GPG11)----INPUT四个输出引脚:KEYSCAN0---(GPE11)----OUTPUTKEYSCAN1---(GPG6)----OUTPUTKEYSCAN2---(GPE13)----OUTPUTKEYSCAN3---(GPG2)----OUTPUT键盘的驱动实现引入结构体key_info对按键进行描述staticstructkey_info{intirq_no;//外部中断号unsignedintgpio_port;//输入端口,EINTunsignedintgpio_port_kscan;//输出端口,OUTPUTintkey_no;//按键序号,或者名字}key_info_tab[16]={……}键盘初始化程序staticint__initmatrix4_buttons_init(void){注册字符设备register_chrdev(……);初始化按键对应的输出端口buttons_io_port_init();采用中断机制,注册中断号request_irqs();}键盘初始化程序/*初始化kscan口为输出0*/staticvoidbuttons_io_port_init(void){inti;for(i=0;isizeofkscan/sizeofkscan[1];i++){set_gpio_ctrl(kscan[i]|GPIO_PULLUP_DIS|GPIO_MODE_OUT);write_gpio_bit(kscan[i],0);}}请求注册中断staticintrequest_irqs(void){for(i=0;i使用中断个数;i++){设置与外部中断号相对应的GPIO端口以及模式请求中断号,并注册中断响应函数。}}键盘驱动的卸载函数staticvoid__exitmatrix4_buttons_exit(void){释放中断free_irqs(…);注销字符设备unregister_chrdev(…);}按键中断处理buttons_irqstaticvoidbuttons_irq(intirq,void*dev_id,structpt_regs*reg){设置GPIO为输入状态键盘扫描唤醒按键等待队列的进程重新设置GPIO为输出重新设置中断}通过延时去键盘抖动理想的情况下,当按键被按下时,I/O口电平被拉低,即逻辑0,当按键松开时,为逻辑1。但实际机械的触点动作与微处理器快速的执行速度不匹配,导致开关被按下或松开时产生抖动,如同弹簧一样,不能立刻产生稳定的0或1。常用的去抖动方法有硬件和软件两种,硬件可采用单稳态触发起、高通滤波器等硬件实现,但该方法一般要对每一路输入添加特殊的硬件,比较复杂。软件去抖动则简单多了,可通过增加延时和判断来解决。matrix4_buttons_fops由于按键不具有I/O功能,它只会在按下的时候产生中断,所以这里不需要实现open,read,write,ioctl等功能。为了测试驱动,可以添加这些函数。
本文标题:嵌入式键盘驱动
链接地址:https://www.777doc.com/doc-3558285 .html