键盘中断驱动实验
嵌入式中断按键实验报告

嵌入式中断按键实验报告本实验的目的是学习如何在嵌入式系统中使用中断来处理按键输入。
通过该实验,我们可以掌握如何配置和使用中断,以及如何编写中断服务程序来处理按键输入。
实验材料:1. 嵌入式开发板2. 按键模块3. 电源适配器实验步骤:1. 将按键模块连接到嵌入式开发板的GPIO引脚上,确保连接正确。
2. 打开开发板的开关,给开发板供电。
3. 在开发板上配置GPIO引脚作为中断输入,并使能中断。
4. 编写中断服务程序来处理按键输入。
当按键被按下时,中断服务程序将被调用,并执行相应的操作。
5. 在主程序中初始化中断服务程序,并进入一个无限循环。
在该循环中,可以进行其他的操作,并等待按键中断的发生。
实验结果:在实验中,我们成功地配置并使用了中断来处理按键输入。
当按键被按下时,中断服务程序被调用,并执行了相应的操作。
讨论与分析:通过该实验,我们学习到了中断的基本原理和使用方法。
中断是一种非常重要的机制,可以使嵌入式系统更高效地响应外部事件。
在实际的嵌入式应用中,按键输入是非常常见的操作,使用中断可以很好地处理按键输入,提高系统的响应速度和可靠性。
然而,中断也存在一些问题。
首先,中断处理需要一定的时间,在高速的系统中,中断的处理时间可能会影响到系统的性能。
另外,当系统存在多个中断源时,中断处理的优先级和调度也需要仔细设计,以确保系统的正常运行。
总结:通过本实验,我们成功地学习了嵌入式系统中使用中断处理按键输入的方法。
中断是一种重要的机制,可以使系统更高效地响应外部事件。
通过合理地设计和使用中断,可以提高系统的性能和可靠性。
在实际的嵌入式应用中,我们应该根据具体的需求和系统条件来选择最合适的中断处理方法,并进行适当的优化和调试。
键盘中断微机实验报告

键盘中断微机实验报告1. 引言键盘中断是计算机硬件系统中常见的一种输入设备中断方式,其功能是在用户通过键盘输入时,中断处理器正常运行的流程,将键盘输入的数据传递给操作系统供其处理。
本次实验旨在通过搭建一个简单的键盘中断实验系统,加深对键盘中断原理及操作的理解。
2. 实验原理2.1 键盘中断键盘中断是一种异步的硬件中断方式,即键盘通过给中断控制设备发送中断请求信号,从而将中断信息传递给CPU。
一旦发生键盘中断,CPU将停止当前执行的任务,跳转到事先设置好的中断处理程序,处理键盘中断事件。
2.2 实验系统本次实验使用Intel 8086微处理器、键盘控制器8042和键盘作为实验系统的主要硬件设备。
系统的基本结构如下图所示:与中断控制器连接。
- 打开中断屏蔽位,以允许中断请求通过。
3.4 运行实验程序完成前述步骤后,我们可以运行实验程序,测试键盘中断的正常工作。
当用户按下键盘时,键盘中断会触发,并将键盘输入的数据传递给中断处理程序进行处理。
4. 实验结果与分析经过测试,我们发现实验系统能够正确地接收和处理键盘输入的数据。
实验 8-2 键盘中断驱动实验

实验8-2 键盘中断驱动实验【实验目的】掌握键盘原理。
熟悉驱动的中断机制。
【实验步骤】第一步:利用vi编辑器,编写一个Keypad.c驱动代码;1、增加驱动所需的头文件和变量#include<linux/module.h>#include<linux/kernel.h>#include<linux/init.h>#include<linux/delay.h>#include<linux/poll.h>#include<linux/spinlock.h>#include<asm/hardware.h>#include<asm/arch-pxa/pxa-regs.h>MODULE_LICENSE("GPL");#define DEVICE_NAME "emdoor_kbd"#define KEYVALUE_HAVE 1#define KEYVALUE_NO 0#define KPC_DIR 1<<5#define KPC_MAT 1<<22static int Emdoor_kbd_fasync(int, struct file* ,int); typedef unsigned char KBD_RET;struct fasync_struct * fasync;//键盘结构体定义typedef struct {KBD_RET kbd_buff; /* protect against overrun */ unsigned int kbd_status;wait_queue_head_t wq;spinlock_t lock;} KBD_DEV;2、实现键盘驱动读操作函数static ssize_t Emdoor_kbd_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){KBD_DEV * kbd=filp->private_data;KBD_RET kbd_ret;while(1){if(kbd->kbd_status==KEYVALUE_HAVE){kbd_ret = kbd->kbd_buff;copy_to_user(buffer, &kbd_ret, sizeof(KBD_RET));kbd->kbd_status=KEYVALUE_NO;return sizeof(KBD_RET);}else{if (filp->f_flags & O_NONBLOCK)return -EAGAIN;interruptible_sleep_on(&(kbd->wq));if (signal_pending(current))return -ERESTARTSYS;}}return sizeof(KBD_RET);}3、实现键盘驱动中断服务例程static void Emdoor_isr_kbd(int irq, void *dev_id, struct pt_regs *reg){printk(KERN_EMERG"Emdoor_isr_kbd,Interrupt\n");int kpc_value;KBD_DEV * kbd = (KBD_DEV *) dev_id;spin_lock_irq(&(kbd->lock));kpc_value=KPC;if(kpc_value&KPC_MAT) {kbd->kbd_buff=KPAS&0xFF;if(kbd->kbd_buff!=0xFF){switch(kbd->kbd_buff){case 0x0: kbd->kbd_buff=5; break;case 0x1: kbd->kbd_buff=6; break;case 0x2: kbd->kbd_buff=7; break;case 0x5: kbd->kbd_buff=8; break;case 0x10: kbd->kbd_buff=9; break;case 0x11: kbd->kbd_buff=10; break;case 0x12: kbd->kbd_buff=11; break;case 0x15: kbd->kbd_buff=12; break;case 0x20: kbd->kbd_buff=13; break;case 0x21: kbd->kbd_buff=14; break;case 0x22: kbd->kbd_buff=15; break;case 0x25: kbd->kbd_buff=16; break;default: break;}kbd->kbd_status=KEYVALUE_HAVE;}}else if(kpc_value&KPC_DIR){kbd->kbd_buff=KPDK&0xFF;if(kbd->kbd_buff!=0x0){switch(kbd->kbd_buff){case 0x40: kbd->kbd_buff=1; break;case 0x2: kbd->kbd_buff=2; break;case 0x4: kbd->kbd_buff=3; break;case 0x20: kbd->kbd_buff=4; break;default: break;}kbd->kbd_status=KEYVALUE_HAVE;}}if ( fasync )kill_fasync( &(fasync), SIGIO, POLL_IN );wake_up_interruptible(&(kbd->wq));spin_unlock_irq(&(kbd->lock));}4、实现键盘驱动设备打开操作函数static int Emdoor_kbd_open(struct inode *inode, struct file *filp) {int ret;printk(KERN_EMERG " Emdoor_kbd_open!\n");KBD_DEV * kbd;kbd =(KBD_DEV *) kmalloc(sizeof(KBD_DEV ), GFP_KERNEL);KPC=KPC_ASACT | (3<<26) | (7<<23 ) | KPC_IMKP | KPC_MS6 |KPC_MS5 |KPC_MS4 | KPC_MS3 | KPC_MS2 | KPC_MS1 | KPC_MS0 | KPC_ME |KPC_MIE | (7<<6) | KPC_DE | KPC_DIE;init_waitqueue_head(&(kbd->wq));pxa_gpio_mode(94 | GPIO_ALT_FN_1_IN);//KP_DKIN<1>pxa_gpio_mode(95 | GPIO_ALT_FN_1_IN);//KP_DKIN<2>pxa_gpio_mode(98 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(99 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(100 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(101 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(102 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(103 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<0>pxa_gpio_mode(104 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<1>pxa_gpio_mode(105 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<2>pxa_gpio_mode(108 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<5>kbd->kbd_status=KEYVALUE_NO;filp->private_data=kbd;ret = request_irq(IRQ_KEYPAD, Emdoor_isr_kbd, SA_INTERRUPT, DEVICE_NAME, kbd);if (ret){printk(KERN_EMERG " Interrupt init=%x!!!!\n",ret);return ret;}return 0;}5、实现键盘驱动select和poll操作函数static unsigned int Emdoor_kbd_poll(struct file *filp,struct poll_table_struct *wait){printk(KERN_EMERG " Emdoor_kbd_poll!\n");KBD_DEV * kbd=filp->private_data;poll_wait(filp,&(kbd->wq),wait);return (kbd->kbd_status==KEYVALUE_HAVE) ? (POLLIN|POLLRDNORM): 0 ;}static int Emdoor_kbd_release(struct inode *inode, struct file *filp){printk(KERN_EMERG " Emdoor_kbd_release!\n");KBD_DEV * kbd = filp->private_data;KPC=0x0;Emdoor_kbd_fasync(-1, filp, 0);kfree(kbd );free_irq(IRQ_KEYPAD, kbd);return 0;}6、实现键盘驱动非阻塞访问操作函数static int Emdoor_kbd_fasync(int fd, struct file * file, int mode) {return fasync_helper(fd, file, mode, &(fasync) );}7、键盘驱动文件结构体定义static struct file_operations Keypad_fops = {open: Emdoor_kbd_open,read: Emdoor_kbd_read,release: Emdoor_kbd_release,poll: Emdoor_kbd_poll,fasync: Emdoor_kbd_fasync,owner: THIS_MODULE,};8、键盘驱动初始化函数定义static int __init Emdoor_kbd_init(void){printk(KERN_EMERG " Emdoor_kpd initialized\n");int ret;ret = register_chrdev(62, DEVICE_NAME, &Keypad_fops);if (ret < 0) {printk(DEVICE_NAME " can't get major number\n");return ret;}free_irq(IRQ_KEYPAD,NULL);udelay(10);return 0;}9、键盘驱动退出函数定义static void __exit Emdoor_kbd_exit(void){printk(KERN_EMERG " Emdoor_kpd exit\n");unregister_chrdev(62, DEVICE_NAME);}module_init(Emdoor_kbd_init);module_exit(Emdoor_kbd_exit);MODULE_AUTHOR("Ben.li@");MODULE_DESCRIPTION("This is a Keypad driver demo");第二步: 利用vi编辑器,编写一个用于编译Keypad驱动的Makefile# Makefile for the Keypad. #CFLAGS +=$(DEBFLAGS) -Wallifneq ($(KERNELRELEASE),)obj-m :=Keypad.oelseKERNELDIR ?=/root/work/linux-2.6.9PWD :=$(shell pwd)ALL:$(MAKE) $(CFLAGS) -C $(KERNELDIR) M=$(PWD) modulesendifclean:rm -fr *.o *.ko *~ core .depend .*.cmd *.mod.c .tmp_versions第三步:运行make编译命令,用ls命令查看编译后的结果,在该目录中应生成Keypad.ko模块文件,利用file命令查看Keypad.ko文件的格式,应为ARM 格式的ELF文件。
实验二 按键中断实验

实验二按键中断实验一、实验目的了解中断的含义二、实验内容板子加电后,按动板子上K1-K3按键,可控制对应的LED1-LED3的亮灭,该实验学习了外部中断(EXTI)程序的编制及控制流程。
三、实验仪器、设备计算机、开发板、keil软件四、硬件设计在开发板上V6、V7、V8分别与MCU的PB5、PD6、PD3相连,如下图所示键盘部分如下图所示:例程所用到的列扫描线:PC5,PC2,PC3。
例程所用到的行扫描线(EXTI中断线):PE2。
五、实验要求和步骤开发板上有3个蓝色状态指示灯V6(LED1),V7(LED2),V8(LED3),通过对应的按键K1-K3,控制LED的亮灭,将PE2引脚配置为外部中断,当其上出现下降沿时产生一个中断,根据扫描PC5,PC2,PC3来判别是哪个按键按下。
首先我们了解一下什么是外部中断/事件控制器(EXTI)。
外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。
每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。
每个输入线都可以被独立的屏蔽。
挂起寄存器保持着状态线的中断要求。
EXTI控制器的主要特性如下:每个中断/事件都有独立的触发和屏蔽每个中断线都有专用的状态位支持多达19 个中断/事件请求检测脉冲宽度低于APB2 时种宽度的外部信号如要产生中断,中断线必须事先配置好并被激活。
这是根据需要的边沿检测通过设置2个触发寄存器,和在中断屏蔽寄存器的相应位写“1”到来允许中断请求。
当需要的边沿在外部中断线上发生时,将产生一个中断请求,对应的挂起位也随之被置1。
通过写“1”到挂起寄存器,可以清除该中断请求。
为产生事件触发,事件连接线必须事先配置好并被激活。
这是根据需要的边沿检测通过设置2个触发寄存器,和在事件屏蔽寄存器的相应位写“1”到来允许事件请求。
当需要的边沿在事件连线上发生时,将产生一个事件请求脉冲,对应的挂起位不被置1。
嵌入式KL25 键盘中断实验

嵌入式KL25 键盘中断实验实验五键盘中断实验一、实验目的1.熟练运用CodeWarrior嵌入式开发系统环境、C语言、调试方式。
2.复习串行通信接口(SCI)的内容。
3.加强键盘中断基本原理及编程原理的理解。
4.理解“行扫描”法的原理并能进行键值识别和键值编码。
5.理解键盘接线原理图(如图5-1)。
二、知识要点本实验采用的是4×4矩阵式键盘(以下简称键盘)。
PTG4、PTD2、PTD3、PTD7分别接四根列线,定义为输入且上拉,PTG0~PTG3分别接四根行线,且定义为输出。
行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。
这样就可以确定是哪一行哪一列交点的键被按下。
MCU与键盘接线原理图:键盘的c语言编程:1)初始化,先按IO口方式初始化,即定义列线为输入且上拉,行线为输出,然后依输入口的键盘功能初始化相应的寄存器。
2)定义键值表3)扫描一次,读取键值4)获得键盘定义值行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。
这样就可以确定是哪一行哪一列交点的键被按下。
设置键盘中断允许寄存器,当键盘有键被按下时,立即产生中断,中断程序处理按键事件,比如确定哪个键被按下,然后转换为该键的定义值。
键盘的键面标示码(即定义值)与MCU 识别的键值对应关系通过列表对应起来,即键盘定义表对应表示。
当通过“行扫描”法获得某个键的键值时,通过查表法就可以得到它的定义值。
该键盘中断方式程序的主程序主体是一个死循环,且是一个空循环体,所有处理的过程代码放在中断程序中。
三、演示性实验在光盘资料中提供读者键盘实例程序文件夹。
编程采用规范要求编写,将键盘独立成一个构件,如C 语言中,形成key.h 头文件和key.c 源文件。
按键的中断的实验

按键的中断编程实验
一.实验目的
1.掌握用C51对外不中断设置的方法
2.掌握按键用C51进行识别的方法
二.实验要求
1.基本要求
(1)能够对有关中断的各个寄存器进行设置
(2)能够用C51编写中断服务程序,当每按一下按键,在中断服务程序中实现数码管上显示数据从0以步进为1的步调增加。
2.扩展要求
(1)用实验板上的上下左右按键做一个秒表,其中做按键作为启动按键,上按键作为清零按键,右按键作为停止按键。
三.实验电路原理图
电路图如下图(1)
四.实验原理简介
(1)每进入中断一次实现数码管上显示数据加1,且按按键时蜂鸣器发声。
(2) 配合上下左右按键做一秒表,要求按左键的话秒表启动,按右键的
话秒表停止,按上键的话秒表清零。
C8
C9
(移)(加)(移)(减)
IN4148X4
图(1)。
《键盘中断实验》课件

中断控制器
控制计算机系统中断的硬 件设备,负责处理外部设 备的中断请求。
实验原理说明
键盘中断
当用户按下键盘上的键时,键盘会产 生一个中断信号,发送给中断控制器 。
中断返回
中断处理程序执行完毕后,中断控制 器恢复被中断的程序执行,继续执行 后续指令。
中断处理
中断控制器接收到键盘中断信号后, 会暂停当前执行的程序,保存程序执 行现场,转而执行相应的中断处理程 序。
异常(Exception):由处理器内部产生的异常事件,例如除以零或访问无效内存地 址。
02
键盘中断实验原理
BIG DATA EMPOWERS TO CREATE A NEW
ERA
实验设备介绍
01
02
03
实验设备
计算机、键盘、中断控制 器
键盘
用于输入字符和命令的外 部设备,通过电缆连接到 计算机。
实验步骤概述
准备实验设备
连接好键盘与计算机,开 启计算机。
观察现象
在程序运行过程中按下键 盘上的键,观察计算机的 反应。
分析结果
根据实验现象,分析键盘 中断的产生和处理过程。
03
实验操作过程
BIG DATA EMPOWERS TO CREATE A NEW
ERA
实验环境搭建
准备实验设备
计算机、键盘、数据采 集卡、信号放大器等。
代码优化
根据测试结果,对代码进行优化和 改进,提高其稳定性和效率。
实验结果分析
数据整理
对采集到的实验数据进行整理和 分析,提取出有用的信息。
结果对比
将实验结果与理论值进行对比, 分析误差产生的原因。
结果讨论
根据实验结果,讨论键盘中断对 计算机性能的影响,并提出改进
键盘中断实验(1)

南通大学实验报告院系:计算机科学与技术姓名:课程名称:接口技术成绩:学号:1213022013指导教师:李跃华同组实验者:实验日期:2014-5-7实验名称:键盘中断实验一.实验目的1.熟练运用CodeWarrior 嵌入式开发系统环境、C 语言、调试方式。
2.复习串行通信接口(SCI)的内容。
3.加强键盘中断基本原理及编程原理的理解。
4.理解“行扫描”法的原理并能进行键值识别和键值编码二.实验内容键盘的c 语言编程:1)初始化,先按IO 口方式初始化,即定义列线为输入且上拉,行线为输出,然后依输入口的键盘功能初始化相应的寄存器。
2)定义键值表3)扫描一次,读取键值4)获得键盘定义值行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。
这样就可以确定是哪一行哪一列交点的键被按下。
2. 软件设计三程序流程图四编程1.内核定时器中断void tpm0_isr(void){static uint_32 TPMCounter = 0; //计时器uint_8 value; //键盘变量static uint_8 LEDindex=0; //位选口声明uint_8 LEDDataBuffer[4]; //LED显示缓冲区uint_8 i;//LED缓冲区赋值LEDDataBuffer[0]='0';LEDDataBuffer[1]='2';LEDDataBuffer[2]='3';LEDDataBuffer[3]='5';//LCD显示缓冲区,其中.表示按下的数字uint_8 kbv[32]="The keyboard you just input is .";if((TPM_SC_REG(TPM0_BASE_PTR) & TPM_SC_TOF_MASK) == TPM_SC_TOF_MASK) {TPMCounter++;}BSET(TPM_SC_TOF_SHIFT,TPM_SC_REG(TPM0_BASE_P TR)); //中断置标志位写1清0//处理LED部分LEDindex++;//位选位+1if (LEDindex>=4) LEDindex=0; //大于4位选口置0i=LEDchangeCode(LEDDataBuffer[LEDindex]-'0');//转码LEDshow1(LEDindex,i);//显示LEDif(TPMCounter>100){TPMCounter = 0;//键盘得到扫描值value = KBScanN(2);//扫描键值,存于value中if(KBDef(value) != 0xff) //发送键值{//修改.成为按键值kbv[31] = KBDef(value);//通过LCD显示出来LCDShow(kbv);uart_send_string(UART_2,kbv);//键盘发送信息}}}2.程序的入口int main(void){//1.声明主函数使用的局部变量uint_8 * g_DispalyInit;//2.关总中断enter_critical();//3.初始化底层模块uart_init (UART_1,BUSCLK, 9600); //串口1初始化, 总线时钟24000Khz,波特率9600LEDInit();//LED初始化LCDInit();//LCD初始化KBInit(); //键盘初始化tpm_init(TPM0,TPM_CLKSRC_PLL,1000);//初始化TPM模块,1ms中断一次//4.缓冲区赋值g_DispalyInit = (uint_8 *)"Wait Receiving..Soochow 2013.01.";//5.开中断tpm_enable_int(0);init_critical();//6.lcd显示初始字符LCDShow(g_DispalyInit);//================================= ================================== ========for(;;){}//============================================return 0;}四.实验小结在这次实验中主要让我们熟悉掌握gpio口通信的知识,在熟悉代码的前提下在主函数里初始化波特率何在中断函数里添加一个接收函数就可以。
嵌入式KL键盘中断实验

嵌入式KL键盘中断实验
嵌入式KL键盘中断实验是一种使用嵌入式系统的KL键盘进
行中断方式实验的方法。
在嵌入式系统中,中断是一种常用的机制,用于实现多任务处理和实时系统。
在键盘输入中断实验中,我们可以利用KL键
盘的中断功能,实现在用户按下键盘按键时自动触发中断,并进行相应的处理。
实验步骤如下:
1. 准备硬件环境:使用KL键盘连接到嵌入式系统的对应接口。
2. 配置中断:通过编程设置KL键盘对应的中断引脚,使其可
以触发中断。
具体实现方法根据所用的嵌入式系统和开发工具不同而有所差异,可以查阅相应的文档和资料进行配置。
3. 编写中断处理程序:在嵌入式系统中,中断处理程序是在中断发生时被调用的函数。
我们需要编写一个中断处理程序来响应键盘中断,并进行相应的处理,比如读取键盘输入的字符并进行显示或其他操作。
4. 注册中断处理程序:将编写的中断处理程序注册到嵌入式系统的中断向量表中,以便系统在中断发生时能够找到并执行该程序。
5. 运行实验:启动嵌入式系统,按下KL键盘的按键,触发中
断并执行中断处理程序。
根据编写的中断处理程序的功能,可以在显示屏上显示按下的按键字符或进行其他操作。
需要注意的是,不同的嵌入式系统和开发工具对于中断的实现方式和配置方法可能存在差异,具体的实验步骤和代码实现可能需要根据具体的情况进行调整。
建议在进行实验前充分了解相关的文档和资料,以确保正确实施实验。
实验五 中断驱动实验—戴国庆

班级:计算机科学与技术姓名:***学号:***********实验五中断驱动实验一. 实验目的了解STM32微控制器的中断特性,熟悉GPIO的复用功能和中断特点,掌握使用中断驱动方式检测外设状态以及编写中断服务程序的方法。
二. 实验内容编写NVIC初始化和EXTI初始化函数,完成中断驱动方式的按键检测程序、以及中断服务程序,使用软件模拟运行和调试程序。
配合LED驱动程序,使用硬件仿真器下载、运行和调试程序,实现按下KEY1按键,中断服务程序控制对应LED1灯亮起一段时间后灭;按下KEY2键,LED2灯灯亮起一段时间后灭。
KEY1和KEY2设置不同的抢占优先级实现中断嵌套。
三.实验要求1.结合按键和LED等显示效果,体会中断的功能和应用。
2.编写实验报告:写出详细的项目开发过程,上机调试过程(软件仿真和硬件仿真)。
写出实验总结以及实验的心得体会。
四.实验步骤按键中断:1.根据按键状态控制LED灯亮灭按键KEY有按下来,产生中断请求2.KEY在目标板上的连接PA0、PC13、依次连接2个KEY1、KEY2按钮按下时,相应GPIO引脚输入低电平(0),否则输入高电平(1)3.程序的功能是按下按钮KEY1对应LED1亮一段时间,然后熄灭LED1接PB0,KEY1接PA0具体实现:1.时钟配置NVIC在内核里,使用内核时钟,在启动代码里有SystemInit ()函数,使系统时钟为72MHZ,需要用户配置的是GPIO 的时钟2.NVIC初始化配置首先,选择优先级组号(即0~4共5种形式)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);// 本例中,只有1个中断源,选用1组优先级配置其次,调用misc.c文件的NVIC初始化函数v oid NVIC_Init( NVIC_InitTypeDef * NVIC_InitStruct )参数NVIC_InitStruct是指向NVIC_InitTypeDef结构的指针typedef struct{uint8_t NVIC_IRQChannel;uint8_t NVIC_IRQChannelPreemptionPriority;uint8_t NVIC_IRQChannelSubPriority;FunctionalState NVIC_IRQChannelCmd;} NVIC_InitTypeDef;3.配置GPIO端口工作方式GPIO配置PB0驱动LED1灯,其工作模式配置为推免输出代码:/*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB|, ENABLE);/*选择要控制的GPIOB引脚*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;/*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/*设置引脚速率为50MHz */GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/*调用库函数,初始化GPIOB0*/GPIO_Init(GPIOB, &GPIO_InitStructure);KEY1接PA0,PA0引脚配置为上拉输入模式GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure);4.EXTI初始化配置调用stm32f10x_exti.c中的EXTI初始化配置void EXTI_Init( EXTI_InitTypeDef * EXTI_InitStruct )参数EXTI_InitStruct是指向EXTI_InitTypeDef结构的指针typedef struct{uint32_t EXTI_Line; /* 指明EXTI线*/EXTIMode_TypeDef EXTI_Mode; /* 指明工作模式*/EXTITrigger_TypeDef EXTI_Trigger; /* 指明有效边沿*/FunctionalState EXTI_LineCmd; /* ENABLE或DISABLE */}EXTI_InitTypeDef;5.配置GPIO和EXTI映射关系首先,对进行中断请求的GPIO引脚进行初始化配置例如设置按键引脚为下拉输入或浮空输入模式也可以在配置NVIC之前进行其次,调用stm32f10x_gpio.c的EXTI线配置函数void GPIO_EXTILineConfig ( uint8_t GPIO_PortSource, uint8_t GPIO_PinSource )GPIO_PortSource选择作为EXTI线的GPIO端口形如GPIO_PortSourceGPIOx(x是A~G)GPIO_PinSource指明配置的EXTI线(GPIO引脚)形如GPIO_PinSourcex(x是0~15)本例代码:GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);6.中断服务程序stm32f10x_it.cMDK 为方便用户编写中断服务程序,特别提供了文件stm3210x_it.c(以及配套的头文件stm3210x_it.h)。
嵌入式实验3按键实验(中断方式)

嵌入式实验3按键实验(中断方式)河南机电高等专科学校《嵌入式系统开发》课程实验报告系部:电子通信工程系班级:电信1##姓名: ######学号: 120######实验三按键实验(中断方式)一.实验简介在实验一的基础上,使用按键控制流水灯。
二.实验目的熟练使用库函数操作GPIO,掌握中断配置和中断服务程序编写方法,掌握通过全局变量在中断服务程序和主程序间通信的方法。
三.实验内容实现初始化GPIO,并配置中断,在中断服务程序中通过修改全局变量,达到控制流水灯速度及方向。
下载代码到目标板,查看运行结果。
四.实验设备硬件部分:PC计算机(宿主机)、STM32实验板。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤1在实验一代码的基础上,编写中断初始化代码2在主程序中声明全局变量,用于和中断服务程序通信,编写完成主程序3编写中断服务程序4编译代码,下载到实验板5.单步调试6记录实验过程,撰写实验报告六.实验结果及测试中断方式的按键式实验,是通过配置外部中断寄存器和中断嵌套(NVIC)控制器来实现按键按下控制LED灯亮灭。
通过按键中断打断主函数,执行LED1取反一次。
主函数初始化中断配置和LED配置,点亮LED1后一直等待中断,每中断一次,LED1取反一次。
int main(void){LED_GPIO_Config();LED1_ON;CLI();SEI();EXTI_PA0_Config();while(1){}}中断嵌套控制寄存器的配置为中断嵌套分组1;抢占优先级0;响应优先级0 代码如下:void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}外部中断按键的配置源码如下:配置PA0位中断线,并使能AFIO 时钟void EXTI_PA0_Config(void){GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);NVIC_Configuration();GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);}产生中断后程序进入中断服务子程序,将LED1取反,并软件清除标志位,中断服务子程序如下:void EXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0) != RESET){LED1_TOGGLE;EXTI_ClearITPendingBit(EXTI_Line0);}}七.实验总结通过这次实验,课程知识的实用性很强,因此实验就显得非常重要,刚开始做实验的时候,由于自己的理论知识基础不好,在实验过程遇到了许多的难题,也使我感到理论知识的重要性。
实验三_键盘中断程序

中断实现——实验三一、实验目的1. 理解LC-3模型机的中断机制,使用LC-3指令集进行汇编编程2. 实现中断驱动I/O效果,进一步加深对中断驱动I/O工作原理的理解二、实验内容1. 实验环境,如操作系统环境(Windows XP)、软件(LC-3 simulator、LC3Edit)2. 问题描述中断驱动I/O中断一个正在运行的程序,执行中断服务程序,执行完后,返回被中断的程序,接着被中断的指令,继续执行。
在这个试验中,采用键盘作为输入设备中断程序。
三、分析与实现1. 分析问题,详述分析过程这个程序被分成了三个部分(用户程序代码、中断程序代码、延时程序代码),阐述每个部分如何实现的,以及分析能否在程序中应用其他自陷程序,说明为什么;说明中断程序存放内存位置,尝试放在其他位置是否可以。
2. 画出程序运行示意图3. 代码实现(若程序代码过于冗长,可放在附录部分;此处必须包含主要的功能代码)4. 运行程序的步骤阐述一下,运行此程序的步骤。
四、实验结果1. 常态运行结果截图2. 极端情况下的运行结果截图3. 对程序结果作出必要的文字描述,并分析运行结果五、心得体会在实验过程中,对自己的分析问题、动手编程、耐心等能力进行自我评价,认识自己的不足,逐步在认识自我中提高自身;把对实验的内容与课程内容进行联系,谈谈自己的收获。
六、参考资料1. 《Guide to Using the Windows version of the LC-3 Simulator and LC3Edit》2. 《计算机系统概论·英文版·第二版》3. 其他资料七、附录1. 全部程序代码,包含详细注释2. 其他。
实验三 键盘中断实验报告

苏州大学实验报告院、系 年级专业 姓名 学号 课程名称 成绩 指导教师 同组实验者 实验日期 实验名称: 键盘中断实验一.实验目的通过该实验实习,能够熟练运用MT-IDE 嵌入式开发系统环境、汇编和C 语言以及调试方式;复习SCI 的内容;加强键盘中断的基本原理及编程原理的理解;能够理解“行扫描”法的原理并且运用它进行键盘中断的编程。
二.实验内容理解键盘模块和键盘中断点的原理,使用“行扫描”法编写一个中断方式的的键盘程序,并转化成定义值后,通过串口分别发往PC 机的VB 编写的界面中显示。
三.实验过程(一)接线图(二)基本原理GP32的A 口的8根引脚与键盘中断模块(KBI )的引脚复用。
作为KBI 引脚时,8个引脚分别称为KBIE7- KBIE0。
它们提供了以中断方式识别是否有按键按下的硬件手段。
当然,如果不以中断方式识别键盘按键,可以屏蔽键盘中断,把A 口作为一般I/O 口对待。
CPU 对键盘扫描可以采取程序控制的随机方式,CPU 可以在空闲时扫描键盘。
也可以采用定时控制,每隔一定时间,对键盘扫描一次,CPU 可以随时响应键盘输入中断。
采用中断方式,当键盘上有键闭合时,键盘向CPU 请求中断,CPU 响应键盘输入中断,对键盘扫描,以识别哪一个键处于闭合状态,并对键盘输入信息作出响应处理。
CPU 对键盘上闭合键的键号确定,可以根据行线和列线的状态计算求得,也可以通过行线和列线的状态查表求得。
四.编程图1 键盘接线原理图行线(一)流程图(二)所用寄存器名称及其各个位1.汇编方式:图2 键盘中断流程图(中断方式主程序及其中断子程序)2.C语言方式:1.本实验中用的是键盘中断编程方式,也可以使用查询编程方式,请尽量少修改代码改用查询编程方式重新编写相应的子程序和主程序。
提示:注意重键问题。
答:只要把键盘中断子程序的内容放到主函数的循环中就可以了。
同时去掉中断向量表中关于键盘中断的中断设置。
2.识别是否有键按下以及哪个键被按下有哪些方法?答:识别是否有键被按下,主要有查询法、定时扫描法与中断法。
键盘和中断实验课程设计

键盘和中断实验课程设计一、教学目标本课程的学习目标主要包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握键盘和中断的基本概念、原理和应用。
技能目标要求学生能够运用所学的知识进行键盘和中断实验,并能够分析实验结果。
情感态度价值观目标要求学生培养对科学实验的兴趣和热情,增强团队合作意识和问题解决能力。
通过本课程的学习,学生将能够理解键盘和中断在计算机系统中的重要作用,掌握相关的实验操作技能,并能够运用所学知识解决实际问题。
同时,学生也将培养对科学实验的兴趣和热情,增强团队合作意识和问题解决能力。
二、教学内容本课程的教学内容主要包括键盘和中断的基本概念、原理和应用。
首先,将介绍键盘的基本结构和原理,包括键盘的组成、工作原理和编码方式。
然后,将介绍中断的概念和作用,包括中断的类型、处理过程和在中断中进行的操作。
最后,将结合实际案例,介绍键盘和中断在计算机系统中的应用,如键盘输入处理、中断服务例程的编写等。
教学内容的安排将根据学生的学习情况和教学进度进行调整,确保学生能够充分理解和掌握所学知识。
教材将选用权威的专业书籍,并结合实际的案例和实验来进行教学。
三、教学方法本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
首先,通过讲授法向学生传授键盘和中断的基本概念和原理。
然后,通过讨论法引导学生进行思考和交流,培养学生的批判性思维和问题解决能力。
接着,通过案例分析法让学生结合实际案例进行分析和讨论,加深对知识的理解和应用。
最后,通过实验法让学生亲自动手进行实验,培养学生的实践能力和创新精神。
教学方法的选择将根据学生的学习情况和教学目标进行调整,以最大程度地激发学生的学习兴趣和主动性。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备等。
教材将选用权威的专业书籍,以保证学生能够获得准确和全面的知识。
参考书将提供更多的相关资料和案例,以丰富学生的学习体验。
多媒体资料将通过图像、视频等形式展示键盘和中断的原理和实验过程,以帮助学生更好地理解和记忆。
实验三键盘中断实验

昆明理工大学信息工程与自动化学院学生实验报告(2011 —2012 学年第 2 学期)课程名称:嵌入式技术基础与实验开课实验室:信自楼234 2012 年 5 月 10 日年级、专业、班自动化092 学号姓名成绩实验项目名称键盘中断实验指导教师教师评语教师签名:年月日注:报告内容按实验须知中七点要求进行。
一、实验目的1、熟练运用CodeWarrior嵌入式开发系统环境、汇编、C语言、调试方式;2、复习串行通信接口(SCI)的内容;3、加强键盘中断基本原理及编程原理的理解;4、理解行扫描法的原理并能进行键值识别和键值编码;5、理解键盘接线原理图。
(如图5-1所示)二、实验原理及基本技术路线图(方框原理图)本实验采用4x4矩阵式键盘。
PTG4、PTD2、PTD3、PTD7分别接四根线,定义为输入且上拉,PTG0-PTG3分别接四根行线,且定义为输出行扫描法是使每一行输出低电平,,其余行为高电平,然后读取列值,如果列值中有低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,知道扫描完全部的行为止。
这样就可以知道哪一行哪一列交点键被按下。
MCU与键盘接线原理如下图3-1 I/O 口引脚的连接图三、所用仪器、材料(设备名称、型号、规格等)飞思卡尔试验箱四、实验方法、步骤低电平1、资源使用键盘的-数据线分别接在MCU G 口的 0-4 号引脚、 D 口的 2、3、7号引脚。
MCU 的SCI 发送引脚 E 口的 0号引脚接MAX232的TTL 电平接收引脚( 11号),MCU 的SCI 接收引脚 E 口的 1号引脚接MAX232的TTL 电平发送引脚( 12号)2、硬件设计先阅读源程序,查看相应的端口的宏定义,再根据端口号来接线。
3、软件设计(主要的程序流程图)AW60 键盘 MAX232 计算机4、编程(关键性程序段)PC接收函数private void SCIPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e){String str = String.Empty;bool Flag;//标记串口接收数据是否成功int len;//标记接收的数据的长度//调用串口接收函数,并返回结果Flag = sci.SCIReceiveData(SCIPort,ref PublicVar.g_ReceiveByteArray);if (Flag == true)//串口接收数据成功{len = PublicVar.g_ReceiveByteArray.Length;//对于字符串形式,考虑到可能有汉字,//直接调用系统定义的函数,处理整个字符串str = Encoding.Default.GetString(PublicVar.g_ReceiveByteArray);SCIUpdateRevtxtbox(TbShowString, str);//十进制和十六进制形式按字节进行处理for (int i = 0; i < len; i++){//十进制都是按照三位来显示,字节之间有空格表示区分SCIUpdateRevtxtbox(TbShowDec,PublicVar.g_ReceiveByteArray[i].ToString("D3") + " ");//十六进制都是按照两位来显示,字节之间有空格表示区分SCIUpdateRevtxtbox(TbShowHex,PublicVar.g_ReceiveByteArray[i].ToString("X2") + " ");}this.TSSLState.Text = "过程提示:数据接收成功!";}//接收数据失败elsethis.TSSLState.Text = "过程提示:数据接收失败!";}main函数#include "Includes.h"void main(void){//1 关总中断DisableInterrupt(); //禁止总中断//2 芯片初始化MCUInit();//3 模块初始化//3.1 SCI初始化SCIInit(SCI_NUM_1,SYSTEM_CLOCK,38400);//用SCI1,系统时钟为时钟源,波特率为9600 //3.2 键盘初始化KBInit();//4 开中断//4.1 开键盘中断EnableKBint();//4.2 开总中断EnableInterrupt();键盘中断函数#include "isr.h"//-------------------------------------------------------------------------*//函数名: isrKeyBoard *//功能: 扫描键盘,向串口发送键值和定义值*//参数: 无*//返回: 无*//说明: 调用了KBScanN、SCISend1、KBInit函数*//-------------------------------------------------------------------------*interrupt void isrKeyBoard(void){uint8 value;uint16 i;for(i=0; i<1000; i++);DisableInterrupt(); //关总中断DisableKBint(); //屏蔽键盘中断value = KBScanN(10); //扫描键值,存于value中if(value!=0xFF){SCISend1(SCI_NUM_1, value); //发送键值SCISend1(SCI_NUM_1,KBDef(value));//键值转化为定义值并发送}KBInit(); //键盘初始化键盘中断EnableKBint(); //开放键盘中断EnableInterrupt() ; //开总中断}五、实验过程原始记录(数据、图表、计算等)六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
实验三(实验报告) - 键盘中断 (1)

实验三中断程序设计学号 201216008 姓名孙坤专业电子信息科学与技术成绩【实验目的】(1)认识微机系统的中断特性。
(2)学习8259中断控制器的工作原理。
(3)学习8259中断控制器的应用编程。
(4)掌握使用PC机内8259的方法(5)掌握修改中断向量的方法。
【实验原理及内容】1、实验原理:我们利用IBM-PC机的8259A,利用键盘输入作为中断请求信号,通过IRQ1来申请中断。
2、实验内容:当用户每按下一次键盘上的按键时,即相当于从IRQ1端向计算机内部的8259A发送一次中断请求,该中断的服务是将“THIS IS A INTERRUPT!”显示在屏幕上。
中断10次后程序退出。
3、编程提示:1)PC微机系统中的8259在80x86系列PC微机系统中,系统中包含了两片8259A中断控制器,经级连可以管理15级硬件中断,但其中部分中断号已经被系统硬件占用,具体使用情况如下表所示。
两片8259A的端口地址为:主片8259使用020H和021H两个端口;从片使用0A0H和0A1H 两个端口。
系统初始化两片8259的中断请求信号均采用上升沿触发,采用全嵌套方式,优先级的排列次序为0级最高,依次为1级、8级~15级,然后是3级~7级。
在扩展系统总线上的INTR对应的中断线就是PC机保留中断其中的一个。
对INTR中断的初始化PC机已经完成,在使用时主要是将其中断屏蔽打开,修改中断向量。
2)键盘中断注意事项PC机中使用的是编码键盘,在键盘内部有一单片机对整个键盘上的字符键、功能键、控制键和组合键进行管理,当从键盘上键入一个键时,键盘上的处理器首先向微机产生硬件中断请求(IRQ1),然后将改键的扫描码传送给主机。
而PC主机在IRQ1中断的作用下,调用INT 09硬件中断读入键盘的扫描码,并转换成ASCII码,存入键盘缓冲区。
本实验中的键盘中断处理程序必须对键盘控制器完成键盘复位 1.复位键盘控制器只需读出端口61H的内容,并将最高位置1,再写入该端口。
实验三 键盘中断实验

实验三 键盘中断实验一.实验目的1.熟练运用MT-IDE 嵌入式开发系统环境、汇编、C 语言、调试方式。
2.复习串行通信接口(SCI )的内容。
3.加强键盘中断基本原理及编程原理的理解。
4.理解运行课本中的程序代码。
5.理解“行扫描”法的原理并能进行键值识别和键值编码。
6.理解键盘接线原理图(如图3-1)。
实验箱提供一个16键键盘,用于键盘中断信号的输入。
系统提供两种接线方式: ①当将键盘接入上一排插孔时为固定接线,键盘接线原理图如图3-1所示。
②当将键盘接入下一排插孔时为手动接线,连线的位置在键盘的左边。
二.预习要求1.仔细阅读本实验指导书。
2.复习有关的键盘中断和串行通信接口(SCI )的章节。
3.熟悉GP32键盘模块的工作方法及编程。
4.根据实验内容要求编写好程序,为实验做充分地准备。
行线m 1 m 2 m 3 m 4 接MCU 的PTA 引脚三.实验设备及其连接1.PC机一台2.MT-IDE嵌入式开发系统一台3.串行通信线一根4.小键盘一个5.万用表一个四.实验内容1.理解键盘模块及键盘中断的原理。
2.运行与理解各子程序。
3.主程序运行课本的样例程序。
4.编制一个中断方式的16键键盘程序,使用“行扫描”法识别按键。
采用键盘中断方式。
PTA7-PTA4为列线(输入),定义有内部上拉电阻,PTA3-PTA0为行线(输出),没有内部上拉电阻,允许INTBIER的KBIE7-KBIE4定义为中断输入引脚。
要求按下的一个键的键值和键面定义值(键的ASCII码值)通过串口在PC方软件界面显示,同时用小灯显示按键的键面定义值(键的ASCII码值)。
键盘与MCU的PTA7-PTA0相连。
PTB7-PTB0口与小灯相连。
五.编程提示1.按照结构要求写好编程代码和注释。
2.键盘一般都是矩阵排列的,行和列分别接在MCU的I/O口上,其中列线通过设置内部上拉电阻接+5V,该端口先定义为输入端,行线直接与端口相连,该端口定义为输出端。
实验四-键盘与中断 参考程序

1、基本要求:在mini80E单片机实验板上实现教材【例4.1.1】对应的功能。
画出电路原理图、编写程序、在实验板上实现。
【例4.1.1】用数码管前两位显示一个十进制数,变化范围为00~59,开始时显示00,每按下S2(key1)键一次,数值加1;每按下S3(key2)键一次,数值减1;每按下S4(key3)键一次,数值归零;按下S5(key4)键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5(key4)键,数值停止加1,保持显示原数。
(P82)说明:实验室的实验板与教材上程序对应的硬件电路稍有区别,程序要做少许修改。
主要是修改按键和显示器对应的接口定义。
请对下面程序中注释部分标有“删除或修改”的地方删除或修改,修改原理见实验报告或QQ群中mini80e实验板的原理图。
#include <reg52.h> //52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit key1=P3^4; //S1,删除或修改sbit key2=P3^5; //S2,删除或修改sbit key3=P3^6; //S3,删除或修改sbit key4=P3^7; //S4,删除或修改sbit dula=P2^6; //删除或修改sbit wela=P2^7; //删除或修改uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//0-90x77,0x7c,0x39,0x5e,0x79,0x71}; //A-Fvoid delayms(uint); //延时ms函数uchar numt0,num; //numt0-对T0定时计数,num-变化的数(0-59)void display(uchar numdis) //显示子函数(电路原理见P58){uchar shi,ge; //局部变量,存放要显示的十位、个位数shi=numdis/10; //分离两个分别要显示的数ge=numdis%10;dula=1; //删除或修改P0=table[shi]; //保留dula=0; //删除或修改P0=0xff; //删除或修改wela=1; //删除或修改P0=0xfe; //修改wela=0; //删除或修改delayms(5); //延时保证亮度(实际延时1-2ms即可)dula=1; //删除或修改P0=table[ge]; //保留dula=0; //删除或修改P0=0xff; //删除或修改wela=1; //删除或修改P0=0xfd; //修改wela=0; //删除或修改delayms(5);}//以下程序不变void delayms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}void init() //初始化函数{TMOD=0x01; //设置T0方式1定时TH0=(65536-45872)/256; //装初值定时50msTL0=(65536-45872)%256;EA=1; //开总中断ET0=1; //开T0中断}void keyscan() //键处理函数{if(key1==0) // key1按下否?{delayms(10); //延时10ms消抖if(key1==0) //再判别是否按下{num++; //如果key1按下,num加1if(num==60)//当到60时重新归0num=0;while(!key1); //等待按键释放}}if(key2==0) // key2按下否?{delayms(10);if(key2==0){if(num==0)//当到0时重新归60num=60;num--;while(!key2);}}if(key3==0) // key3按下否?{delayms(10);if(key3==0){num=0; //清0while(!key3);}}if(key4==0)// key4按下否?{delayms(10);if(key4==0){while(!key4);TR0=~TR0; //启动或停止定时器0}}}void main() //主函数{init(); //初始化while(1) //循环执行程序(注意不要把初始化包括在内){keyscan(); //按键识别与处理display(num); //刷新显示}}void T0_time() interrupt 1 //T0定时50ms中断服务函数{TH0=(65536-45872)/256;//重装初值TL0=(65536-45872)%256;numt0++; //对50ms计数if(numt0==20) //如果到了20次,说明1秒时间到{numt0=0; //然后把num清0重新再计20次num++; //1秒到num加1if(num==60)num=0;}}2、创新要求:在mini80E 单片机实验板上实现时钟显示与设置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(6)实现键盘驱动非阻塞访问操作函数
static int Emdoor_kbd_fasync(int fd, struct file * file, int mode) { return fasync_helper(fd, file, mode, &(fasync) ); }
(7)键盘驱动文件结构体定义
(4)实现键盘驱动设备打开操作函数
static int Emdoor_kbd_open(struct inode *inode, struct file *filp) { int ret; printk(KERN_EMERG " Emdoor_kbd_open!\n"); KBD_DEV * kbd; kbd =(KBD_DEV *) kmalloc(sizeof(KBD_DEV ), GFP_KERNEL); KPC=KPC_ASACT | (3<<26) | (7<<23 ) | KPC_IMKP | KPC_MS6 | KPC_MS5 |KPC_MS4 | KPC_MS3 | KPC_MS2 | KPC_MS1 | KPC_MS0 | KPC_ME |KPC_MIE | (7<<6) | KPC_DE | KPC_DIE; init_waitqueue_head(&(kbd->wq)); pxa_gpio_mode(94 | GPIO_ALT_FN_1_IN);//KP_DKIN<1> pxa_gpio_mode(95 | GPIO_ALT_FN_1_IN);//KP_DKIN<2> pxa_gpio_mode(98 | GPIO_ALT_FN_1_IN); pxa_gpio_mode(99 | GPIO_ALT_FN_1_IN); pxa_gpio_mode(100 | GPIO_ALT_FN_1_IN); pxa_gpio_mode(101 | GPIO_ALT_FN_1_IN); pxa_gpio_mode(102 | GPIO_ALT_FN_1_IN); pxa_gpio_mode(103 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<0> pxa_gpio_mode(104 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<1> pxa_gpio_mode(105 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<2> pxa_gpio_mode(108 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<5> kbd->kbd_status=KEYVALUE_NO; filp->private_data=kbd;
kbd_ret = kbd->kbd_buff; copy_to_user(buffer, &kbd_ret, sizeof(KBD_RET)); kbd->kbd_status=KEYVALUE_NO; return sizeof(KBD_RET); } else{ if (filp->f_flags & O_NONBLOCK) return -EAGAIN; interruptible_sleep_on(&(kbd->wq)); if (signal_pending(current)) return -ERESTARTSYS; } } return sizeof(KBD_RET); }
MODULE_LICENSE("GPL"); #define DEVICE_NAME "emdoor_kbd" #define KEYVALUE_HAVE 1 #define KEYVALUE_NO 0 #define KPC_DIR 1<<5 #define KPC_MAT 1<<22 static int Emdoor_kbd_fasync(int, struct file* ,int); typedef unsigned char KBD_RET; struct fasync_struct * fasync; //键盘结构体定义 typedef struct { KBD_RET kbd_buff; /* protect against overrun */ unsigned int kbd_status; wait_queue_head_t wq; spinlock_t lock; } KBD_DEV;
ቤተ መጻሕፍቲ ባይዱ
(8)键盘驱动初始化函数定义
static int __init Emdoor_kbd_init(void) { printk(KERN_EMERG " Emdoor_kpd initialized\n"); int ret; ret = register_chrdev(62, DEVICE_NAME, &Keypad_fops); if (ret < 0) { printk(DEVICE_NAME " can't get major number\n"); return ret; } free_irq(IRQ_KEYPAD,NULL); udelay(10); return 0; }
8-2 键盘中断驱动实验
第 1 步:利用 vi 编辑器,编写一个 Keypad.c 驱动代码; (1)增加驱动所需的头文件和变量
#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include #include #include #include #include <linux/delay.h> <linux/poll.h> <linux/spinlock.h> <asm/hardware.h> <asm/arch-pxa/pxa-regs.h>
static struct file_operations Keypad_fops = { open: Emdoor_kbd_open, read: Emdoor_kbd_read, release: Emdoor_kbd_release, poll: Emdoor_kbd_poll, fasync: Emdoor_kbd_fasync, owner: THIS_MODULE, };
(3)实现键盘驱动中断服务例程
static void Emdoor_isr_kbd(int irq, void *dev_id, struct pt_regs *reg) { printk(KERN_EMERG"Emdoor_isr_kbd,Interrupt\n"); int kpc_value; KBD_DEV * kbd = (KBD_DEV *) dev_id; spin_lock_irq(&(kbd->lock)); kpc_value=KPC; if(kpc_value&KPC_MAT) { kbd->kbd_buff=KPAS&0xFF; if(kbd->kbd_buff!=0xFF){ switch(kbd->kbd_buff){ case 0x0: kbd->kbd_buff=5; break; case 0x1: kbd->kbd_buff=6; break; case 0x2: kbd->kbd_buff=7; break; case 0x5: kbd->kbd_buff=8; break; case 0x10: kbd->kbd_buff=9; break; case 0x11: kbd->kbd_buff=10; break; case 0x12: kbd->kbd_buff=11; break; case 0x15: kbd->kbd_buff=12; break; case 0x20: kbd->kbd_buff=13; break; case 0x21: kbd->kbd_buff=14; break; case 0x22: kbd->kbd_buff=15; break; case 0x25: kbd->kbd_buff=16; break; default: break; } kbd->kbd_status=KEYVALUE_HAVE; }
(8)键盘驱动退出函数定义
static void __exit Emdoor_kbd_exit(void) { printk(KERN_EMERG " Emdoor_kpd exit\n"); unregister_chrdev(62, DEVICE_NAME); } module_init(Emdoor_kbd_init); module_exit(Emdoor_kbd_exit); MODULE_AUTHOR("Ben.li@"); MODULE_DESCRIPTION("This is a Keypad driver demo");
ret = request_irq(IRQ_KEYPAD, Emdoor_isr_kbd, SA_INTERRUPT, DEVICE_NAME, kbd); if (ret) { printk(KERN_EMERG " Interrupt init=%x!!!!\n",ret); return ret; } return 0; }
(2)实现键盘驱动读操作函数
static ssize_t Emdoor_kbd_read(struct file *filp, char *buffer, size_t count, loff_t *ppos) { KBD_DEV * kbd=filp->private_data; KBD_RET kbd_ret; while(1) { if(kbd->kbd_status==KEYVALUE_HAVE) {