嵌入式键盘控制实验
嵌入式- 按键中断实验

按键中断实验实验目的:1掌握IO口的使用2掌握中断处理程序编写3掌握按键中断的使用实验器材:Sinosys-EA2440实验箱PC机实验原理:在SinoSys-EA2440a中,已经将EINT0、EINT2、EINT19、EINT11作为外部中断源和开发板上位号为SW1、SW2、SW3、SW4的这四个小按键相连,中断按钮的连接图如图1.1:1.1中断按钮结构电路在SinoSys-EA2440a 中,已将EINT0、EINT2、EINT19、EINT11 作为外部中断源和开发板上位号为SW1、SW2、SW3、SW4 的这四个小按键相连,其中,EINT0、EINT2、EINT11、EINT19 分别和GPF0、GPF2、GPG3、GPG11 复用,当GPFCON[5:4]=10、GPFCON[1:0]=10、GPGCON[7:6]=10、GPGCON[23:22]=10 时,I/O 为中断方式。
通过寄存器的控制,可以达到开启中断和控制中断的目的。
实验总结:将4个按键端口设置成EINT0、EINT2、EINT11、EINT19模式。
rGPGCON = rGPGCON & (~((3<<22)|(3<<6))) | ((2<<22)|(2<<6)) ;rGPFCON = rGPFCON & (~((3<<4)|(3<<0))) | ((2<<4)|(2<<0)) ;通过EXTINT寄存器对外部中断触发方式进行设置,这里设置下降沿触发。
rEXTINT0 &= ~(6|(6<<8));rEXTINT0 |= (0|(0<<8));// EINT0、EINT2rEXTINT1 &= ~(7<<12);rEXTINT1 |= (0<<12); // EINT11rEXTINT2 &= ~(0xf<<12);rEXTINT2 |= (0<<12); // EINT19对外部中断挂起寄存器清零,对外部中断屏蔽寄存器时能,同时设置中断服务程序的地址,将中断挂起寄存器清零,开启中断。
嵌入式中断按键实验报告

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

实现了多键齐按和重复按键的嵌入式系统键盘驱动设计1 键盘驱动程序的设计随着电子信息技术飞速发展,嵌入式系统构成的各种设备得到了广泛的应用,嵌入式 Linux是一种开放源码、软实时、多任务的操作系统,是开发嵌入式产品的优秀操作系统平台,其中键盘是人机界面中人类监控计算机重要数据输入设备。
实现键盘有两种方法:一种是采用现有的一些芯片实现键盘扫描;二是用软件实现键盘扫描。
目前许多芯片可用来实现键盘扫描,但是键盘扫描的软件实现方法有助于缩减系统的重复开发成本,而只需很少的 CPU 开销。
嵌入式控制器的功能很强,可以充分利用这一资源。
本课题提出的键盘方案是以嵌入式 Linux和PXA255为软硬件平台,通过测试,表明其具有良好的稳定性和实时性。
2 矩阵式键盘的结构与工作原理本课题采用矩阵键盘,如图 1所示。
四根行线四根列线组成 4 *4矩阵键盘,分别用 CPU 的 4个GPIO口。
当有键按下,某个列 GPI O 口电平被下拉从而产生下降沿,触发中断。
其中按键行阵列必须提供上拉信号,列阵列加二极管,防止瞬间电流过大对 GPI O口造成冲击。
图 1 矩阵键盘原理图。
3 Linux键盘驱动简介在 Linux中,键盘驱动被划分成两层来实现。
上层是一个通用键盘抽象层,下层则是硬件处理层,主要对硬件进行直接的操作。
键盘驱动程序上层公共部分在driver /keyboard 。
c里。
文件中最重要的是内核用 EXPORT _SYM BOL 这个宏导出的 handle_scancode函数。
在这个文件中还定义了其它的几个回调函数,它们由键盘驱动程序中上层公共部分调用,并且由底层硬件处理函数实现。
键盘驱动程序的底层硬件处理部分则根据不同硬件有不同实现。
4 键盘驱动程序的实现 4.1 宏定义 module init和 module exit 通过宏定义 module init和module exit可以看出,驱动程序的入口从 kd_ctrl_init()开始。
嵌入式实验报告2

嵌入式系统设计实验报告1 问题描述在Linux操作系统和ARM嵌入式实验系统环境下,分析linux下的键盘、数码管驱动程序,编写一个应用程序,实现以下功能:在ARM开发板上按下数字键1、2、3、4时,对应启动模拟量开发板上的模拟量输入端AIN0、AIN1、AIN2、AIN3采样,并把模数转换的结果从终端输出和数码管显示。
数码管显示格式:通道号转换的电压值;例如:2灭灭3.251.1设计目标在ARM开发板上按下数字键1、2、3、4时,对应启动模拟量AIN0、AIN1、AIN2、AIN3采样,并把A/D转换的结果从终端输出和LED显示。
显示格式:通道号转换的电压值。
1.2设计思路根据设计目标,该问题可分为六个模块进行设计,分别为驱动程序加载、打开设备、键盘扫描、A/D转换、数码管显示,总体设计方案如图1所示。
图1 总体设计方案(1)驱动程序加载用户的应用程序以设备文件方式访问驱动程序,即Linux把设备当文件,通过文件系统对设备进行访问。
针对这个实验,需要用到ADC0809芯片,LED显示数码管,小键盘。
为此,用lsmod命令加载这三个对应的驱动程序adc0809.c、led.c和keybd.c,再以insmod的方式加入内核。
驱动程序主要是设置一些寄存器的内容来确定端口的引脚输入输出方式以及键盘的扫描部分代码,LED控制显示函数等。
(2)打开各个设备在Linux系统下,各个设备都是通过文件来进行描述的,因此用open函数打开需要用到的LED、键盘、ADC0809芯片。
并且要有对应的出错处理。
(3)键盘扫描驱动程序加载进去以后,运行可执行文件,代码就进入到了按键按下等待的代码中了。
对于用户而言,只是在键盘中按下了某个键,在计算机里,通过驱动得到按下的键值并通过read(fd_kb,&result_kb,1)函数把值赋给变量result_kb中(其中fd_kb为键盘的文件描述符)。
(4)A/D转换启动ADC0809芯片对应的通道进行数据转换,这里主要通过iotcl和read 这两个函数实现,并把转化后的结果赋给result_ad这个变量。
嵌入式按键实现方法

嵌入式按键的实现方法因具体的硬件和软件环境而异,但通常涉及以下步骤:1. 硬件连接:将按键连接到嵌入式系统的电路板上。
这可以通过焊接或使用排针和电缆来完成。
通常,按键的一端是连接电源的公共端,另一端连接到电路板上的数字输入引脚。
2. 初始化硬件:在嵌入式系统中配置所需的硬件接口,以便能够读取和处理按键输入。
这可能涉及到设置GPIO(通用输入/输出)引脚的模式(例如,输入或输出),并启用适当的中断或DMA(直接内存访问)通道。
3. 按键识别:嵌入式系统通过检测特定引脚的电平变化来识别按键按下或释放。
这通常涉及使用中断或轮询来检查特定引脚的电压状态。
如果按键按下,该引脚的电压将降低或变为低电平。
4. 按键处理:一旦检测到按键按下,嵌入式系统需要识别按键的位置(按下的是哪一个键)并执行相应的操作。
这可能涉及激活菜单、发送信号到其他设备、记录数据或执行其他与用户交互的任务。
在处理按键后,嵌入式系统通常会重新设置引脚状态以指示按键已被释放。
5. 特殊按键处理:对于特殊按键(如锁定或解锁按钮),嵌入式系统可能需要配置额外的硬件或软件功能来识别和处理这些按键。
例如,可以使用额外的LED灯或传感器来检测特殊按键的状态,或者在软件中实现特定的识别算法。
6. 校准和测试:为了确保按键的正常工作,需要进行适当的校准和测试。
这可能涉及在开发环境中模拟按键按下和释放的测试,以确保系统能够正确识别和处理这些操作。
除了上述基本步骤外,嵌入式按键的实现还可能涉及其他因素,如按键的机械和电气特性、电路板的布局和布线、电源管理、软件优化等。
因此,具体的实现方法可能因嵌入式系统和应用场景而异。
请注意,上述步骤仅提供了一个大致的指导,并不适用于所有嵌入式系统和应用场景。
在实际应用中,可能需要根据具体情况进行调整和优化。
嵌入式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. 理解键盘驱动程序的基本原理和设计流程。
2. 掌握键盘扫描矩阵的原理和实现方法。
3. 学习使用C语言进行键盘扫描驱动程序的开发。
4. 提高嵌入式系统开发能力和实际动手能力。
二、实验环境1. 开发平台:北邮嵌入式实验室提供的STM32开发板。
2. 编译工具:Keil uVision 5。
3. 实验软件:嵌入式Linux操作系统。
三、实验原理键盘扫描矩阵是一种常用的键盘输入方式,它通过行和列的交叉来检测按键的状态。
当按键被按下时,行和列的交叉点会形成一个特定的逻辑地址,该地址对应于键盘上的一个按键。
在嵌入式系统中,键盘驱动程序负责扫描键盘矩阵,识别按键状态,并将按键信息传递给上层应用程序。
本实验中,我们将使用C语言开发键盘驱动程序,实现以下功能:1. 初始化键盘硬件资源。
2. 扫描键盘矩阵,识别按键状态。
3. 将按键信息转换为ASCII码或其他编码格式。
4. 通过中断或轮询方式将按键信息传递给上层应用程序。
四、实验步骤1. 硬件连接将STM32开发板与键盘模块连接,确保键盘模块的行和列引脚正确连接到开发板的GPIO引脚。
2. 编写键盘驱动程序(1)初始化键盘硬件资源在驱动程序中,首先需要初始化键盘硬件资源,包括设置GPIO引脚的模式、上拉/下拉电阻等。
```cvoid keyboard_init(void) {// 设置GPIO引脚模式为输出GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 设置GPIO引脚模式为输入__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}```(2)扫描键盘矩阵在驱动程序中,编写一个函数用于扫描键盘矩阵,识别按键状态。
键盘及LED控制编程实例_ARM嵌入式系统原理与开发_[共10页]
![键盘及LED控制编程实例_ARM嵌入式系统原理与开发_[共10页]](https://img.taocdn.com/s3/m/5f3398c6f18583d0496459de.png)
typedef struct{
Interrupt_func_t InterruptHandlers;
void* data;
int valid;
//设置中断 1=有效 0=无效
mask_func_t mask;
mask_func_t unmask;
mask_func_t ack_irq;
}struct_InterruptFunc;
有了上面两步的初始化工作以后,当有键盘按下时就会发生 IRQ 中断,过程是先跳转到 startup.s 中的 b IRQ_Handler 处,然后保存寄存器 r0-r12,lr 跳转到函数 ISR_IrqHandler 中, 在这个函数中查询中断向量的偏移量,根据这个偏移量调用相应的中断服务函数。执行完中 断服务函数后再跳转回 startup.s 中的 LDMFD sp!, {r0-r12, lr}处,恢复执行中断服务函数之 前的状态,继续执行发生中断服务前的下一条指令,至此中断过程结束,在中断服务函数中 获得键盘的扫描码,再通过 GetKey()函数映射成 led 可以显示的数据。
/* 用于 EINT? */ static void EINT4_23ack_irq(unsigned int irq) {
irq = EINT_OFFSET(irq); rEINTPEND = (1 << irq);
if (irq < EINT_OFFSET(IRQ_EINT8)) { ClearPending(SHIFT_EINT4_7);
static struct_InterruptFunc InterruptFunc[NR_IRQS]={NULL,};
#define GetISROffsetClr()
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统
键盘控制实验
日期: 报告分:
一、实验目的
1.学习键盘及LED 驱动原理。
2.掌握ZLG7289 芯片的使用方法
。
二、实验内容
通过ZLG7289 芯片驱动17 键的键盘和8 个共阴极LED,将按键值在LED 上显示出来。
三、实验步骤
1.新建工程
2.定义ZLG7289 寄存器(ZLG7289.h)
#define ZLG7289_CS (0x20) //GPB5
#define ZLG7289_KEY (0x10) //GPG4
3.编写ZLG7289 驱动函数
图2-2 ZLG7289 复位 图2-3 读取键值
4.定义键盘映射表
unsigned char KeyBoard_Map[]=
{4,8,11,0,0,0,0,0,5,9,12,15,1,0,0,0,6,10,13,16,2,3,0,0,7,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//64 键值映射表,通过查找键盘映射表来确定键盘扫描码对应的按键值
5.定义键值读取函数,流程图如图2-4 所示
精选文库
—
2
图2-4 键值读取函数
6.编写主函数,将按键值在数码管上显示,流程图如图2-5 所示。
图2-5 主函数
四、实验主要过程截图:
精选文库
—
3
实验结果拍照:
添加LCD320.H
和lcd320.c文件
精选文库
—
4
五、实验关键代码(有注释,最好有流程图)
#include"uhal.h"
#include"keyboard.h"
#include"zlg7289.h"
#include"44b.h"
#include"LCD320.H"
#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting
extern int Zlg7289SIOBand;
extern int Zlg7289SIOCtrl;
int main(void)
{
U32 key;
ARMTargetInit(); //开发版初始化
LCD_Init();
LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式
Uart_Printf("\nArm Target Init OK.");
Zlg7289_Reset();//zlg7289复位
while(1)
{ key=GetKey();//得到按键值
if(key==1) LCD_printf("/ \n");
if(key==2) LCD_printf("* \n");
if(key==3) LCD_printf("- \n");
if(key==4) LCD_printf("7 \n");
if(key==5) LCD_printf("8 \n");
if(key==6) LCD_printf("9 \n");
if(key==7) LCD_printf("+ \n");
if(key==8) LCD_printf("4 \n");
if(key==9) LCD_printf("5 \n");
if(key==10) LCD_printf("6 \n");
if(key==11) LCD_printf("1 \n");
if(key==12) LCD_printf("2 \n");
if(key==13) LCD_printf("3 \n");
精选文库
—
5
if(key==14) LCD_printf("Enter \n");
if(key==15) LCD_printf("0 \n");
if(key==0) LCD_printf("NumLock \n");
Delay(1);
ZLG7289_ENABLE();//使zlg7289占有同步串口
Delay(10);//延时
WriteSDIO(ZLG7289_CMD_DATA0|0);//数码管以方式0译码,第一个数码管亮
WriteSDIO(key%10);//显示个位
Delay(3000);//延时
if(key>9)
{//键值大于9显示十位
WriteSDIO(ZLG7289_CMD_DATA0|1);//发送十位数据
WriteSDIO((unsigned char)(key/10));
Delay(1);
WriteSDIO(ZLG7289_CMD_HIDE);//使一、二两位数码管显示
WriteSDIO(3);
}
else
{//键值小于10不显示十位
WriteSDIO(ZLG7289_CMD_HIDE);//使个位数码管显示
WriteSDIO(1);
}
ZLG7289_DISABLE();//zlg7289放弃同步串口控制权
}
return 0;
}
六、遇到的问题及解决方法
每次做实验都是要改代码。首先在没有改代码之前,在按键的时候,我按1,出现的不是对应
的数字,并且在显示屏上也没有出现数字。所以需要联系实验1中的代码,让按键出来的数字显
示在显示屏上。所以一开始就需要把实验1中的LCD320.H和lcd320.c文件加入到本实验里。最
后修改完代码后,我去做了试验。我按了一个1数字键,发现屏幕上出现了有7个1,难道是我
按的太慢了?我很快地又按了一遍,还是出现了4个。后来发现是因为延时的原因,所以又在代
码里加入了延时代码。再试一遍,果然,我按得慢,屏幕上也只出现一个相对应的数字。