51单片机汇编语言教程:25课单片机键盘接口程序设计
基于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.从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟下降沿读人数据线状态.1.2 主设备到从设备的通信主设备与从设备进行通信时,主设备首先将时钟线和数据线设置为“请求发送”状态,具体方式为:首先下拉时钟线至少100us抑制通信,然后下拉数据线“请求发送”,最后释放时钟线.在此过程中,从设备在不超过10us的间隔内必须检查这个状态,当设备检测到这个状态时,它将开始产生时钟信号.此时数据传输的每一帧由12位构成,其时序和每一位含义如图3所示.与从设备到主设备通信相比,其每帧数据多了一个ACK位.这是从设备应答接收到字节的应答位,由从设备通过拉低数据线产生,应答位ACK总是为0.主设备到从设备通信过程中,主设备总是在时钟线为低电平时改变数据线的状态,从设备在时钟上升沿读人数据线状态.2 PS/2键盘的编码与命令集2.1 PS/2键盘的编码目前,PC机使用的PS/2键盘都默认采用第2套扫描码集.扫描码有两种不同的类型:“通码(make code)”和“断码(break code)”.当一个键被按下或持续按住时,键盘会将该键的通码发送给主机;而当一个键被释放时,键盘会将该键的断码发送给主机.根据键盘按键扫描码的不同,可将按键分为3类:第1类按键通码为一个字节,断码为0xF0+通码形式.如A键,其通码为0x1C;断码为0xF0 0x1C.第2类按键通码为两字节0xE0+0xXX形式,断码为0xE0+0xF0+0xXX形式.如Right Ctrl键,其通码为0xE0 0x14;断码为0xE0 0xF0 0x14.第3类特殊按键有两个,Print Screen键,其通码为0xE0 0x12 0xE0 0x7C;断码为0xE0 0xF0 0x7C 0xE0 0xF0 0x12.Pause键,其通码为0xE1 0x14 0x77 0xE1 0xF0 0xl4 0xF0 0x77;断码为空.组合按键扫描码的发送是按照按键发生的次序,如按下面顺序按左Shift十A 键:① 按下左Shift键;② 按下A键;③ 释放A键;④ 释放左Shift键,那么计算机上接收到的一串数据为0x12 0x1C 0xF0 0x1C 0xF0 0x12.在文中的驱动程序设计中,就是根据按键的分类对其分别进行处理.2.2 PS/2键盘的命令集主机可通过向PS/2键盘发送命令对键盘进行设置或者获得键盘的状态等操作.每发送一个字节,主机都会从键盘获得一个应答0xFA(“重发resend”和“回应echo”命令例外).驱动程序在键盘初始化过程中所用的指令:0xED,主机在该命令后跟随发送一个参数字节,用于指示键盘上Num Lock,Caps Lock,Scroll Lock Led的状态;0xF3,主机在这条命令后跟随发送一个字节参数定义键盘机打的速率和延时;0xF4,用于当主机发送0xF5禁止键盘后,重新使能键盘.3 PS/2键盘与单片机的连接电路PS/2键盘与AT89C51单片机的连接方式如图4所示.P1.0接PS/2数据线;P3.2(INT0)接PS/2时钟线.因为单片机的P1,P3口内部是带上拉电阻的,所以PS/2的时钟线和数据线可以直接与单片机的P1,P3相连接.4 驱动程序设计驱动程序的开发使用Keil C51语言以及KeiluVision2编程环境.PS/2 104键盘驱动程序主要任务是实现单片机与键盘间PS/2通信,同时将接收到的按键扫描码转换为该按键的键值KeyVal,提供给系统上层软件使用.4.1 单片机与键盘间PS/2通信的程序设计在PS/2通信过程中,主设备(文中是单片机)是在时钟信号为低时发送和接收数据信号.因为单片机向键盘发送的是指令,需要键盘回应,所以这部分程序采用查询方式;而单片机接收键盘数据时,数据线上的信号在时钟为低时已经稳定,所以这部分程序采用中断方式,且不需要在程序中加入延时程序.单片机向PS/2键盘发送数据程序代码为:void ps2_sentchar(unsigned char sentchar){//ps2主设备向从设备发送数据unsigned char sentbit_cnt= 0x00;unsigned char sentchar_chk = 0x00;EX0=0; //关外部中断0//发起一个传送,发起始位PS2_SGN_CLOCK = 0; //将时钟线拉低并保持100 usdelay100us();PS2_SGN_DATA= 0; //起始位PS2_SGN_CLOCK = 1;//发送DATA0-7for(sentbit_cnt=0;sentbit_cnt< 8;sentbit_cnt++){while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变为低PS2_SGN_DATA = sentchar& 0x01;//发送数据if(PS2_SGN_DATA) sentchar_chk++; //计算校验while(!PS2_SGN_CL0CK) _nop_(); //等待时钟线变高sentchar>>=1; //待发送数据右移一位}//发送校验位while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变低switch(sentchar_chk){case 0:case 2:case 4:case 6:PS2_SGN_DATA =1;break;//奇校验case 1:case 3:case 5:case 7:PS2_SGN_DATA = 0;break;//奇校验default;break;)while(!PS2_SGN_CLOCK) _nop_(); //等待时钟线变高while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变低PS2_SGN_DATA =1;//发送停止位,停止位总为1while(!PS2_SGN_CLOCK) _nop_(); //等待时钟线变高while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变低//接收ACK//if(PS2_SGN_DATA) error();//ACK信号由键盘发出,总为低电平while(!PS2_SGN_CLOCK) _nop_(); //等待时钟线变高EX0= 1; //开外部中断0}单片机由PS/2键盘接收数据程序:外部中断0设置为下降沿触发void int0() interrupt 0 using 0 {//EX0=0; //关外部中断0switch(ps2_revchar_cnt){case 1:……case 8:mcu_revchar<<=1;if(PS2_SGN_DATA) mcu_revchar |= 0x01;ps2_revchar_cnt++;break;case 0:ps2_revchar_cnt++;break; //开始位,case 9:ps2_revchar_cnt++;break; //校验位,可添加校验程序case 10: _nop_();//停止位ps2_revchar_cnt= 0;revchar_flag=1;//置接收到数据标识位break;default:break;}EX0=1;//开外部中断0}4.2 键盘扫描码转换程序设计由于键盘扫描码无规律可循,因此由键盘扫描码获得相应按键的键值(字符键为其ASCII值,控制键如F1,Ctrl等为自定义值),只能通过查表的方式获得.由于按键的3种类型及部分按键对应着两个键值(如A键的键值根据Caps和Shift键状态有0x41(A)和0x61(a)两种),因此综合考虑查表转换速度和资源消耗,设计中使用4个键盘表:键盘扫描码转换基本集和切换集(kb_plain_map[NR_KEYS]与kb_shift_map[NR_KEYS]);包含E0前缀的键盘扫描码转换基本集和切换集(kbeO_plain_map[NR_KEYS]与kbe0_shiftmap[NR_KEYS]).PS/2 104键盘按键扫描码最大值为0x83,所以设置NR_KEYS为132.所有4个键盘表的定义均为如下形式:KB_MAP[MAKE CODE]=KEYVAL,如果扫描码对应的按键为空(如KB_MAP[0x00]),则定义相应键值为NULL_KEY(0x00).以下是键盘扫描码基本集的部分代码实例: kb_plain_map[NR_KEYS]={……NULL_KEY;0x2C;0x6B;0x69;0x6F;0x30;0x39;NULL_KEY; //扫描码0x40~0x47//对应按键空,逗号,K,I,O,0,9,空//对应键值0x00,',','k','i','o','O','9',0x00…… };如此设计键盘转换表的另一个好处在于,以后如需扩展支持有ACPI、Windows多媒体按键键盘时,只需要将键表中相应处修改即可,如ACPIPower按键通码为0xE0 0x37,修改kbe0_plain_map[0x37]=KB_ACPI_PWR即可. 特殊按键Pause使用单独程序处理,如果接收到0xE1就转入这段程序.而Print Screen键则将其看作是两个通码分别为0xE0 0x12和0xE0 0x7C的“虚键”的组合键处理.在驱动程序中设定如下全局变量:led_status记录Scroll Lock Led,Num Lock Led和Caps Lock Led的状态(关为0,开为1);agcs_status记录左右Shift Ctrl Gui Alt状态,相应键按下则对应位为1,释放为0.E0_FLAG接到0xE0置1;E1_FLAG接收到0xE1置1;F0_FLAG接收到0xF0置1.按键键值通过KeyVal提供上层程序使用.PS/2键盘扫描码键值转换程序ps2_codetrans()流程框架如图5所示.第1类按键的扫描码键值转换程序代码。
51单片机汇编语言入门教程
51单片机汇编语言入门教程什么是51单片机
51单片机指的是英特尔公司推出的一种单片机芯片种类,其名字为“AT89S52”。
后来,这种芯片因其使用广泛,被人们简称为“51单片机”。
为什么要研究汇编语言
研究汇编语言能够让我们更好地理解机器是如何执行指令的,
从而更好地优化程序,提高程序运行效率。
汇编语言基础知识
数据类型
- 字节:一个字节是8位二进制数,可以表示0~255之间的数。
- 字:一个字是16位二进制数,可以表示0~之间的数。
- 双字:一个双字是32位二进制数,可以表示0~之间的数。
指令集
51单片机有大约100条汇编指令,这些指令可以完成各种操作,如运算、数据传输、中断处理等。
寄存器
51单片机有4个8位的通用寄存器(寄存器0~3)和2个16
位的通用寄存器(DPTR和PC)。
程序结构
51单片机只有一种程序结构——线性结构。
程序从0地址开始执行,一条一条地执行,直到程序结束。
编写第一个汇编程序
以下是一个简单的汇编程序示例:
ORG 0H ;设置程序起始地址为0H
MOV P1, #55H ;将55H赋值给P1口
END ;程序结束指令
这个程序的作用是将55H赋值给P1口。
总结
通过学习本教程,我们了解了基本的汇编语言知识,包括数据
类型、指令集、寄存器、程序结构以及编写程序的基本步骤。
希望
这份教程可以帮助初学者顺利掌握51单片机汇编语言编程的基础。
单片机c51汇编语言51单片机汇编语言
单片机c51汇编语言51单片机汇编语言单片机C51汇编语言单片机(C51)是指一种集成电路上只包含一个集中式控制器的微处理器,具有完整的CPU指令集、RAM、ROM、I/O接口等功能。
汇编语言是一种低级语言,是用于编写单片机指令的一种语言。
汇编语言能够直接操作单片机的寄存器和输入/输出端口,因此在嵌入式系统的开发中非常重要。
本文将介绍单片机C51的汇编语言编程。
一、了解单片机C51单片机C51是目前应用最广泛的一种单片机系列,广泛用于各种电子设备和嵌入式系统的开发。
C51指的是Intel公司推出的一种基于MCS-51架构的单片机。
该系列单片机具有较高的性能和低功耗的特点,可用于各种控制和通信应用。
二、汇编语言的基本概念汇编语言是一种低级语言,与机器语言紧密相关。
它使用助记符来代替机器指令的二进制表示,使程序的编写更加易读。
在单片机C51汇编语言中,每一条汇编指令都对应着特定的机器指令,可以直接在单片机上执行。
三、汇编语言的基本指令在单片机C51汇编语言中,有一些基本的指令用于控制程序的执行和操作寄存器。
以下是一些常用的指令:1. MOV指令:用于将数据从一个寄存器或内存单元复制到另一个寄存器或内存单元。
2. ADD指令:用于将两个操作数相加,并将结果存储到目的寄存器中。
3. SUB指令:用于将第一个操作数减去第二个操作数,并将结果存储到目的寄存器中。
4. JMP指令:用于无条件跳转到指定的地址。
5. JZ指令:用于在条件为零时跳转到指定的地址。
6. DJNZ指令:用于将指定寄存器的值减一,并根据结果进行跳转。
四、编写单片机C51汇编程序的步骤编写单片机C51汇编程序需要按照以下步骤进行:1. 确定程序的功能和目标。
2. 分析程序的控制流程和数据流程。
3. 设计算法和数据结构。
4. 编写汇编指令,实现程序的功能。
5. 调试程序,并进行测试。
六、实例演示以下是一个简单的单片机C51汇编程序的示例,用于实现两个数的相加,并将结果输出到LED灯上:org 0H ; 程序的起始地址为0mov a, 05H ; 将05H赋值给累加器mov b, 07H ; 将07H赋值给B寄存器add a, b ; 将A寄存器和B寄存器的值相加mov P1, a ; 将相加结果输出到P1口end ; 程序结束在这个例子中,首先将05H赋值给累加器A,然后将07H赋值给B寄存器,接着使用ADD指令将A和B的值相加,将结果存储到累加器A中,最后将累加器A的值输出到P1口。
大学课件MCS51单片机指令系统与汇编语言程序设计
ANL C, P ; (C)← (C)∧(P)
其中:P是PSW的第0位,C是PSW的第7位。
(4)字节符号地址(字节名称)加位序号的形式。对于部分特 殊功能寄存器(如状态标志寄存器PSW),还可以用其字节名 称加位序号形式来访问某一位。AC 如:
定义:操作数存放在MCS-51内部的某个工作寄存器Rn (R0~R7)或部分专用寄存器中,这种寻址方式称为 寄存器寻址。
特点:由指令指出某一个寄存器的内容作为操作数。 存放操作数的寄存器在指令代码中不占据单独的一个 字节,而是嵌入(隐含)到操作码字节中。
寻址范围:四组通用寄存器Rn(R0~R7)、部分专用 寄存器( A, B, DPTR, Cy )。
伪指令只出现在汇编前的源程序中,仅提供汇编用的某些控制 信息,不产生可执行的目标代码,是CPU不能执行的指令。
(1)定位伪指令ORG
格式:ORG n
其中:n通常为绝对地址,可以是十六进制数、标号或表达式。
功能:规定编译后的机器代码存放的起始位置。在一个汇编 语言源程序中允许存在多条定位伪指令,但每一个n值都应和前
2.2.2 直接寻址
定义:将操作数的地址直接存放在指令中,这种寻址方式称为 直接寻址。 特点:指令中含有操作数的地址。该地址指出了参与操作的数 据所在的字节单元地址或位地址。计算机执行它们时便可根据 直接地址找到所需要的操作数。
寻址范围:ROM、片内RAM区、SFR和位地址空间。P42
2.2.3 寄存器寻址
定义:指令中给出的操作数是一个可单独寻址的位地址,这种寻址 方式称为位寻址方式。
特点:位寻址是直接寻址方式的一种,其特点是对8位二进制数中 的某一位的地址进行操作。
寻址范围:片内RAM低128B中位寻址区、部分SFR(其中有83位 可以位寻址)。
51单片机汇编语言教程
51单片机汇编语言教程汇编语言是一种低级程序设计语言,直接操作计算机硬件,能够充分发挥硬件的性能,是学习嵌入式系统开发的基础。
而51单片机是广泛应用于嵌入式系统中的一种微控制器,具有功能强大、易于掌握等特点。
本篇文章将为大家介绍51单片机汇编语言的基本概念、编程指令以及应用实例,帮助读者快速入门。
一、51单片机汇编语言概述1.1 51单片机简介51单片机是一种由英特尔公司设计的8位微控制器,其核心是一个CPU,具有RAM、ROM、I/O端口等外围设备。
它采用的是汇编语言编程,具有指令集简单、易于学习等特点,因此深受嵌入式系统开发者的喜爱。
1.2 汇编语言的基本概念汇编语言是一种低级语言,与高级语言相比,更接近计算机底层的硬件操作。
在汇编语言中,程序员通过编写指令来告诉计算机具体的操作,如数据存储、运算等。
二、51单片机汇编语言基础知识2.1 寄存器寄存器是51单片机中的一种重要的存储设备,用于存储数据、地址等信息。
51单片机共有32个寄存器,其中一部分用于存储通用数据,一部分用于存储特定功能的数据。
在汇编语言编程中,我们可以使用这些寄存器来存储数据和进行运算。
2.2 程序存储器程序存储器是51单片机中存储程序的地方,它可以分为ROM和RAM两种类型。
其中,ROM存储的是不可修改的程序代码,而RAM 存储的是可以读写的数据。
2.3 I/O端口I/O端口是51单片机与外部设备进行数据交互的接口,通过输入/输出指令,可以实现数据的输入与输出。
在汇编语言中,我们需要了解如何使用I/O端口来与外部设备进行通信。
三、51单片机汇编语言编程指令3.1 数据传输指令数据传输指令用于将数据从一个地方传输到另一个地方。
常用的数据传输指令有MOV、MOVC、MOVX等,通过这些指令可以实现数据的读取、存储和传输等操作。
3.2 算术运算指令算术运算指令用于对数据进行加、减、乘、除等运算操作。
51单片机中的算术运算指令包括ADD、SUB、MUL、DIV等,通过这些指令可以对数据进行各种运算操作。
51单片机汇编语言程序设计
单片机原理与接口技术
中北大学电子科学技术专业
返回目录
8
4.1.3 汇编语言的规范
2.伪指令
---伪指令 伪指令ORG 伪指令
MCS-51系列单片机的常用伪指令有 ORG、 MCS-51系列单片机的常用伪指令有:ORG、 系列单片机的常用伪指令有: END、EQU、DB、DW、DS和BIT等 END、EQU、DB、DW、DS和BIT等。
23:24
单片机原理与接口技术
中北大学电子科学技术专业
返回目录
9
4.1.3 汇编语言的规范
(2)汇编结束伪指令END 汇编结束伪指令END
格式:[标号:] 格式: 标号:] END [表达式] [表达式 表达式]
---伪指令 伪指令END 伪指令
功能:结束汇编。汇编程序遇到END伪指令后即结束汇 功能:结束汇编。汇编程序遇到END伪指令后即结束汇 编。处于END之后的程序,汇编程序不予处理。 处于END之后的程序 汇编程序不予处理。 之后的程序, ORG 2000H 如: START: MOV A, #00H … END START ;表示标号START开始的程序段结束。 表示标号START开始的程序段结束 开始的程序段结束。
以上伪指令经汇编以后, 以上伪指令经汇编以后,将从 1010H开始的若干内存单元赋值。 1010H开始的若干内存单元赋值。 开始的若干内存单元赋值
23:24
单片机原理与接口技术
中北大学电子科学技术专业
返回目录
12
4.1.3 汇编语言的规范
(5)定义字伪指令 )定义字伪指令DW
[标号:] 标号: DW 16位二进制数表 16位二进制数表
(7)位定义伪指令BIT 位定义伪指令BIT
MCS51单片机指令系统与汇编语言程序设计
MCS51单片机指令系统与汇编语言程序设计MCS-51是一种非常常见的8位单片机系列,该系列包括了多种型号的单片机,如Intel 8051、8031、8052等。
MCS-51单片机指令系统是一组用于驱动该系列单片机的指令集,汇编语言程序设计是利用这些指令来编写程序。
MCS-51单片机指令系统包含了多种指令,可以执行诸如数据传输、算术逻辑运算、控制和数据访问等功能。
这些指令通过各种不同的寻址模式来操作数据,包括立即寻址、寄存器寻址、直接寻址、间接寻址和寄存器间接寻址等。
不同的寻址模式和指令组合可以实现不同的功能。
汇编语言程序设计通过将人类可读的汇编指令翻译成机器可执行的二进制指令来编写程序。
在MCS-51单片机中,汇编指令由操作码和操作数组成。
操作码指定了所执行的操作,如数据传输、算术运算或控制指令。
操作数则指定了指令要操作的数据。
下面以一个简单的例子来说明MCS-51单片机指令系统和汇编语言程序设计的基本原理。
假设我们要编写一个程序,将两个寄存器中的数据相加,并将结果存储到第三个寄存器中。
首先,我们需要将第一个寄存器的值加载到累加器A中,这可以通过MOV指令实现。
MOV指令的操作码为01,操作数为两个寄存器的地址。
例如,MOVA,R0将R0的值加载到A中。
接下来,我们需要将第二个寄存器的值加载到B寄存器中,同样可以使用MOV指令。
MOVB,R1将R1的值加载到B中。
然后,我们可以使用ADD指令将A和B中的值相加,并将结果存储到A中。
ADD指令的操作码为04,操作数为A的地址。
例如,ADDA将累加器中的值与A寄存器中的值相加,并将结果存储到A中。
最后,我们可以使用MOV指令将A中的结果移动到第三个寄存器中,例如,MOVR2,A将A的值移动到R2中。
通过组合使用这些指令,我们可以实现将两个寄存器中的值相加并存储到第三个寄存器中的功能。
总结来说,MCS-51单片机指令系统和汇编语言程序设计是一种用于编程控制该系列单片机的方式。
51 单片机 编程语言
51 单片机编程语言
51单片机是一种非常流行的单片机,它广泛应用于各种嵌入式
系统中。
它的编程语言主要是汇编语言和C语言。
汇编语言是一种
底层的语言,它直接操作单片机的寄存器和内存,可以实现高效的
控制和优化。
而C语言则是一种高级语言,它更易于理解和编写,
适合开发复杂的嵌入式系统。
使用51单片机编程语言可以实现各种功能,例如控制各种外围
设备、处理各种传感器数据、实现通信功能等。
由于其灵活性和高
性能,51单片机编程语言被广泛应用于各种领域,如工业控制、汽
车电子、家用电器等。
对于初学者来说,学习51单片机编程语言可能会有一定的难度,特别是对于汇编语言的学习。
但是一旦掌握了这些编程语言,就能
够实现更加复杂和功能丰富的嵌入式系统。
因此,学习51单片机编
程语言是非常有价值的。
总的来说,51单片机编程语言是一种非常重要的编程语言,它
在嵌入式系统领域有着广泛的应用,对于想要从事嵌入式系统开发
的人来说,学习这门编程语言是非常值得的。
51单片机学习(键盘接口)-2013.5.12
械触点的断开、闭合,其输出波形如图10-6。
触点抖动
行线 上拉 电阻
?
?
图10-6
?
10.2.2
键盘接口的工作原理
P.167
分独立式按键接口和行列式键盘接口。
1.独立式键盘接口 (适于键数较少、操作快、同时多键动作场合) 各键相互独立,每个按键各接一根输入线,通过检测输入线 的电平状态可很容易判断那个键被按下。
第1步:识别键盘有无键按下; 驱动所有列线为‘0’,输入各行线电平如果有‘0’,就说明 有键按下,如果行线电平全‘1’,则全部无键按下。 第2步:如有键被按下,识别具体的按键。 依序驱动某一列为‘0’ ,其余列均为‘1’ ,输入各行线电平, 如果某行线电平为‘0’ ,可确定此行列交叉点处的按键被按下; 如果行线电平全为‘1’ 则本列无按键按下。
程序处理方法与开关量输入相同
图10-7独立式键盘工作电路
2. 行列式(矩阵式)键盘接口 • 适于按键数目较多的场合; • 可节省很多的I/O口线; • 同时只会有一个键闭合的场合。 行列式键盘按键的识别方法
P.168 输 入 口 读 取 行 线 电 平
a. 扫描法
输出口驱动列线
图10-9 4×4行列式键盘结构(扫描法)
TEST2011.ASM 键盘扫描子程序--4 K7:MOV 35H,#07H SJMP RT0 K8:MOV 35H,#08H SJMP RT0 K9:MOV 35H,#09H SJMP RT0 KA:MOV 35H,#0AH SJMP RT0 KB:MOV 35H,#0BH SJMP RT0 KC:MOV 35H,#0CH SJMP RT0 KD:MOV 35H,#0DH SJMP RT0 KE:MOV 35H,#0EH SJMP RT0 KF:MOV 35H,#0FH RT0:MOV 34H,#10H RET
C51单片机汇编语言程序设计
C51单片机汇编语言程序设计一、二进制数与十六进制数之间的转换1、数的表达方法为了方便编程时书写,规定在数字后面加一个字母来区别,二进制数后加B十六进制数后加H。
2、二进制数与十六进制数对应表二进制十六进二进制制0000000100100011010001010110011101234567100010011010101111001101 11101111十六进制89ABCDEF3、二进制数转换为十六进制数转换方法为:从右向左每4位二进制数转化为1位十六进制数,不足4位部分用0补齐。
例:将(1010000110110001111)2转化为十六进制数解:把1010000110110001111从右向左每4位分为1组,再写出对应的十六进制数即可。
0101000011011000111150D8F答案:(1010000110110001111)2=(50D8F)16例:将1001101B转化为十六进制数解:把10011110B从右向左每4位分为1组,再写出对应的十六进制数即可。
100111109E答案:10011110B=9EH4、十六进制数转换为二进制数转换方法为:将每1位十六进制数转换为4位二进制数。
例:将(8A)16转化为二进制数解:将每位十六进制数写成4位二进制数即可。
8A10001010答案:(8A)16=(10001010)2例:将6BH转化为二进制数解:将每位十六进制数写成4位二进制数即可。
6B01101011答案:6BH=01101011B二、计算机中常用的基本术语1、位(bit)计算机中最小的数据单位。
由于计算机采用二进制数,所以1位二进制数称作1bit,例如110110B为6bit。
2、字节(Byte,简写为B)8位的二进制数称为一个字节,1B=8bit3、字(Word)和字长两个字节构成一个字,2B=1Word。
字长是指单片机一次能处理的二进制数的位数。
如AT89S51是8位机,就是指它的字长是8位,每次参与运算的二进制数的位数为8位。
计算机接口技术课件第三章MCS51单片机汇编语言与程序设计基础
;重置时间常数
;P1.1取反
;中断返回
3-4分支程序
由条件转移指令构成程序判断框部分,形成程序分支结构。
例题:设变量x以补码数的形式存放在片内RAM30H单元,函数y
与x有如下关系式(此题关键在于识别X的模态)
X,x>0
y #20H,x=0
X+5,x<0
80H=1000 0000
片内 RAM MAX
… 5 2 4 1 TAB→ 3
外循环初始化 内循环初始化
循环工作 内循环控制 ? 外循环控制 ?
循环结束
SORT: MOV A,#N-1 MOV R4,A
LOOP1: MOV A,R4 MOV R3,A MOV R0,#TAB
LOOP2: MOV A,@R0 MOV B,A INC R0 MOV A,@R0 CJNE A,B,L1
RAM
RET
R0+1→ 0 AH
2)调用子程序UFOR1之前,将待
R0→ 0 AL
分解的内容送A,存放地址送R0。
3)输出结果放在DISMEM0~5
例 子程序:比较两个数据串是否完全相等,若完全相等,A=0; 否则A=FFH。
元。1班的人数在40H里
3-5-3 多重循环
循环体中套循环结构。以双重循环使用较多。
例:将内存一串单字节无符号数升序排序。
步骤:每次取相邻单元的两个数比较,决定是否需要交换数 据位置。
第一次循环,比较N-1次,取到数据表中最大值。
第二次循环,比较N-2次,取到次大值。
开始
…
第N-1次循环:比较一次,排序结束。
3-1 汇编程序的约定
汇编语言程序: 用汇编语言编写的、完成特定功能的指令序列。
单片机课件第三章 MCS-51系列单片机的指令系统和汇编语言程序设计.ppt
从1000H单元开始,保留8个连续单元备用。
7)赋值年伪指令EQU 格式: 名字 EQU 表达式 把表达式表示的值赋给名字。
例:
ABC EQU 8500H DEF EQU ABC+50H
§3-2 寻址方式
指令给出参与运算的数据的方式称为寻址方式。
对!
错!
MOV P1,R0
寻址比较
对!
错!
① 直接将20H这个数送P1口
MOV P1,@R0
② 地址在寄存器R0里面
MOV P1,20H
③ 地址是寄存器R0
MOV P1,#20H
④ 地址是内存20H
错!
错!
错!
错!
寻址比较
MOV P1,R0 MOV P1,@R0 MOV P1,20H MOV P1,#20H
49
48
41
40
39 38
31
30
29
28
21
20
19
18
11
10
09
08
01
00
立即数寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址
SETB 3DH
28H 27H
21H 20H
0 0 10 0 0 0 0 0
···
···
例: 指令地址 机器码 0100H 7402 0102H 83 0103H 00 0104H 00 0105H 56
①
②
注:找信是寻找信的“地 址”!
你能说出第 二封信的
“地址”吗?
立即数寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址
51基本汇编语言程序设计
第 5 章 基本汇编语言程序设计
DATA SEGMENT
DATATAB DW ROUTINE_1
DW ROUTINE_2
DW ROUTINE_3
DW ROUTINE_4
DW ROUTINE_5
DW ROUTINE_6
DW ROUTINE_7
DW ROUTINE_8
DATA
ENDS
21
第 5 章 基本汇编语言程序设计
除非编程解决非常简单的问题,顺序程序并不多见,
但是顺序程序往往是复杂程序结构的一部分,如分支
结构的一个分支,循环结构的循环体等。
3
5.1顺序程序设计(e)
第 5 章 基本汇编语言程序设计
例5.1:设有3个字变量x,y和源自,求出三者之和,结果 存入字变量w。
DATAS SEGMENT X dw 5 Y dw 6 Z dw 7 W dw ? DATAS ENDS CODES SEGMENT
E C A 8 6 4 2 0
disp1
18
第 5 章 基本汇编语言程序设计
5.3.3 跳跃表法 分支程序的两种结构形式都可以用上面所述的方 法来实现。此外,在实现CASE结构时,还可以使 用跳跃表法,使程序能根据不同的条件转移到多 个程序分支中去。下面举例说明。 【例5-6】 试根据AL寄存器中哪一位为1(从低位 到高位)就把程序转移到8个不同的程序分支中去。
15
双分支
第 5 章 基本汇编语言程序设计
⑵分支的嵌套形成多分支,嵌套形式多种多样。 例1:求符号函数 1 当 X>0
Y= 0 当 X=0 -1 当 X<0
X≥0?
Y
N Y=-1
X=0?
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机汇编语言教程:第25课-单片机键盘接口程序设计
关S未被按下时,P1。
0输入为高电平,S闭合后,P1。
0输入为低电平。
由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。
0输入端的波形如图2所示。
这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。
前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。
为使CPU能正确地读出P1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。
单片机中常用软件法,因此,对于硬件办法我们不介绍。
软件法其实很简单,就是在单片机获得P1。
0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1。
0口,如果仍为低,说明S1的确按下了,这实际上是避开了按钮按下时的抖动时间。
而在检测到按钮释放后(P1。
0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。
不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。
当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的
原则。
键盘与单片机的连接
<键盘连接>
图3<单片机与键盘接口图>图41、通过1/0口连接。
将每个按钮的一端接到单片机的I/O 口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2、P3.3、P3.4和P3.5。
对于这种键各程序能采用持续查询的办法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入对应的键处理。
下面给出一个例程。
其功能很简单,四个键定义如下:
P3.2:开始,按此键则灯开始流动(由上而下)
P3.3:停止,按此键则停止流动,所有灯为暗
P3.4:上,按此键则灯由上向下流动
P3.5:下,按此键则灯由下向上流动
UpDown EQU 00H ;上下行标志
StartEnd EQU 01H ;起动及停止标志
LAMPCODE EQU 21H ;存放流动的数据代码
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P1,#0FFH
CLR UpDown ;启动时处于向上的状态
CLR StartEnd;启动时处于停止状态
MOV LAMPCODE,#0FEH;单灯流动的代码
LOOP:
ACALL KEY;调用键盘程序
JNB F0,LNEXT;如果无键按下,则继续
ACALL KEYPROC;不然调用键盘处理程序
LNEXT:
ACALL LAMP;调用灯显示程序
AJMP LOOP;反复循环,主程序到此结束
DELAY:
MOV R7,#100
D1:MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
;----------------------------------------延时程序,键盘处理中调用
KEYPROC:
MOV A,B;从B寄存器中获取键值
JB ACC.2,KeyStart;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)JB ACC.3,KeyOver
JB ACC.4,KeyUp
JB ACC.5,KeyDown
AJMP KEY_RET
KeyStart:
SETB StartEnd;第一个键按下后的处理
AJMP KEY_RET
KeyOver:
CLR StartEnd;第二个键按下后的处理
AJMP KEY_RET
KeyUp:SETB UpDown;第三个键按下后的处理
AJMP KEY_RET
KeyDown:
CLR UpDown;第四个键按下后的处理
KEY_RET:RET
KEY:
CLR F0;清F0,表示无键按下。
ORL P3,#00111100B;将P3口的接有键的四位置1
MOV A,P3;取P3的值
ORL A,#11000011B;将其余4位置1
CPL A;取反
JZ K_RET;如果为0则一定无键按下
ACALL DELAY;不然延时去键抖
ORL P3,#00111100B
MOV A,P3
ORL A,#11000011B
CPL A
JZ K_RET
MOV B,A;确实有键按下,将键值存入B中
SETB F0;设置有键按下的标志
K_RET:
ORL P3,#00111100B;此处循环等待键的释放
MOV A,P3
ORL A,#11000011B
CPL A
JZ K_RET1;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回AJMP K_RET
K_RET1:
RET
D500MS:;流水灯的延迟时间
PUSH PSW
SETB RS0
MOV R7,#200
D51:MOV R6,#250
D52:NOP
NOP
NOP
NOP
DJNZ R6,D52
DJNZ R7,D51
POP PSW
RET
LAMP:
JB StartEnd,LampStart;如果StartEnd=1,则启动MOV P1,#0FFH
AJMP LAMPRET;不然关闭所有显示,返回LampStart:
JB UpDown,LAMPUP;如果UpDown=1,则向上流动MOV A,LAMPCODE
RL A;实际就是左移位而已
MOV LAMPCODE,A
MOV P1,A
LCALL D500MS
AJMP LAMPRET
LAMPUP:
MOV A,LAMPCODE
RR A;向下流动实际就是右移
MOV LAMPCODE,A
MOV P1,A
LCALL D500MS
LAMPRET:
RET
END
以上程序功能很简单,但它演示了一个单片机键盘处理程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按钮反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家能仔细考虑一下这些问题,再想想有什么好的解决办法。
2、采用中断方式:如图4所示。
各个按钮都接到一个与非上,当有任何一个按钮按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中持续地循环查询,如果有键按下,单片机再去做对应的处理
51实验板推荐(点击下面的图片可以进入下载资料链接)
HJ-1G HJ-3G。