实验三 键盘中断实验报告

合集下载

中断应用实验报告

中断应用实验报告

中断应用实验报告中断应用实验报告引言:中断是计算机系统中一种重要的机制,用于处理硬件事件和异常情况。

通过中断,计算机可以及时响应外部设备的请求,并进行相应的处理。

在本次实验中,我们将探索中断应用的原理和实践,以增进对计算机系统的理解和掌握。

一、实验目的本次实验的目的是通过编写中断应用程序,了解中断的工作原理以及如何在程序中使用中断。

通过实践,我们将深入理解中断的概念和作用,并能够灵活运用中断来处理各种硬件事件和异常情况。

二、实验环境本次实验使用的是一台基于x86架构的计算机。

我们将使用汇编语言编写中断应用程序,并在实验环境中进行调试和运行。

三、实验步骤1. 确定中断向量中断向量是中断服务例程的入口地址。

在实验中,我们需要先确定所需处理的中断类型,并为其分配一个合适的中断向量。

这样,当中断事件发生时,计算机可以通过中断向量找到相应的中断服务例程。

2. 编写中断服务例程中断服务例程是中断处理的核心代码。

在实验中,我们需要编写中断服务例程来处理特定的中断事件。

例如,我们可以编写一个中断服务例程来处理键盘输入中断,以实现对键盘事件的响应和处理。

3. 注册中断服务例程在实验中,我们需要将编写好的中断服务例程注册到系统中,以便在中断事件发生时能够正确地调用。

通过注册,我们可以将中断服务例程与相应的中断向量关联起来,使其能够被系统正确地调用和执行。

4. 测试中断应用程序在完成以上步骤后,我们可以开始测试中断应用程序的功能和效果。

通过模拟中断事件,我们可以验证中断服务例程的正确性和稳定性。

同时,我们还可以观察中断应用程序对系统性能的影响,并进行相应的优化和改进。

四、实验结果与分析通过本次实验,我们成功编写了中断应用程序,并在实验环境中进行了测试和调试。

实验结果表明,中断应用程序能够及时响应外部设备的请求,并进行相应的处理。

通过中断,我们可以实现对键盘、鼠标等外部设备的控制和交互,提高了计算机系统的可用性和灵活性。

键盘中断微机实验报告

键盘中断微机实验报告

键盘中断微机实验报告1. 引言键盘中断是计算机硬件系统中常见的一种输入设备中断方式,其功能是在用户通过键盘输入时,中断处理器正常运行的流程,将键盘输入的数据传递给操作系统供其处理。

本次实验旨在通过搭建一个简单的键盘中断实验系统,加深对键盘中断原理及操作的理解。

2. 实验原理2.1 键盘中断键盘中断是一种异步的硬件中断方式,即键盘通过给中断控制设备发送中断请求信号,从而将中断信息传递给CPU。

一旦发生键盘中断,CPU将停止当前执行的任务,跳转到事先设置好的中断处理程序,处理键盘中断事件。

2.2 实验系统本次实验使用Intel 8086微处理器、键盘控制器8042和键盘作为实验系统的主要硬件设备。

系统的基本结构如下图所示:![实验系统结构图](- 键盘:作为输入设备,接收用户的键盘输入。

- 键盘控制器8042:负责控制键盘与计算机之间的数据传输。

- CPU:处理器负责执行键盘中断的相关指令。

3. 实验步骤3.1 搭建实验系统首先,需要将键盘控制器8042插入到计算机的适当位置,并将键盘连接到控制器上。

确保硬件的连接正确无误。

3.2 编写中断处理程序在编程方面,我们使用汇编语言编写键盘中断的处理程序。

具体而言,我们需要完成以下任务:- 将中断向量表中对应键盘中断的入口地址设置为我们编写的处理程序的入口地址。

- 编写处理键盘中断的程序代码,实现对键盘输入数据的接收和处理。

3.3 设置中断控制器在实验中,要进行正确的中断处理,还需要设置中断控制器8042。

具体而言,我们需要完成以下任务:- 将中断请求线IRQ1(对应键盘中断)与中断控制器连接。

- 打开中断屏蔽位,以允许中断请求通过。

3.4 运行实验程序完成前述步骤后,我们可以运行实验程序,测试键盘中断的正常工作。

当用户按下键盘时,键盘中断会触发,并将键盘输入的数据传递给中断处理程序进行处理。

4. 实验结果与分析经过测试,我们发现实验系统能够正确地接收和处理键盘输入的数据。

中断程序实验报告

中断程序实验报告

一、实验目的1. 理解中断程序的基本概念和作用。

2. 掌握中断程序的编写方法。

3. 通过实验加深对中断程序在实际应用中的理解。

二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 芯片:Intel Core i5三、实验内容1. 编写一个简单的中断程序,实现按下键盘任意键后,屏幕显示“中断发生”。

2. 编写一个中断程序,实现定时中断,每秒显示一次当前时间。

四、实验步骤1. 编写中断程序首先,我们需要编写一个中断程序,用于实现按下键盘任意键后,屏幕显示“中断发生”。

```c#include <stdio.h>#include <conio.h>#include <dos.h>void interrupt_handler() {printf("中断发生\n");while(1); // 无限循环,防止中断程序执行完毕后退出}int main() {int intr_no = 1; // 中断号int flag = interrupt(intr_no, interrupt_handler); // 注册中断if (flag != 0) {printf("注册中断失败\n");return 1;}printf("等待按键...\n");while(1) {if (kbhit()) { // 判断是否有按键按下break;}}printf("程序结束\n");return 0;}```在上述代码中,我们首先包含了必要的头文件,并定义了一个中断处理函数`interrupt_handler`,该函数负责打印“中断发生”信息。

然后,我们使用`interrupt`函数注册了中断,中断号为1,即键盘中断。

在主函数中,我们等待用户按下任意键,当按键按下后,中断处理函数会被调用。

中断应用实验报告

中断应用实验报告

一、实验目的1. 理解中断的概念和作用。

2. 掌握中断的基本原理和应用方法。

3. 能够通过实验验证中断在程序中的应用效果。

二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 开发环境:Visual Studio 2019三、实验原理中断是一种在计算机系统中实现程序之间交互和资源共享的重要机制。

它允许CPU 在执行程序的过程中,暂停当前程序的执行,转而执行另一个程序的代码,处理特定的任务。

中断分为硬件中断和软件中断,硬件中断是由外部设备产生的,软件中断是由程序执行过程中产生的。

四、实验内容1. 硬件中断实验(1)实验步骤① 编写一个C程序,模拟键盘输入事件,使用硬件中断实现按键检测。

② 在程序中定义一个中断服务例程(ISR),当检测到按键事件时,调用该例程。

③ 在ISR中实现按键检测功能,并打印按键信息。

(2)实验代码```c#include <stdio.h>#include <conio.h>// 硬件中断服务例程void keyboard_isr() {char key = getch();printf("按键:%c\n", key);}int main() {// 设置中断处理程序_set_interrupt_handler(0x09, keyboard_isr);printf("按任意键开始监听...\n");while (1) {if (_kbhit()) {_getch(); // 读取按键信息}}return 0;}```2. 软件中断实验(1)实验步骤① 编写一个C程序,使用软件中断实现程序之间的交互。

② 在程序中定义一个软件中断服务例程,用于处理特定任务。

③ 在主程序中调用软件中断,触发服务例程执行。

(2)实验代码```c#include <stdio.h>#include <stdlib.h>// 软件中断服务例程void software_isr() {printf("软件中断被触发,执行特定任务...\n"); }int main() {// 定义软件中断号int int_no = 0x2C;// 设置软件中断处理程序_set_interrupt_handler(int_no, software_isr); printf("按任意键触发软件中断...\n");while (1) {if (_kbhit()) {_getch(); // 读取按键信息// 触发软件中断__int int_no;__asm {int int_no}}}return 0;}```五、实验结果与分析1. 硬件中断实验结果当程序运行时,按下键盘上的任意键,会在控制台打印出按键信息。

按键的中断的实验

按键的中断的实验

按键的中断编程实验
一.实验目的
1.掌握用C51对外不中断设置的方法
2.掌握按键用C51进行识别的方法
二.实验要求
1.基本要求
(1)能够对有关中断的各个寄存器进行设置
(2)能够用C51编写中断服务程序,当每按一下按键,在中断服务程序中实现数码管上显示数据从0以步进为1的步调增加。

2.扩展要求
(1)用实验板上的上下左右按键做一个秒表,其中做按键作为启动按键,上按键作为清零按键,右按键作为停止按键。

三.实验电路原理图
电路图如下图(1)
四.实验原理简介
(1)每进入中断一次实现数码管上显示数据加1,且按按键时蜂鸣器发声。

(2) 配合上下左右按键做一秒表,要求按左键的话秒表启动,按右键的
话秒表停止,按上键的话秒表清零。

C8
C9
(移)(加)(移)(减)
IN4148X4
图(1)。

实验报告-实验三 中断与定时器实验INT

实验报告-实验三 中断与定时器实验INT

ab cd efg h(dp) 中断、定时器实验实验目的:学习外部中断和定时器二、实验说明本实验1通过开关向单片机提出中断请求,单片机响应中断进行计数,并通过LED 数码管指示出计数值,从而观察中断的请求、响应的过程。

实验2通过单片机的定时器产生延时,控制LED 闪烁的方法。

通过本实验学生可以掌握单片机中断和定时器的工作原理及使用方法以及中断和定时器的初始化程序、应用程序的编写和调试。

三、实验内容1、开关S0—S1连接P3口做输入,P0输出接LED ,通过S2产生外部中断请求(/INT0)信号,在中断服务程序中完成十进制递增计数,并将计数值显示在LED 数码管上,要求分别采用电平触发和边沿触发。

按上述要求完成S3产生外部中断请求。

编写初始化程序和中断服务程序。

(注意开关抖动处理)2、P1.0--P1.7作输入口接拨动开关S0--S7;P0.0--P0.7作输出口,接发光二极管L1—L8,编写程序读取开关状态,将此状态在对应的发光二极管上显示出来,要求发光二极管(LED )按亮0.5秒、暗0.5秒闪烁,LED 亮的同时,从P2.0送出1kHz 的音频信号到音频驱动电路发声(持续0.5秒),将开关编号(0—7)显示在LED 数码管上。

要求延时采用内部定时器T0,音频的产生采用内部定时器T1。

编写初始化程序和中断服务程序。

四、实验电路连线P0.0 ---- LED0 P3.2(/INT0)----- S2P0.1 ---- LED1 P3.3(/INT1)----- S3P0.2 ---- LED2P0.3 ---- LED3P0.4 ---- LED4P0.5 ---- LED5P0.6 ---- LED6P0.7 ---- LED7LED 连接 外部中断请求输入a b c d e f g h(dp)P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 五、实验仪器和设备PC机、WA VE软件、仿真器+仿真头、实验板、电源等。

中断控制实验报告

中断控制实验报告

中断控制实验报告中断控制实验报告一、引言中断控制是计算机系统中至关重要的一部分,它允许外部设备与计算机进行有效的交互。

通过中断控制,外部设备可以向计算机发送信号,请求处理器的注意力。

本实验旨在通过编写一个简单的中断控制程序,深入理解中断控制的原理和实现方式。

二、实验目的1. 掌握中断控制的基本原理和实现方法。

2. 熟悉中断控制程序的编写和调试过程。

3. 理解中断控制在计算机系统中的重要性。

三、实验环境和工具本实验使用的实验环境为Intel 8086微处理器,使用的开发工具为MASM汇编语言。

四、实验过程1. 编写中断处理程序在本实验中,我们选择了键盘中断作为示例。

首先,我们需要编写一个中断处理程序,以响应键盘输入事件。

通过读取键盘缓冲区,我们可以获取用户输入的字符,并进行相应的处理。

在中断处理程序中,我们可以使用8086微处理器提供的指令来读取键盘缓冲区,并将字符存储到内存中。

2. 配置中断向量表为了使中断处理程序能够被正确调用,我们需要将中断向量表中相应的中断向量指向我们编写的中断处理程序的入口地址。

在本实验中,我们将键盘中断的中断向量指向我们编写的中断处理程序的入口地址。

3. 测试中断控制程序在完成中断处理程序和中断向量表的配置后,我们可以进行测试。

通过模拟键盘输入事件,我们可以观察到中断处理程序的执行情况。

在测试过程中,我们可以使用调试工具来单步执行程序,以便观察程序的执行流程和变量的变化。

五、实验结果与分析通过测试,我们可以观察到中断控制程序能够正确响应键盘输入事件,并将用户输入的字符存储到内存中。

这证明我们编写的中断处理程序和中断向量表配置是正确的。

同时,我们还可以观察到中断控制程序的执行时间非常短,几乎没有对计算机系统的性能产生影响。

六、实验总结通过本次实验,我们深入了解了中断控制的原理和实现方式。

中断控制是计算机系统中重要的一部分,它允许外部设备与计算机进行高效的交互。

通过编写一个简单的中断控制程序,我们掌握了中断控制的基本原理和实现方法,并熟悉了中断控制程序的编写和调试过程。

IO实验3——中断按键LED

IO实验3——中断按键LED
{
uchar i,j;
for(i=0;i<x;i++)//单只LED依次灯上移点亮x圈
{
LED=0x7f;//最下边的LED亮
for(j=0;j<8;j++)
{
DelayMS(250);//延时函数调用
LED=(LED>>1)|0x80;//上移1位后,将MSB设为1,点亮上一个LED
}
}
}
五、实验结果截图
for(j=0;j<8;j++)
{
DelayMS(250);//延时函数调用
LED=(LED<<1)|0x01;//下移1位后,将LSB设为1,点亮下一个LED
}
}ห้องสมุดไป่ตู้
}
//*********************************************************************************
(1)protues仿真图
(2)实验箱运行效果图
六、实验心得体会
回顾起此实验至今我仍感慨颇多,从理论到实践在这段时间里可以说得是苦多于甜,但是可以学到很多很多的东西,比如课本的知识,以及软件的运用,不仅巩固了以前所学过的知识而且学到了很多在书本上所没有学到过的知识。而且我明白了理论到实际的转变是有一定难度的,仅仅学习理论知识不用来实践是不够的,只有把理论知识与实践结合起来,从实践中得到感悟体会,提高自己的实际动手能力和独立思考的能力。虽然实验的过程中遇到各种各样的问题,可以说是困难重重,,遇到各种问题也很正常,但是当这些问题被解决的时候往往有一种从心底散发出来的自豪感,在实验的过程中发现了自己的不足之处,加以改进……经过这次实验的种种困难挫折,我更加熟练的会使用软件来解决问题。

嵌入式实验3按键实验(中断方式)

嵌入式实验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);}}七.实验总结通过这次实验,课程知识的实用性很强,因此实验就显得非常重要,刚开始做实验的时候,由于自己的理论知识基础不好,在实验过程遇到了许多的难题,也使我感到理论知识的重要性。

微机原理中断实验报告(3篇)

微机原理中断实验报告(3篇)

第1篇一、实验目的1. 理解中断的概念和作用;2. 掌握中断系统的组成和基本工作原理;3. 熟悉中断向量表、中断服务程序和中断处理过程;4. 通过实验验证中断系统的正确性和可靠性。

二、实验原理1. 中断的概念:中断是CPU在执行程序过程中,由于某些事件的发生,暂时停止当前程序的执行,转而执行相应的事件处理程序的过程。

2. 中断系统的组成:中断系统主要由中断控制器、中断源、中断向量表、中断服务程序和CPU等组成。

3. 中断向量表:中断向量表是存储中断服务程序入口地址的表格,其中每个中断向量对应一个中断服务程序。

4. 中断服务程序:中断服务程序是处理中断事件的核心程序,用于完成中断事件的处理任务。

5. 中断处理过程:当中断事件发生时,CPU会根据中断向量表找到对应的中断服务程序入口地址,并跳转到该地址执行中断服务程序。

三、实验仪器与设备1. 实验台:微机原理实验台2. 电脑:一台3. 软件环境:Keil uVision、emu8086等四、实验步骤1. 启动实验台,打开微机原理实验台软件。

2. 在软件中设置实验参数,如中断源、中断向量等。

3. 编写中断服务程序,实现中断事件的处理任务。

4. 编写主程序,调用中断服务程序。

5. 运行实验程序,观察中断系统的运行情况。

五、实验内容1. 实验一:单级中断系统(1)设置一个外部中断源,如按键中断。

(2)编写中断服务程序,实现按键按下时的处理任务。

(3)在主程序中调用中断服务程序。

2. 实验二:多级中断系统(1)设置两个外部中断源,如按键中断和定时器中断。

(2)编写中断服务程序,实现按键中断和定时器中断的处理任务。

(3)设置中断优先级,实现多级中断。

(4)在主程序中调用中断服务程序。

3. 实验三:中断嵌套(1)设置两个外部中断源,如按键中断和定时器中断。

(2)编写中断服务程序,实现按键中断和定时器中断的处理任务。

(3)实现中断嵌套,即在定时器中断服务程序中再次触发按键中断。

实验三_键盘中断程序

实验三_键盘中断程序

中断实现——实验三一、实验目的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.识别是否有键按下以及哪个键被按下有哪些方法?答:识别是否有键被按下,主要有查询法、定时扫描法与中断法。

中断原理实验报告

中断原理实验报告

一、实验目的1. 理解中断的基本概念和作用。

2. 掌握中断请求的生成和中断处理的过程。

3. 学习中断控制器的工作原理和编程方法。

4. 通过实际操作,加深对中断机制的理解和应用。

二、实验原理中断是一种使CPU暂时中止当前程序的执行,转而执行中断服务程序的机制。

它允许计算机在执行某个程序时,能够迅速响应来自外部设备或内部事件的需求,从而提高系统的实时性和效率。

中断请求(IRQ)是指由外部设备或内部事件产生的,请求CPU执行中断服务程序的信号。

中断控制器(如8259)负责接收和处理中断请求,并根据中断优先级将中断服务程序插入到当前程序执行过程中。

三、实验内容1. 实验设备:计算机、实验箱、示波器、按键、LED灯等。

2. 实验步骤:1. 连接实验箱上的各个元件,包括按键、LED灯、中断控制器等。

2. 编写中断服务程序,实现按键按下时LED灯闪烁的功能。

3. 编写主程序,初始化中断控制器,设置中断优先级,并启动中断。

4. 观察实验现象,分析中断处理过程。

四、实验过程1. 连接实验设备:按照实验箱说明书,将按键、LED灯、中断控制器等元件连接到实验箱上。

2. 编写中断服务程序:```cvoid interrupt 0 handler(void) {LED = ~LED; // 翻转LED灯状态}```该程序使用C语言编写,当外部中断发生时,CPU会自动调用该中断服务程序。

3. 编写主程序:```cvoid main(void) {EA = 1; // 开启全局中断EX0 = 1; // 开启外部中断0IT0 = 1; // 设置外部中断0为下降沿触发LED = 0; // 初始化LED灯状态while(1) {// 主程序循环,等待中断发生}}```该程序初始化中断控制器,设置中断优先级,并开启全局中断和外部中断0。

当按键按下时,外部中断0发生,CPU会调用中断服务程序,实现LED灯闪烁的功能。

4. 观察实验现象:按下按键,观察LED灯是否闪烁。

实验三键盘中断实验

实验三键盘中断实验

昆明理工大学信息工程与自动化学院学生实验报告(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)

实验三(实验报告) - 键盘中断 (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,该端口先定义为输入端,行线直接与端口相连,该端口定义为输出端。

键盘中断实验

键盘中断实验

南通大学实验报告院系:计算机科学与技术姓名:课程名称:接口技术成绩:学号: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; 主程序中构件初始化 在主函数里添加波特率 Tool 测试 在中断中加接受函数 按键值在pc 上显示//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_PTR)); //中断置标志位写1清0//处理LED部分LEDindex++; //位选位+1if (LEDindex>=4) LEDindex=0; //大于4位选口置0i=LEDchangeCode(LEDDataBuffer[LEDindex]-'0'); //转码LEDshow1(LEDindex,i); //显示LED if(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口通信的知识,在熟悉代码的前提下在主函数里初始化波特率何在中断函数里添加一个接收函数就可以。

中断方式键盘应用 报告

中断方式键盘应用 报告

实验3 中断方式键盘应用一、实验目的1.巩固并掌握keil和proteus软件使用的基本步骤和调试方法;2.掌握图形lcd的编程方法;3.掌握中断方式键盘编程方法。

二、实验原理1.键盘连接:键盘和单片机的连接分为独立式键盘和矩阵式键盘。

(1)独立式键盘:一组相互独立的按键,可以和单片机的i/o口直接连接,即每个按键各占一条线。

(2)矩阵式键盘:也称行列式键盘,个数多,所以按行列组成矩阵。

本实验采用独立式键盘方式。

2.键盘中断方式:有电平触发和脉冲触发两种方式。

(1)电平方式为低电平有效,只需在单片机的(INT0)和(INT1)中断请求输入端采样到有效的低电平时,就会激活外部中断。

(2)脉冲方式则在脉冲的后负跳沿有效,即在相邻两个机器周期对中断请求引入端进行采样中,如前一次为高,后一次为低即为有效中断请求。

这就要求在这种中断方式,中断请求信号的脉冲宽度必须大于一个机器周期,以保证电平变化能被单片机采样到本实验根据实验要求采用脉冲中断方式。

三、实验过程1.用proteus画出实验所需要的仿真电路图;(1)选择好合适的元器件(2)将各元器件用导线合理连接,注意到尽量减少导线交叉,使整体美观大方(3)根据实验具体需要,设置好各个元器件的参数2.打开keil软件,编写好正确的C语言程序,然后调试编译产生对应的HEX文件。

附:C语言程序#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit d1=P1^0;sbit d2=P1^3;sbit d3=P1^6;sbit rs=P2^0;sbit e=P2^1;sbit cs1=P2^2;sbit cs2=P2^3;uchar count,count1,num,x=22;char y=22,j=22;uchar code table1[][32]={{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",0*/ {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"1",0*/ {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",0*/ {0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},/*"3",0*/ {0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*"4",0*/ {0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},/*"5",0*/ {0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"6",0*/ {0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},/*"7",0*/ {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",0*/ {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},/*"9",0*/ };void delay(){uchar x,y;for(x=0;x<10;x++)for(y=0;y<110;y++);}write_com(uchar com){rs=0;P0=com;e=1;e=0;}/*写显示数据*/void write_dat(uchar dat){rs=1; //rs=0写指令,rs=1写数据P0=dat;//dat:显示数据e=1; //e下降源e=0;}void whichpingn(uchar ping){switch(ping){case 0:cs1=0;//全屏cs2=0;break;case 1:cs1=1;//左屏cs2=0;break;case 2:cs1=0;//右屏cs2=1;break;}}/*清屏ping: 0-全屏,1-左屏,2-右屏*/void clear(uchar ping){uchar i,j;whichpingn(ping);for(i=0;i<8;i++) //控制页数0-7,共8页{write_com(0xb8|i);write_com(0x40);for(j=0;j<64;j++) //控制列数0-63,共64列write_dat(0x00); //写点内容,列地址自动加1}}void Display1(uchar shu,uchar page,uchar lie,uchar j) //显示半角汉字和数字和字母{uint i;//选屏参数,pagr选页参数,lie选列参数,number选第几汉字输出whichpingn(shu);write_com(page|0xb8) ;write_com(lie|0x40);for(i=0;i<8;i++)write_dat(table1[j][i]);write_com((page+1)|0xb8) ;write_com(lie|0x40);for(i=0;i<8;i++)write_dat(table1[j][i+8]);}void display2(){Display1(1,0,0,2); //2Display1(1,0,8,0); //0Display1(1,0,16,0); //0Display1(1,0,24,9); //9Display1(1,0,32,1); //1Display1(1,0,40,3); //3Display1(1,0,48,3); //3Display1(1,0,56,3); //3Display1(2,0,0,x/10); //2Display1(2,0,8,x%10); //2Display1(1,2,0,2); //2Display1(1,2,8,0); //0Display1(1,2,16,0); //0Display1(1,2,24,9); //9Display1(1,2,32,1); //1Display1(1,2,40,3); //3Display1(1,2,48,3); //3Display1(1,2,56,3); //3Display1(2,2,0,y/10); //2Display1(2,2,8,y%10); //2Display1(1,4,0,2); //2Display1(1,4,8,0); //0Display1(1,4,16,0); //0Display1(1,4,24,9); //9Display1(1,4,32,1); //1Display1(1,4,40,3); //3Display1(1,4,48,3); //3Display1(1,4,56,3); //3Display1(2,4,0,j/10); //2Display1(2,4,8,j%10); //2Display1(1,6,0,2); //2Display1(1,6,8,0); //0Display1(1,6,16,0); //0Display1(1,6,24,9); //9Display1(1,6,32,1); //1Display1(1,6,40,3); //3Display1(1,6,48,3); //3Display1(1,6,56,3); //3Display1(2,6,0,3); //3Display1(2,6,8,7); //7 }void init(){EA=1;ET0=1;TR0=1;TH0=0X3C;TL0=0XB0;TMOD=0x01;EX0=1;IT0=1;d1=1;EX0=1;IT0=1;whichpingn(0);write_com(0x3e); whichpingn(0);write_com(0x3f); whichpingn(0);clear(1);clear(2);whichpingn(0);}void main(){init();while(1){display2();}}void timer0() interrupt 1 {TH0=0X3C;TL0=0XB0;count++;if(count==20){ count=0;x++;if(x==100)x=45;}}void ex() interrupt 0{if(d1==0){delay();while(!d1);num++;if(num==4){ num=0;TR0=1;}}if(num){if(num==1)TR0=0;if(num==2){if(d2==0){delay();while(!d2);y++;if(y==33)y=22;}}if(num==3){if(d3==0){delay();while(!d3);j--;if(j==11)j=22;}}}}3.在proteus中选中AT89C52原件,点击选择设置,然后选择对应的HEX文件,点击OK,再在软件中运行,观察LCD显示器的显示状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STA PTB
//5.键盘初始化
JSR KB_Init
//调键盘初始化子
程序
BCLR #1,INTKBSCR //开放键盘中
断(IMASK=0)
CLI
//开中断
//程序总循环入口
MainLoop:
NOP
NOP
BRA MainLoop
……
键盘中断方式的子程序部分代码
……
//KB_Int:键盘中断处理程序----------
Hale Waihona Puke 苏州大学实验报告院、系 年级专业 姓 名 学号 课程名 称 成绩 指导教师 同组实验 者 实验日期 实验名称: 键盘中断实 验 一.实验目的 通过该实验实习,能够熟练运用MT-IDE嵌入 式开发系统环境、汇编和C语言以及调试方式;复 习SCI的内容;加强键盘中断的基本原理及编程原 理的理解;能够理解“行扫描”法的原理并且运用它 进行键盘中断的编程。 二.实验内容 理解键盘模块和键盘中断点的原理,使用“行 扫描”法编写一个中断方式的的键盘程序,并转化 成定义值后,通过串口分别发往PC机的VB编写的 界面中显示。 三.实验过程 (一)接线图
序的运行情况。 六.实验小结 通过该实验实习,了解单片机的键盘模块,熟 悉和掌握了MT-IDE嵌入式开发系统环境及其调试 方式,进一步熟悉汇编编程和C语言编程;和理解 了课本中的程序代码。
void isrKBI(void)
{
unsigned char KB_valve;
DisableMCUInterrupt();
//禁止总中断
DisableKBInt();
//
屏蔽键盘中断(IMASKK=1)
KB_valve=KB_Scan();
//
扫描键值
SCISend1(KB_valve);
KB_valve=KB_Def(KB_valve); //键值转
化为定义值
if(KB_valve)
{
SCISend1(KB_valve);
PTB=~KB_valve;
//小灯
显示按键的ASCII码值
}
KB_Init();
//
重新初始化键盘
EnableKBInt();
//
打开键盘中断(IMASKK=0)
EnableMCUInterrupt();
//开放总中断
}
……
//串行口初始化
KB_Init();
//键盘模块初始化
DDRB=0xff;
//B口为输出
PTB=0xff;
//初始时灯暗
EnableKBInt();
//开放键盘中断
EnableMCUInterrupt(); //开放总中断
//主循环
while(1)
{
} }
键盘中断方式的子程序部分代码
……
#pragma interrupt_handler isrKBI
始执行
//系统初始化
SEI
//关中断
//1.堆栈初始化为RAM最高端
LDHX #RAMEndAddr
//HX=#RAMEndAddr
TXS
//HX->SP
//2.系统初始化
JSR MCUInit
//初学时跳过此处
//3.串行口初始化
JSR SCIInit
//4.B口初始化
LDA #0xff
STA DDRB
法? 答:识别是否有键被按下,主要有查询法、定 时扫描法与中断法。而要识别键盘上哪个键被按下 主要有行扫描法和行反转 法。 3.有哪些方法可以用来消除键盘抖动? 答:当按下一个键时,会出现所按的键在闭合 位置和断开位置之间跳几下才稳定到闭合位置的情 况,当释放一个按键时也会出现类似情况,这就是 抖动问题。在软件上,解决抖动问题的方法通常是 延迟――等待抖动的消失或多次识别判定。 4.课本中的键盘中断编程是如何解决重键问题? 答:所谓重键就是有两个及两个以上按键同时 处于闭合位置的情况。在软件上,处理重键问题通 常有连锁法和巡回 法。 5.课本中的样例直接用小灯检验程序的运行情 况。怎样检验?提示:用接线图来说明。 答:如果小灯的显示结果是按键对应的ASCII 码值,说明程序运行正确,否则程序中或硬件上可 能有错误。 6.在上题中改用万用表来检验,请加以说明。提 示:用接线图来说明。 答:用万用表来检测PTB口的各个引脚的电压 情况也可以得到按键的ASCII码值,依此来判定程
---------------------*
//功能:键盘中断程序,把键定义值从串
口发送出去
*
//调用子程序:(1)扫描法读取键值子程
序(KB_Scan)
*
//
(2)键值转为定义值子程
序(KB_Def)
*
//---------------------------------
---------------------*
数据 D7 D6 D5 D4 位 D3 D2 D1 D0
定义 KBIE7 KBIE6 KBIE5
KBIE4 KBIE3 KBIE2
KBIE1 KBIE0
复位
00000
00 0
(三)主要代码段
1. 汇编方式:
Enable
键盘中断方式的主程序及其中断子程序部分 代码
……
MainInit::
//复位后程序从此开
KB_Int::
SEI
//关总中

PSHH BSET #1,INTKBSCR 盘中断 NOP NOP NOP NOP NOP JSR KB_Scan 盘,读取键值->A JSR SCISend1 值 JSR KB_Def 定义值->A CBEQA #$00,KB_Int_1 JSR SCISend1 定义值 COMA STA PTB 示按键的ASCII码值 KB_Int_1: JSR Delay1000 JSR KB_Init BCLR #1,INTKBSCR 盘中断(IMASKK=0) PULH CLI 断 RTI ……
I/O口对待。 CPU对键盘扫描可以采取程序控制的随机方 式,CPU可以在空闲时扫描键盘。也可以采用定时 控制,每隔一定时间,对键盘扫描一次,CPU可以 随时响应键盘输入中断。采用中断方式,当键盘上 有键闭合时,键盘向CPU请求中断,CPU响应键盘 输入中断,对键盘扫描,以识别哪一个键处于闭合 状态,并对键盘输入信息作出响应处理。CPU对键 盘上闭合键的键号确定,可以根据行线和列线的状 态计算求得,也可以通过行线和列线的状态查表求 得。 四.编程 (一)流程图
//保护H //禁止键
//扫描键 //发送键 //转成键 //发送键 //小灯显
//开放键 //恢复H //开总中
2.C语言方式:
键盘中断方式的主程序部分代码
……
//主函数
void main()
{
DisableMCUInterrupt(); //禁止总中断
MCUInit();
//芯片初始化
SCIInit();
MCU内部电阻 图1 键盘接线原理图 8 7 6 5 4 3 2 1 行线m1
m2
m3
m4 列线 n1 n2 n3 n4
(二)基本原理 GP32的A口的8根引脚与键盘中断模块(KBI) 的引脚复用。作为KBI引脚时,8个引脚分别称为 KBIE7- KBIE0。它们提供了以中断方式识别是否有 按键按下的硬件手段。当然,如果不以中断方式识 别键盘按键,可以屏蔽键盘中断,把A口作为一般
图2 键盘中断流程图(中断方式主程序及其中断子程序)
开始 开始
SCI初始化子程序 头文件 和声明
等待键盘按键中断事件的发生 扫描键盘得到键值 发往串口显示 键盘初始化子程序
查表取得键值对应的定义值 设置键盘中断允许,开放总中断,把B口置为输出,初始暗
发往串口显示 PTB=键定义值
结束
人工复位 1?
五.实验问答(根据实验指导书所列举的问题)
1.本实验中用的是键盘中断编程方式,也可以使
用查询编程方式,请尽量少修改代码改用查询编程
方式重新编写相应的子程序和主程序。提示:注意
重键问题。
答:只要把键盘中断子程序的内容放到主函数
的循环中就可以了。同时去掉中断向量表中关于键
盘中断的中断设置。
2.识别是否有键按下以及哪个键被按下有哪些方
结束
(二)所用寄存器名称及其各个位
键盘状态和控制寄存器(Keyboard Status and Control Register,INTKBSCR)
数据 D7 D6 D5 D4 D3 位 D2 D1 D0
定义 复位
IMASKK MODEK 0 00 0 00
KEY ACKK 00
键盘中断允许寄存器(Keyboard Interrupt Register,INTBIER)
相关文档
最新文档