当前位置:文档之家› 按键驱动

按键驱动

按键驱动
按键驱动

驱动设计

S5pv210开发板按键驱动示例:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

MODULE_LICENSE("Dual BSD/GPL"); //许可协议

MODULE_AUTHOR("mysticall@https://www.doczj.com/doc/6e3591392.html,");

#define GPH0CON 0xe0200c00 //需要操作的地址,如果板子是其他的需要看下芯片手册#define GPH2CON 0xe0200c40

static int key_major = 250;

static int key_minor = 0;

struct key_device //定义设备结构体

{

int keyval;

struct cdev cdev;

struct semaphore sem;

wait_queue_head_t rq;

struct fasync_struct *async_queue;

} key_device;

void *gph0con;

void *gph2con;

static int fs210_key_open(struct inode *inode, struct file *filp) //打开设备操作;

{

struct key_device *dev = container_of(inode->i_cdev, struct key_device, cdev);

filp->private_data = dev;

printk("fs210_key is opened\n");

return 0;

}

static int fs210_key_release(struct inode *inode, struct file *filp) // 卸载设备操作

{

struct key_device *dev = container_of(inode->i_cdev, struct key_device, cdev);

fasync_helper(-1, filp, 0, &dev->async_queue);

printk("fs210_key is closed\n");

return 0;

}

static int fs210_key_read(struct file *filp, char __user *buf, size_t size, loff_t *off) //读操作{

struct key_device *dev = filp->private_data;

down(&dev->sem);

while (dev->keyval == 0)

{

up(&dev->sem);

if (filp->f_flags & O_NONBLOCK)

return -EAGAIN;

if (wait_event_interruptible(dev->rq, dev->keyval != 0))

return -ERESTARTSYS;

down(&dev->sem);

}

if (copy_to_user(buf, &dev->keyval, sizeof(int)))

{

up(&dev->sem);

return -EFAULT;

}

dev->keyval = 0;

up(&dev->sem);

return sizeof(int);

}

static int fs210_key_fasync(int fd, struct file *filp, int mode) //异步通知

{

struct key_device *dev = filp->private_data;

return fasync_helper(fd, filp, mode, &dev->async_queue);

}

static unsigned int fs210_key_poll(struct file *filp, poll_table *wait) {

unsigned int mask = 0;

struct key_device *dev = filp->private_data;

poll_wait(filp, &dev->rq, wait);

down(&dev->sem);

if (dev->keyval != 0)

{

mask |= POLLIN | POLLRDNORM; /*标示数据可获得*/ }

up(&dev->sem);

return mask;

}

static struct file_operations fs210_key_ops = { //文件操作集.owner = THIS_MODULE,

.open = fs210_key_open,

.release = fs210_key_release,

.read = fs210_key_read,

.fasync = fs210_key_fasync,

.poll = fs210_key_poll

};

static irqreturn_t handler(int irqno, void *dev_id) //中断处理{

static long old_jiffies = 0;

if (jiffies - old_jiffies < 20) return IRQ_HANDLED;

old_jiffies = jiffies;

printk("irq: interrupt %d\n", irqno);

switch (irqno)

{

case IRQ_EINT(0) :

key_device.keyval = 1;

break;

case IRQ_EINT(1) :

key_device.keyval = 2;

break;

case IRQ_EINT(2) :

key_device.keyval = 3;

break;

case IRQ_EINT(3) :

key_device.keyval = 4;

break;

case IRQ_EINT(4) :

key_device.keyval = 5;

break;

case IRQ_EINT(5) :

key_device.keyval = 6;

break;

case IRQ_EINT(22) :

key_device.keyval = 7;

break;

case IRQ_EINT(23) :

key_device.keyval = 8;

break;

}

wake_up(&key_device.rq);

if (key_device.async_queue != NULL)

{

kill_fasync(&key_device.async_queue, SIGIO, POLL_IN);

}

return IRQ_HANDLED;

}

static int key_request_irq(void) //响应中断

{

int result;

result = request_irq(IRQ_EINT(0), handler, IRQF_DISABLED|IRQF_TRIGGER_FALLING, "key_1", NULL);

if (result) {

printk("key: request irq %d failed!\n", IRQ_EINT(0));

return result;

}

result = request_irq(IRQ_EINT(1), handler, IRQF_DISABLED|IRQF_TRIGGER_FALLING, "key_2", NULL);

if (result) {

printk("key: request irq %d failed!\n", IRQ_EINT(1));

goto _error_irq1;

}

result = request_irq(IRQ_EINT(2), handler, IRQF_DISABLED|IRQF_TRIGGER_FALLING, "key_3", NULL);

if (result) {

printk("key: request irq %d failed!\n", IRQ_EINT(2));

goto _error_irq2;

}

result = request_irq(IRQ_EINT(3), handler, IRQF_DISABLED|IRQF_TRIGGER_FALLING, "key_4", NULL);

if (result) {

printk("key: request irq %d failed!\n", IRQ_EINT(3));

goto _error_irq3;

}

result = request_irq(IRQ_EINT(4), handler, IRQF_DISABLED|IRQF_TRIGGER_FALLING, "key_5", NULL);

if (result) {

printk("key: request irq %d failed!\n", IRQ_EINT(4));

goto _error_irq4;

}

result = request_irq(IRQ_EINT(5), handler, IRQF_DISABLED|IRQF_TRIGGER_FALLING, "key_6", NULL);

if (result) {

printk("key: request irq %d failed!\n", IRQ_EINT(5));

goto _error_irq5;

}

result = request_irq(IRQ_EINT(22), handler, IRQF_DISABLED|IRQF_TRIGGER_FALLING, "key_7", NULL);

if (result) {

printk("key: request irq %d failed!\n", IRQ_EINT(22));

goto _error_irq22;

}

result = request_irq(IRQ_EINT(23), handler, IRQF_DISABLED|IRQF_TRIGGER_FALLING, "key_8", NULL);

if (result) {

printk("key: request irq %d failed!\n", IRQ_EINT(23));

goto _error_irq23;

}

return 0;

//出错时,释放中断

_error_irq23:

free_irq(IRQ_EINT(22), NULL);

_error_irq22:

free_irq(IRQ_EINT(5), NULL);

_error_irq5 :

free_irq(IRQ_EINT(4), NULL);

_error_irq4 :

free_irq(IRQ_EINT(3), NULL);

_error_irq3 :

free_irq(IRQ_EINT(2), NULL);

_error_irq2 :

free_irq(IRQ_EINT(1), NULL);

_error_irq1 :

free_irq(IRQ_EINT(0), NULL);

return result;

}

static void init_key(void) // 映射寄存器,写控制器;{

gph0con = ioremap(GPH0CON, 4);

gph2con = ioremap(GPH2CON, 4);

writel((readl(gph0con) | 0xffffff), gph0con);

writel((readl(gph2con) | (0xff<<24)), gph2con);

}

static void key_free_irq(void)

{

free_irq(IRQ_EINT(0), NULL);

free_irq(IRQ_EINT(1), NULL);

free_irq(IRQ_EINT(2), NULL);

free_irq(IRQ_EINT(3), NULL);

free_irq(IRQ_EINT(4), NULL);

free_irq(IRQ_EINT(5), NULL);

free_irq(IRQ_EINT(22), NULL);

free_irq(IRQ_EINT(23), NULL);

}

static int key_setup_cdev(struct cdev *cdev, struct file_operations *ops)

{

int result;

dev_t devno = MKDEV(key_major, key_minor);

cdev_init(cdev, ops);

cdev->owner = THIS_MODULE;

result = cdev_add(cdev, devno, 1);

if (result)

{

printk("key: fail to add cdev\n");

return result;

}

return 0;

}

static int __init fs210_key_init(void)

{

int result;

dev_t devno = MKDEV(key_major, key_minor);

result = register_chrdev_region(devno, 1, "fs210_key");

if (result)

{

printk("key: unable to get major %d\n", key_major);

return result;

}

result = key_setup_cdev(&key_device.cdev, &fs210_key_ops);

if (result)

goto _error1;

result = key_request_irq();

if (result)

goto _error2;

init_key();

key_device.keyval = 0;

//init_MUTEX(&key_device.sem); // can used in kernel which version is no more than 2.6.35

sema_init(&key_device.sem, 1);

init_waitqueue_head(&key_device.rq);

printk("key : init_module\n");

return 0;

_error2:

cdev_del(&key_device.cdev);

_error1:

unregister_chrdev_region(devno, 1);

return result;

}

static void __exit fs210_key_exit(void)

{

dev_t devno = MKDEV(key_major, key_minor);

key_free_irq();

cdev_del(&key_device.cdev);

unregister_chrdev_region(devno, 1);

printk("key: cleanup_module!\n");

}

module_init(fs210_key_init);

module_exit(fs210_key_exit);

USB键盘驱动程序

/* * $Id: usbkbd.c,v 1.27 2001/12/27 10:37:41 vojtech Exp $ * * Copyright (c) 1999-2001 Vojtech Pavlik * * USB HIDBP Keyboard support */ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Should you need to contact me, the author, you can do so either by * e-mail - mail your message to <>, or by paper mail: * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic */ #include #include #include #include #include #include #include /* * Version Information */ #define DRIVER_VERSION "" #define DRIVER_AUTHOR "Vojtech Pavlik <>" #define DRIVER_DESC "USB HID Boot Protocol keyboard driver" #define DRIVER_LICENSE "GPL"

显示和键盘流程图及程序

3.2 部分软件设计 3.2.3显示子程序 动态显示程序框图如图所示。显示程序的要点有两个:一是代码转换。因为直接驱动LED 显示器的是字形码,而人们习惯的是0、1、2、…、F 等字符,因此,必须将待显示的字符转换成字形码。转换用查表的方法进行。二是通过软件实现逐位轮流点亮每个LED 。 为了实现代码转换,首先开辟一个显示缓冲区,将待显示的字符预先存放在缓冲区中。由于有4位LED 显示器,故不妨假设显示缓冲区长度为4个字节。显示缓冲区地址为DIS 0~DIS 3 ,DIS 0单元与最左边一位LED 相对应,DIS 3单元与最右边一位LED 相对应。 程序清单如下: DIS : ORG 0500H MOV A ,#00000011B MOV DPTR ,#7F00H MOVX @DPTR ,A MOV R0,#78H MOV R3,#7FH MOV A ,R3 LD : MOV DPTR ,#7F01H 开 始 结 束 8051初始化 指向下个显示缓冲单元 显示下一位 延时1mS 段选码送入 查段选表 送位选字 动态显示初始化 3位显示完?

有键闭合吗? 确有键闭合吗 闭合键释放吗 返 回 MOVX @DPTR ,A INC DPTR MOV A ,@R0 ADD A ,#0DH MOVC A ,@ DPTR ACALL DLY MOV A ,R3 JNB A ,R0 RR A ,LD1 MOV R3,A INC R0 AJMP LD0 LD1: SJMP LD1 DSEG :DB 3FH ,06H ,5BH ,4FH ,66H ,6DH 7DH ,07H ,7FH ,6FH DLY : MOV R7,#02H DL : MOV R6,#0FFH DL1: DJNZ R6,DL1 DJNZ R7,DL RET 3.2.4键盘子程序 键盘扫描子程序框图如图 图3-4 键盘扫描子程序框图 开 始 两次调用 延时子程序 判断闭合键号 键号 → A 调用延时子程序

按键操作

Assign将选择的物体赋予图层Blend point 混合点 Chain 链 Cloud point 点云Component 物体 Cos 曲面上的线 Cv 控制点 Curve 曲线Diagnostic shading 诊断实体显示Edit point 编辑点 Groove 沟(圆管一般)Hull 骨架 Image plane 参考图片Invisibility 看不见的东西Locator 标记 Object 物体 Template 参考模板Tessellator 显示精度Tolerance 显示精度公差Tube 圆管 Pick objects 选择图层物体Projected intersections 投影交点Rotate 旋转 Scale 缩放大小

Set pivot 设定中心点 Set state设定图层中物体状态 Pickable/Reference/inactive(可以选择/参考/不被激活) Surface 曲面 Symmetry图层中物体对称 Visable 图层中物体可见/不可见 Undo assign 撤销将物体赋予图层操作 Toggle layers 显示/隐藏图层栏 Toggle layers bar 显示/隐藏图层栏 Toggle unused layers 在图层栏中隐藏无用的图层 Pivot alias中的中心点的意义在于,物体旋转,缩放所依据的点,则为中心点,中线的位置可以改变,利用set pivot 这个按键 ait+A 删除 shift+ait+左键旋转视角 shift+ait+中键平移视角 shift+ait+右键缩放视角 shift+control+左键/中键/右键调出菜单栏 在画曲线的时候,按住control,锁定点,按住ait锁定网格,按住control+ait,锁定了曲线上的点 调出左键菜单栏,单击物体,则选择了物体,再次单击,则取消选择 Shift+ait同时点击物体,则设立了视觉点,就方便了物体的查看 XYZ与UVW对应,左键,中键,右键,分别表示,X,Y,Z轴的对称 只有三阶曲线才能是空间曲线

什么是驱动程序资料

什么是驱动程序? 驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。 年轻人最大的动力,或者最大的优势就在于,你一旦想做什么你就马上去做。说这是天真也好,甚至对一些事情的无知也好,有这种勇气和决心就应该去做。” 什么是BSP? BSP是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linu x的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写BSP一定要按照该系统BSP的定义形式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改),这样才能与上层OS保持正确的接口,良好的支持上层OS。 例如:在VxWorks中的网卡驱动,首先在config.h中包含该网卡,然后将网卡含网卡信息的参数放入数组END_TBL_ENTRY endDevTbl [ ] 中,系统通过函数muxDevLoad ( )调用这个数组来安装网卡驱动。而在Linux中的网卡驱动,是在space.c中声明该网络设备,再把网卡驱动的一些函数加到dev结构中,由函数ether_setup()来完成网卡驱动的安装。 纯粹的BSP所包含的内容一般说来是和系统有关的驱动和程序,如网络驱动和系统中网络协议有关,串口驱动和系统下载调试有关等等。离开这些驱动系统就不能正常工作。 用户也可以添加自己的程序到BSP中,但严格来说不应该算BSP.一般来说这种做法不建议。因为一旦操作系统能良好运行于最终的主板硬件后,BSP也就固定了,不需要做任何改动。而用户自己在BSP中的程序还会不断的升级更新,这样势必对BSP有不好的影响,对系统造成影响,同时由于BSP调试编译环境较差,也不利于程序的编译调试。 如何编写Linux设备驱动程序 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它和dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kerne l中的函数,有些常用的操作要自己来编写,而且调试也不方便。 一、Linux device driver 的概念

字符设备驱动程序

字符设备驱动程序 字符设备驱动程序与块设备不同。所涉及的键盘驱动、控制台显示驱动和串口驱动以及与这些驱动有关的接口、算法程序都紧密相关。他们共同协作实现控制台终端和串口终端功能。 下图反映了控制台键盘中断处理过程。 以上为总的处理流程,下面对每一个驱动分开分析。首先是键盘驱动。键盘驱动用汇编写的,比较难理解,牵涉内容较多,有键盘控制器804X的编程,还有扫描码(共3套,这里用第二套)和控制命令及控制序列(p209~210有讲解)。由于键盘从XT发展到AT到现在PS/2,USB,无线键盘,发展较快,驱动各有不同,此版本驱动为兼容XT,将扫描码映射为XT再处理,因此仅供参考。CNIX操作系统的键盘驱动实现为C语言,可读性更好。 键盘驱动 键盘驱动就是上图键盘硬件中断的过程。keyboard.S中的_keyboard_interrupt 函数为中断主流程,文件中其他函数均被其调用。

以上打星处为键盘驱动的核心,即主要处理过程,针对不同扫描码分别处理,并最终将转换后所得ASCII 码或控制序列放入控制台tty 结构的读缓冲队列read_q 中。 键处理程序跳转表为key_table ,根据扫描码调用不同处理程序,对于“普通键”,即只有一个字符返回且没有含义变化的键,调用do_self 函数。其他均为“特殊键”:1. crtrl 键的按下和释放 2. alt 键的按下和释放 3. shift 键的按下和释放 4. caps lock 键的按下和释放(释放直接返回,不作任何处理) 5. scroll lock 键的按下 6. num lock 的按下 7. 数字键盘的处理(包括alt-ctrl+delete 的处理,因为老式键盘delete 键在数字小键盘上。还包括对光标移动键的分别处理) 8. 功能键 (F1~F12)的处理 9. 减号的处理(老键盘’/’与’-’以0xe0加以区分,可能其中一键要按shift ) do_self 是最常用的流程,即跳转表中使用频率最高的流程:

FANUC系列操作面板各按键

FANUC 系列操作面板各按键: RESET(复位键): 按下此键,复位CNC系统。包括取消报警、主轴故障复位、中途退出自动操作循环和中途退出输入、输出过程等。 CURSOR(光标移动键):移动光标至编辑处 PAGE(页面转换键):显示器画面向前变换页面,显示器画面向后变换页面。 地址和数字键:按下这些键,输入字母、数字和其它字符 POS(位置显示键):在CRT上显示机床现在的位置。 PRGRM(程序键):在编辑方式,编辑和显示内存中的程序。在MDI方式,输入和显示MDI 数据 。在自动方式,指令值显示。 MENU OFFSET(偏置值设定和显示)。 DGNOS PARAM(自诊断参数键)。 参数设定和显示,诊断数据显示 OPR ALARM(报警号显示键):报警号显示及软件操作面板的设定和显示 AUX GRAPH(图形显示键):图形显示功能 INPUT(输入键):用于参数或偏置值的输入;启动I/O设备的输入;MDI方式下的指令数据的输入。 OUTPT START(输出启动键)。 ALTER(修改键):修改存储器中程序的字符或符号。 INSRT(插入键):在光标后插入字符或符号。 CAN(取消键):取消已键入缓冲器的字符或符号。 DELET(删除键):删除存储器中程序的字符或符号。

B 坐标字绕Y轴旋转。 C 坐标字绕Z轴旋转。 D 补偿号刀具半径补偿指令。 E 第二进给功能。 F 进给速度进给速度的指令。 G 准备功能指令动作方式。 H 补偿号补偿号的指定。 I 坐标字圆弧中心X轴向坐标。 J 坐标字圆弧中心Y轴向坐标。 K 坐标字圆弧中心Z轴向坐标。 L 重复次数固定循环及子程序的重复次数。 M 辅助功能机床开关指令。 N 顺序号顺序段序序号。 O 顺序号顺序号、子程序顺序号的指定。 P 暂停或程序中某功能的开始使用的程序号。 Q 固定循环终止段号或固定循环中的定距。 R 坐标字固定循环中的定距离或圆弧半径的指定。 S 主轴功能主轴转速指令。 T 刀具功能刀具编号指令。 U 坐标字与X轴平行的附加轴的增量坐标值或暂停时间。V 坐标字与Y轴平行的附加轴的增量坐标值。 W 坐标字与Z轴平行的附加轴的增量坐标值。 X 坐标字 X轴的绝对坐标值或暂停时间。

设备驱动程序

驱动程序 驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被比作“硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。 中文名 驱动程序 外文名 Device Driver 全称 设备驱动程序 性质 可使计算机和设备通信的特殊程序 目录 1定义 2作用 3界定 ?正式版 ?认证版 ?第三方 ?修改版 ?测试版 4驱动程序的开发 ?微软平台 ?Unix平台 5安装顺序 6inf文件 1定义 驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 惠普显卡驱动安装 正因为这个原因,驱动程序在系统中的所占的地位十分重要,一般当操作系统安装完毕后,首要的便是安装硬件设备的驱动程序。不过,大多数情况下,我们并不需要安装所有硬件设备的驱动程序,例如硬盘、显示器、光驱等就不需要安装驱动程序,而显卡、声卡、扫描仪、摄像头、Modem等就需要安装驱动程序。另外,不同版本的操作系统对硬件设

备的支持也是不同的,一般情况下版本越高所支持的硬件设备也越多,例如笔者使用了Windows XP,装好系统后一个驱动程序也不用安装。 设备驱动程序用来将硬件本身的功能告诉操作系统,完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。 所以简单的说,驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称为“硬件和系统之间的桥梁”。 戴尔电脑驱动盘 驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。 当你在安装新硬件时总会被要求放入“这种硬件的驱动程序”,很多人这时就开始头痛。不是找不到驱动程序的盘片,就是找不到文件的位置,或是根本不知道什么是驱动程序。比如安装打印机这类的硬件外设,并不是把连接线接上就算完成,如果你这时候开始使用,系统会告诉你,找不到驱动程序。怎么办呢参照说明书也未必就能顺利安装。其实在安装方面还是有一定的惯例与通则可寻的,这些都可以帮你做到无障碍安装。 在Windows系统中,需要安装主板、光驱、显卡、声卡等一套完整的驱动程序。如果你需要外接别的硬件设备,则还要安装相应的驱动程序,如:外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Modem甚至ISDN、ADSL的驱动程序。说了这么多的驱动程序,你是否有一点头痛了。下面就介绍Windows系统中各种的不同硬件设备的驱动程序,希望能让你拨云见日。 在Windows 9x下,驱动程序按照其提供的硬件支持可以分为:声卡驱动程序、显卡驱动程序、鼠标驱动程序、主板驱动程序、网络设备驱动程序、打印机驱动程序、扫描仪驱动程序等等。为什么没有CPU、内存驱动程序呢因为CPU和内存无需驱动程序便可使用,不仅如此,绝大多数键盘、鼠标、硬盘、软驱、显示器和主板上的标准设备都可以用Windows 自带的标准驱动程序来驱动,当然其它特定功能除外。如果你需要在Windows系统中的DOS 模式下使用光驱,那么还需要在DOS模式下安装光驱驱动程序。多数显卡、声卡、网卡等内置扩展卡和打印机、扫描仪、外置Modem等外设都需要安装与设备型号相符的驱动程序,否则无法发挥其部分或全部功能。驱动程序一般可通过三种途径得到,一是购买的硬件附

基于51单片机的PS2键盘的单片机编程

PS2键盘的单片机编程 在单片机系统中,经常使用的键盘都是专用键盘.此类键盘为单独设计制作的,成本高、使用硬件连接线多,且可靠性不高,这一状况在那些要求键盘按键较多的应用系统中更为突出.与此相比,在PC系统中广泛使用PS/2键盘具有价格低、通用可靠,且使用连接线少(仅使用2根信号线)的特点,并可满足多种系统的要求.因此在单片机系统中应用PS/2键盘是一种很好的选择. 文中在介绍PS/2协议和PS/2键盘工作原理与特点的基础上,给出了一个在单片机上实现对PS/2键盘支持的硬件连接与驱动程序设计实现.该设计实现了在单 片机系统中对PS/2标准104键盘按键输入的支持.使用Keil C51开发的驱动程序接口和库函数可以方便地移植到其他单片机或嵌入式系统中.所有程序在 Keil uVision2上编译通过,在单片机AT89C51上测试通过. 1 PS/2协议 目前,PC机广泛采用的PS/2接口为mini-DIN 6pin的连接器,如图1所示. PS/2设备有主从之分,主设备采用Female插座,从设备采用Male插头.现在广泛使用的PS/2键盘鼠标均在从设备方式下工作.PS/2接口的时钟 与数据线都是集电极开路结构,必须外接上拉电阻(一般上拉电阻设置在主设备中).主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生. 1.1 从设备到主设备的通信 当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平.如果是高电平,从设备就可以开始传输数据;反之,从设备要等待获得总线的控制权,才能开始传输数据.传输的每一帧由11位组成,发送时序及每一位的含义如图2 所示. 每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1.从设 备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟 下降沿读人数据线状态.

基于linux的led驱动程序实现

基于linux的led驱动程序实现 一. 博创开发平台硬件LED的实现 博创开发平台设置了3个GPIO控制的LED和一个可直接产生外部硬件中断的按键,LED分别使用了S3C2410的GPC5,GPC6,GPC7三个GPIO,按键接到INT5中断。下面对S3C2410 GPIO的各个寄存器作出说明,用GPIO控制的LED就是通过操作GPIO的各个寄存器进行配置和操作的。S3C2410包含GPA 、GPB 、……、GPH 八个I/O端口。它们的寄存器是相似的:GPxCON 用于设置端口功能(00 表示输入、01表示输出、10 表示特殊功能、11 保留不用),GPxDAT 用于读/写数据,GPxUP 用于决定是否使用内部上拉电阻(某位为0 时,相应引脚无内部上拉;为1时,相应引脚使用内部上拉)。这里要稍微注意一点的地方是PORTA和其他几组端口的使用不太一样,这里不讨论A口,B到H组口的使用完全相同。以下是S3C2410手册上的数据[13]: 图1.1 S3C2410端口 GPC口有16个IO口,查datasheet《S3C2410》所用的地址为: 图1.2 C组GPIO的地址 即GPCCON 地址为0x56000020,GPCDAT地址为0x56000024,各位的设置具体见下图,则对应的GPCCON寄存器的位为:

图1.3 GPCCON寄存器相应的位 这里用到了5,6,7三个口,CON寄存器要完成对对应口的设置工作,将相应的口设置为输出状态,其他的口不用考虑,设置为输出的话就是0x15<<10,这样3个IO口就设置为了输出。下面就可以通过向DATA口写入低电平来点亮LED,GPCDAT的各位分布如下,每一个bit对应一个口。 图1.4 GPCDAT的位分布 GPCDAT有16位,我们这里要用到的就是5,6,7三位即将这3位设置为低电平点亮LED。具体使用情况见驱动的实现。 这三个LED的硬件原理图如下: 图1.5 GPIO控制的LED硬件原理图 二.通过GPIO控制的LED驱动程序 本驱动中没有用到内核提供的write_gpio宏,对硬件地址的操作完全自己实现,可分为以下几部分: ①模块的初始化和退出: int led_init(void)

Linux驱动程序工作原理简介

Linux驱动程序工作原理简介 一、linux驱动程序的数据结构 (1) 二、设备节点如何产生? (2) 三、应用程序是如何访问设备驱动程序的? (2) 四、为什么要有设备文件系统? (3) 五、设备文件系统如何实现? (4) 六、如何使用设备文件系统? (4) 七、具体设备驱动程序分析 (5) 1、驱动程序初始化时,要注册设备节点,创建子设备文件 (5) 2、驱动程序卸载时要注销设备节点,删除设备文件 (7) 参考书目 (8) 一、linux驱动程序的数据结构 设备驱动程序实质上是提供一组供应用程序操作设备的接口函数。 各种设备由于功能不同,驱动程序提供的函数接口也不相同,但linux为了能够统一管理,规定了linux下设备驱动程序必须使用统一的接口函数file_operations 。 所以,一种设备的驱动程序主要内容就是提供这样的一组file_operations 接口函数。 那么,linux是如何管理种类繁多的设备驱动程序呢? linux下设备大体分为块设备和字符设备两类。 内核中用2个全局数组存放这2类驱动程序。 #define MAX_CHRDEV 255 #define MAX_BLKDEV 255 struct device_struct { const char * name; struct file_operations * fops; }; static struct device_struct chrdevs[MAX_CHRDEV]; static struct { const char *name; struct block_device_operations *bdops; } blkdevs[MAX_BLKDEV]; //此处说明一下,struct block_device_operations是块设备驱动程序内部的接口函数,上层文件系统还是通过struct file_operations访问的。

检测到不兼容的键盘驱动程序。该对话框已被停用的解决方法

检测到不兼容的键盘驱动程序。该对话框已被停用的解决方法在 Windows XP 系统中单击语言栏的设置弹出“检测到不兼容的键盘驱动程序”的错误提示对话框,如遇到此问题的朋友可通过下面的方法来解决。 到一台正常 WindowsXP系统的机器,单击"开始”菜单中的“运行”命令 在“打开”框中键入“ regedit ”命令,单击“确定”按钮 打开“注册表编辑器”窗口,在左侧窗口(注册表树)定位到以下分支 Control\Keyboard Layouts 右击“ Keyboard Layouts ”主键,打开的快捷 菜单单击“导出”命令 选择要导出注册表文件的位置,并在文件名框 中输入任意名称,单击“保存”按钮 将生成的reg 文件拷贝到存储设备里,在出问 题的机器上双击该注册表文件,导入注册表信息

在 Windows XP 系统中单击语言栏的设置弹出“检测到不兼容的键盘驱动程序”的错误提示对话框,如遇到此问题的朋友可通过下面的方法来解决。 到一台正常 WindowsXP系统的机器,单击"开始”菜单中的“运行”命令 在“打开”框中键入“ regedit ”命令,单击“确定”按钮 打开“注册表编辑器”窗口,在左侧窗口(注册表树)定位到以下分支 Control\Keyboard Layouts 右击“ Keyboard Layouts ”主键,打开的快捷 菜单单击“导出”命令 选择要导出注册表文件的位置,并在文件名框 中输入任意名称,单击“保存”按钮 将生成的reg 文件拷贝到存储设备里,在出问 题的机器上双击该注册表文件,导入注册表信息

在 Windows XP 系统中单击语言栏的设置弹出“检测到不兼容的键盘驱动程序”的错误提示对话框,如遇到此问题的朋友可通过下面的方法来解决。 到一台正常 WindowsXP系统的机器,单击"开始”菜单中的“运行”命令 在“打开”框中键入“ regedit ”命令,单击“确定”按钮 打开“注册表编辑器”窗口,在左侧窗口(注册表树)定位到以下分支 Control\Keyboard Layouts 右击“ Keyboard Layouts ”主键,打开的快捷 菜单单击“导出”命令 选择要导出注册表文件的位置,并在文件名框 中输入任意名称,单击“保存”按钮 将生成的reg 文件拷贝到存储设备里,在出问 题的机器上双击该注册表文件,导入注册表信息

程序、驱动程序及硬件简述

程序 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 请概括的说一说什么是程序…… =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 程序都分为几大类…… ============================================== 编写程序时都要注意哪些事项? 答:1.①程序是计算机的一组指令,经过编译和执行才能最终完成程序设计的动作。程序设计的最终结果是软件。 ②为了让电脑执行某项具体任务而提供给它的详细指令集合就是程序(program)。 2.字处理程序(就是我们常说的计算机语言,如C语言,BASIC等)、电脑工资表系统、电脑游戏和电子数据表都是电脑程序 3.一般来讲,程序设计风格是指编写程序时所表现出的特点,习惯和逻辑思路.因此程序设计的风格总体而言应该强调程序简单和清晰,并且是可以理解的. "清晰第一,效率第二"已成为当今主导的程序设计风格. 程序设计风格主要体现在以下几个方面: ⒈源程序文挡化 源程序文挡化应考虑如下几点: ⑴符号名的命名 符号名的命名应具有一定的实际含义,以便于对程序功能的理解. ⑵程序注释 正确的注释能够帮助读者理解程序.注释一般分为序言性注释和功能性注释.序言性注释通常位于每个程序的开头部分,它给出了程序的整体说明,主要描述内容包括:程序标题,程序功能说明,主要算法,接口说明,程序位置,开发简历,程序设计者,复审者,复审日期,修改日期等.功能性注释的位置一般嵌在源程序体中,主要描述其后的语句或程序做什么. ⑶视觉组织 为使程序的结构一目了然,可以在程序中利用空格,空行,缩进等技巧使程序的结构层次清晰 驱动程序 1.驱动程序属于什么程序?它的作用是什么? 驱动程序属于系统辅助程序一种 它的作用就是让操作系统能够全面的,详细的了解并控制的硬件 主要的驱动程序有显卡,网卡,声卡,各种外接设备比如打印机,扫描仪等等 CPU、内存这些都不需要驱动程序

亚马逊后台各个按钮功能操作详细讲解

亚马逊后台各个按钮功能操作详解 inventory, Manage Inventory 管理库存界面 Manage FBA Inventory 管理FBA库存界面 Add a Product 上传产品界面 Add Products via Upload 批量上传界面 Inventory Report 库存报告 Manage FBA Shipments 管理FBA运输状态界 面 值得注意的是,在Inventory Report 这个界面中可以下载整个店铺的库存报告 Orders Order Reports 订单报告 Manage Orders 是订单管理

Upload Order Related Files 批量处理订单(主 要是订单确认)Manage Returns 退货管理 值得一提的是,在没有利用ERP软件处理订单而是在亚马逊后台处理订单的时候,在订单量较大的情况下多是要用批量操作来确认订单的,操作界面如下图 Advertising Campaign Manager 点击付费广告界面Promotions 促销设置 Campaign Manager 是指站点击付费广告的设置即SP广告(sponsored product Ads),界面如下

其中,选择关键字目标的获取方式有两种, Automatic targeting 自动生成与 Manual targeting手动键入。 下图为 automatic targeting的界面, Manual targeting的界面与automatic targeting的界面相似,关键词为自己收到收入。 Promotion分为4种类型,通常情况下,前三种用得较多。

linux 设备输入子系统---源代码示例。自动捕获键盘鼠标等外设消息

Linux input 子系统详解与代码示例 李邦柱于杭州2014/01/09 Email:helpylee@https://www.doczj.com/doc/6e3591392.html, 由于linux的驱动模型增加了input层,导致几乎所有的底层驱动都把数据封装在event里上报给input子系统。由此看来,这种改变让kernel 更具有模块化,各个模块的耦合度更低了。下面我们一起来研究input 层^_^ 1.从用户层的角度看input(event事件) 了解linux的人一定会对/dev,/ sys, /proc这几个目录有所印象,这是从内核导出到用户层的接口(从这里几乎可以观览内核)。kernel为我们导出了input在用户态的接口,就是/dev/input/下的接口,所以我们只关注这个目录下的event*(event0/event1/……)字符设备。 那么这些event*是干什么用的?简单来说就是我们对计算机的输入(包括敲击键盘,移动鼠标等等操作)经过内核(底层驱动,input)处理最后就上报到这些event*里面了。 而这里event0,event1,..就是用来区分各个外设的,可以通过命令来查看外设具体和哪个event相关联:这个命令是:cat /proc/bus/input/devices 所以我们用此命令在linux系统查看外设信息。 2.在linux/input.h中有这些数据的结构: structinput_event { structtimeval time; //事件发生的时间 __u16 type; //事件类类型:按键和移动鼠标就是不同类型 __u16 code; __s32 value; //事件值:按键a和按键b就对应不同值 }; code: 事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0~127为键盘上的按键代码,0x110~0x116 为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参

驱动程序入门

什么是驱动程序? 为术语“驱动程序”给出单一的准确定义比较困难。就最基本的意义而言,驱动程序是一个软件组件,可让操作系统和设备彼此通信。例如,假设应用程序需要从设备中读取某些数据。应用程序会调用由操作系统实现的函数,操作系统会调用由驱动程序实现的函数。驱动程序(由设计和制造该设备的同一公司编写)了解如何与设备硬件通信以获取数据。当驱动程序从设备获取数据后,它会将数据返回到操作系统,操作系统将数据返回至应用程序。 扩大定义 到目前为止,我们的说明采用以下几种方式进行简单化: ?并非所有驱动程序都必须由设计该设备的公司编写。在多种情形下,设备根据已发布的硬件标准来设计。这表示驱动程序可以由Microsoft 编写,设备设计者无须提供驱动程序。 ?并非所有驱动程序都直接与设备通信。对于给定的I/O 请求(如从设备读取数据),通常有一些驱动程序(在堆栈中进行分层)参与该请求。可视化堆栈的传统方式是将第一个参与对象放在顶部,将最后一个参与对象放在底部,如此图所示。堆栈中的某些驱动程序可能通过将请求从一种格式转换至另一种格式来参与。这些驱动程序不会与设备直接通信;它们只操纵请求并将请求传递至堆栈下方的驱动程序。

堆栈中直接与设备通信的一个驱动程序称为“函数驱动程序”;执行辅助处理的驱动程序称为“筛选器驱动程序”。 某些筛选器驱动程序遵守并记录有关I/O 请求的信息,但不会主动参与这些请求。例如,某些筛选器驱动程序充当验证程序以确保堆栈中的其他驱动程序正确处理I/O 请求。 我们可以扩大“驱动程序”的定义,方法是表示驱动程序为遵守或参与操作系统与设备之间通信的任一软件组件。 软件驱动程序 我们的扩大定义相当准确,但仍不完整,原因是某些驱动程序与任何硬件设备根本不关联。例如,假设你需要编写可以访问核心操作系统数据结构的工具,这些结构仅可以由内核模式下运行的代码进行访问。可以通过将工具拆分成两个组件来执行该操作。第一个组件在用户模式下运行且提供用户界面。第二个组件在内核模式下运行且可以访问核心操作系统数据。在用户模式下运行的组件称为应用程序,在内核模式下运行的组件称为“软件驱动程序”。软件驱动程序与硬件设备不关联。有关处理器模式的详细信息,请参阅用户模式和内核模式。

EDA键盘扫描

1 绪论 VHDL的英文全名是Very-High-Speed Integrated Circuit HardwareDescription Language,诞生于1982年。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。 VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。 VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。 FPGA(Field Programmable Gate Array)即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA的使用非常灵活,同一片FPGA通过不同的编程数据可以产生不同的电路功能。FPGA在通信、数据处理、网络、仪器、工业控制、军事和航空航天等众多领域得到了广泛应用。随着功耗和成本的进一步降低,FPGA还将进入更多的应用领域。 本设计采用VHDL硬件语言的模块化思想,设计了PS2键盘扫描模块,七段

键盘驱动程序程鼐

EDA技术课程设计任务书 班级:姓名:程鼐学号: 设计题目:键盘驱动程序 一、设计目的 进一步巩固理论知识,培养所学理论知识在实际中的应用能力;掌握EDA设计的一般方法;熟悉一种EDA软件,掌握一般EDA系统的调试方法;利用EDA软件设计一个电子技术综合问题,培养VHDL编程、书写技术报告的能力。为以后进行工程实际问题的研究打下设计基础。 二、设计任务 利用外接键盘实现键盘按键的选择,在8位动态七段数码管上实现按键扫描码的显示,在16X16点阵上实现按键字符的显示。 三、设计要求 (1)通过对相应文献的收集、分析以及总结,给出相应课题的背景、意义及现状研究分析。(2)通过课题设计,掌握计算机组成原理的分析方法和设计方法。 (3)学习按要求编写课程设计报告书,能正确阐述设计和实验结果。 (4)学生应抱着严谨认真的态度积极投入到课程设计过程中,认真查阅相应文献以及实现,给出个人分析、设计以及实现。 四、设计时间安排 查找相关资料(1天)、设计并绘制系统原理图(2天)、编写VHDL程序(2天)、调试(2天)、编写设计报告(2天)和答辩(1天)。 五、主要参考文献 [1] 江国强编著. EDA技术与实用(第三版). 北京:电子工业出版社,2011. [2] 曹昕燕,周凤臣.EDA技术实验与课程设计.北京:清华大学出版社,2006.5 [3] 阎石主编.数字电子技术基础.北京:高等教育出版社,2003. [4] Mark Zwolinski. Digital System Design with VHDL.北京:电子工业出版社,2008 [5] Alan B. Marcovitz Introduction to logic Design.北京:电子工业出版社,2003 指导教师签字:年月日

LINUX系统必备程序安装步骤

1.红帽企业版5获得root权限方法: su root

2. 红帽企业版5 启动samba的方法: a.在安装LINUX的过程中将所有选项都选择上,这样可以确保samba等软件 都已经安装好。 b. 修改/etc/samba/smb.conf,添加: [root] comment = Root Directories browseable = yes writeable = yes path = / valid users = smb(用户名) c.添加用户: RHEL5: Useradd smb //添加smb系统用户 Smbpasswd -a smb //修改密码 d.重新启动samba: /etc/init.d/smb restart e.windows访问LINUX 访问LINUX的IP地址,输入用户名smb及密码就可以正常访问linux了

3.建立tftp服务器: a.在安装LINUX的过程中将所有选项都选择上,这样可以确保tftp等软件都 已经安装好。 b.建立TFTP主工作目录: mkdir /tftpboot c.修改配置文件 vi /etc/xinet d.d/tftp修改内容如下: d.重新启动tftp /etc/init.d/xinetd restart e.确认TFTP启动的是否成功:netstat –a | grep tftp

4.NFS a.配置vi /etc/exports b.重新启动NFS服务器:/etc/init.d/nfs restart

5.升级安装LINUX内核: a.解压缩内核代码tar –xvzf linux-2.6.32.27 b.拷贝config 文件将目录boot下的原先LINUX内核的CONFIG文件复制到 新内核的根目录下名字为.config c.make menuconfig d.make bzImage e.make modules f. make modules_install g.制作init ramdisk: h.内核安装: i.升级内核后重新启动机器所遇到的问题解决办法: 方法:编译时修改.config文件中的“CONFIG_SYSFS_DEPRECATED_V2”,默认该选项为not set,被注释掉的,将其改为y。即修改为 “CONFIG_SYSFS_DEPRECATED_V2=y”,修改后,再编译,重启即正常了。

4×5矩阵键盘驱动程序

4×5矩阵键盘驱动程序 一、工作原理及接口电路 4×5矩阵键盘有4条列线,5条行线共20个按键。每个按键对应不同键值,键盘扫描采用外部中断扫描方式,本系统中键盘为无源结构,键盘工作时不依靠任何外部电源。4×5矩阵键盘结构图如图2-10 所示。 图2-10 4×5矩阵键盘结构图 1)4×5矩阵键盘结构及按键抖动消除 当键盘中按键数量较多时为减少I/O口的占用,通常将按键排列成矩阵形式,如图2-12所示。在矩阵式键盘中,每条行线和列线在交叉处不直接连通,而是通过一个机械弹性开关加以连接。这样5条列线(R0~R4)和4条行线(L0~L3)就可以构成20个按键的矩阵键盘。键盘采用了无源结构,工作是不依靠任何外部电源。 由于机械弹性开关的机械触点的弹性作用,一个按键开关在闭合时并不会马上稳定的闭合,在断开时也不会马上断开,因而机械开关在闭合及断开瞬间均伴有一连串的抖动,如图2-11所示。

图2-11 按键时的抖动 抖动的时间长短由按键开关机械特性及按键的人为因素决定,一般为5ms~20ms。按键抖动如果处理不当会引起一次按键被误处理多次,所以消除抖动是必要的。消除抖动的有硬件处理和软件处理两种方法。当按键较多一般采用软件消抖方式。软件消抖原理为当检测出按键闭合后执行一个延时程序(产生5ms~20ms的延时),待前沿抖动消失后再次检测按键的状态,如果按键仍保持闭合状态则可确认为有键按下。当检测到按键释放并执行延时程序,待后沿抖动消失后才转入按键的处理程序。 1)矩阵键盘的工作原理 从4×5矩阵键盘的4条列线和5条行线分别引出9条端线接于单片机的9个I/O 口,由于键盘采用了无源结构所以行列线的电平由单片机I/O口的电平决定。进入按键处理程序后先使4条列线全为低电平,5条行线全为高电平,为读行线状态做准备,没有按键时这种状态不会被改变。当键盘上的某个按键闭合时,则该键所对应的行线和列线被短路。例如:6号键被按下时列线L2与行线R1被短路,此时行线R1电平被列线L2拉低,由原来的高电平变为低电平而其它行线电平依然不变,为低电平。此时单片机可读得行线状态进而判断按键所在行并记录下行号。之后使得4条列线全为高电平,5条行线全为低电平,为读列线状态做准备。同理6号键被按下时列线L2与行线R1被短路,此时列线L2电平被行线R1拉低,由原来的高电平变为低电平而其它行线电平依然不变,为低电平。此时单片机可读得列线状态进而判断按键所在列并记录下列号。然后按一定的按键编码规则可计算出6号键的键值。 2)键盘扫描方式 键盘扫描方式一般有三种:循环扫描方式,定时扫描方式,外部中断扫描方式。循环扫描方式需要不停地扫描键盘,影响其它功能执行工作效率低。定时扫描方式是利用单片机内部的定时器,产生一个适当时间的定时中断,单片机响应中断时对键盘进行扫描取键值过程,但是这种扫描方式不管键盘上是不是有键闭合单片机总是定时地扫描工作效率还是不高。外部中断扫描方式是只在键盘上有

相关主题
文本预览
相关文档 最新文档