当前位置:首页 > 嵌入式实验三人机交互接口-键盘操作实验
实 验 报 告
指导教师
课程名称 实验仪器 实验名称 系 别 专 业 班级/学号学生姓名 实验日期 成 绩
嵌入式系统设计
清华同方辰源嵌入式系统实验箱 实验三:人机交互接口-键盘操作实验 计算机学院
计算机科学与技术
实验三:人机交互接口-键盘操作实验
一、实验问题回答
(1)键盘的工作原理是什么?
答:键盘分独立式键盘与矩阵式键盘。 独立式键盘:
在由单片机组成的测控系统及智能化仪器中,用的最多的是独立式键盘。这种键盘具有硬件与软件相对简单的特点,其缺点是按键数量较多时,要占用大量口线。
当按键没按下时,CPU对应的I/O接口由于内部有上拉电阻,其输入为高电平;当某键被按下后,对应的I/O接口变为低电平。只要在程序中判断I/O接口的状态,即可知道哪个键处于闭合状态。 矩阵式键盘:
矩阵式键盘使用于按键数量较多的场合,它由行线与列线组成,按键位于行、列的交叉点上。一个3*3的行列结构可以构成一个有9个按键的键盘。同理,一个4*4的行列可以构成一个16按键的键盘。很明显,在按键数量较多的场合,与独立式键盘相比,矩阵式键盘要节省很多I/0接口。 键盘按键识别方法分扫描法语线反转法。 扫描法:
扫描法有行扫描和列扫描两种,无论采用哪种,无论采用哪种,其效果是一样的,只是在程序中的处理方法有所区别。下面以列扫描法为例来介绍扫描法识别按键的方法。首先在键处理程序中将P1.4-P1.7依次按位变低,P1.4-P1.7在某一时刻只有一个为低。在某一位为低时读行线,根据行线的状态即可判断出哪一个按键被按下。如2号键按下,当列线P1.5为低时,读回的行线状态中P1.0被拉低,由此可知K2键被按下。一般在扫描法中分两步处理按键,首先是判断有无键按下,如行线有一个为低,则有键按下。当判断有键按下时,使列线依次变低,读行线,进而判断出具体哪个键被按下。
线反转法:
扫描法是逐行或逐列扫描查询,当被按下的键处于最后一列时,要经过多次扫描才能最后获得此按键所处的行列值。而线反转法则显的简练,无论被按的键处于哪列,均可经过两步即能获得此按键所在的行列值。
首先将行线P1.0-P1.3作为输入线,列线P1.4-P1.7作为输出线,并且输出线输出全为低电平,读行线状态,则行线中电平为低的是按键所在的行。然后将列线作为输入线,行线作为输出线,并将输出线输出为低电平,读列线状态,则列线是电平为低的是按键所在的列。综合上述两步结果,确定按键所在的行和列,从而识别出所按下的键。 假设10号键被按下,在第一步P1.3-P1.0全为低电平时,读P1.4-P1.7的值,则P1.5为低电平;在第二步P1.4-P1.7输出全为低电平时,读P1.3-P1.0时,P1.2为低电平。由此可判断第3行第2列有键被按下,此键就是K10键。
(2)键盘等其他外部设备与CPU之间如何协调工作?
答:cpu通过I/O接口和外部设备进行数据交换。cpu通过接口对外设进行控制的方式有以下几种:程序查询方式、中断处理方式、DMA传送方式。
(3)在实验报告中对键盘中断服务程序进行逐行注释,理解计算机是如何接收键盘输入的。
答:
void GPIO_PORT_D_ISR(void)
{ unsigned char ucKey; //定义一个unsigned char类型的变量 ucKey unsigned long ulStatus; //定义一个unsigned long 类型的变量 ulStatus ulStatus = GPIOPinIntStatus(GPIO_PORTD_BASE, true); //读取中断状态 GPIOPinIntClear(GPIO_PORTD_BASE, ulStatus);//清空读取到的中断 if(ulStatus & GPIO_PIN_7)//如果GPIO_PIN_7中断状态有效 { ucKey = GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4);//读取管脚 ucKey = ucKey>>1;//ucKey右移一位 ucValue = ucValue + ucKey;//ucValue+1 ucValue = ucValue<<1;//ucValue左移一位 i++; if(i==4)//如果发生四次中断 { i=0;//i置0
Event_Key=1;//Event_Key置一,代表按键信息已传给cpu oledkey[1]='\\0';给oledKey[1]赋值\\0 if((ucValue>>4)<10)//如果ucValue右移四位后小于10 oledkey[0] = (ucValue>>4) + 48;//则oledkey[0]右移四位后加48 else oledkey[0] = (ucValue>>4) - 10 + 'A';//否则ucValue右移四位减10加A } } }
(4)根据实验思考,如果有两个不同的中断需要响应时,应该如何设计程序?
答: while(1)
{ if(Event_key)//中断1发生的标志 { Event_key=0; ?. ? } if(Event) //中断2发生的标志 { Event = 0; ? ? } }
(5)按下几个键后屏幕中出现多个字符怎么办?如何只显示一个?
答:发生一次按键中断后调用一次函数RIT128x96x4Clear();。
(6)因为本次实验需要响应两个中断,需要对主函数的死循环做以下改动。
while(1) { if(Event_key) { Event_key=0; …. … } if(Event) { Event = 0; …… } }
思考:这样设计的目的和作用是什么?要是系统需要响应4个不
同的中断又如何设计?
答:目的是使各个中断的处理不受影响。如果需要响应4个不同的中断则需要定义四个全局变量(值为0或1)来标记每个中断。 示例如下:
while(1) {
共分享92篇相关文档