《单片机应用实例开发》课件第6章_第1页
《单片机应用实例开发》课件第6章_第2页
《单片机应用实例开发》课件第6章_第3页
《单片机应用实例开发》课件第6章_第4页
《单片机应用实例开发》课件第6章_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6.1显示器及其接口的设计

6.2键盘及其接口

6.3简单计算器的设计

6.4习题实例六人机接口的设计

学习目标

◆理解简单计算器的电路构成、工作原理和电路中各元器件的作用。

◆正确设计单片机应用系统的显示接口和键盘接口。

◆正确理解和使用子程序设计方法。

工作任务

◆设计与制作简单计算器。6.1显示器及其接口的设计

学习目标◆正确理解静态数码管显示电路的构成、工作原理和电路中各元器件的作用,并对电路进行分析。◆正确理解动态数码管显示电路的构成、工作原理和电路中各元器件的作用,并对电路进行分析。

工作任务

◆数码管静态显示“2008”四个数字。

◆数码管动态显示“1234”四个数字。

在实际的单片机应用系统中,都需要有一定的人机接口,即与控制者(人)进行人机交流的输入/输出设备,以便控制者对单片机进行操作控制或单片机向控制者显示某些必要的数据。常用的输入/输出设备有键盘、LED(LightEmittingDiode)显示器、LCD显示器等。

6.1.1LED显示器

在3.4节我们已经学习了单个数码管显示接口设计,但在实际应用中往往需要多个数码管用于显示,例如普通电子钟的显示就需要6个数码管分别显示时、分、秒。多位数码管显示的方式有两种:静态显示和动态显示。

数码管显示的段码如表6-1所示,各发光段a、b、c、d、e、f、g、dp与数据线D0~D7对应,即a对应D0,b对应D1,…,dp对应D7。6.1.2LED静态显示方式

LED显示器工作于静态显示方式时,各LED的位选线(共阴极或共阳极)连接到一起并接地或接 +5 V;每个LED的段码线(a~dp)分别与一个8位的锁存器输出相连。各LED的显示字符一经确定,则相应锁存器应锁存段码输出维持不变,直到送入新字形的段码为止。正因为如此,所以静态显示器的亮度较高。这种方法的优点是编程容易,管理较简单;缺点是占用较多的I/O口资源,硬件比较复杂。若要显示较多的位数,则需要增加较多的锁存器。因此在显示位数较多的情况下,一般采用动态显示方式。

【练习】

项目:数码管静态显示。

项目编号:EX6_1。

任务要求:设计一个数码管静态显示电路,实现4个LED数码管分别显示“2008”四个数字,数码管为共阴极数码管。在MedWin集成开发环境中编辑/编译控制程序,并产生代码,在Proteus平台里仿真系统,撰写练习报告(格式要求见附录A)。

设计设备与软件:计算机1台,MedWin或其他同类软件1套,Proteus软件1套。设计步骤:

(1)打开MedWin软件。

(2)新建源程序文件,编辑源代码。

(3)编译源程序,若没有错,则产生代码;若有错,则修改错误。

(4)仿真调试程序代码。

(5)在Proteus中打开4位数码管静态显示电路图。

(6)加载程序代码,调试。

1.设计思路

根据上面介绍的数码管静态显示方法,在电路设计上,可以考虑采用74LS273或74LS373等锁存器来锁存每个数码管的段码,锁存器的选通信号由单片机的I/O口进行控制。位选位采用直接接地的方式。设计仿真图如图6-1所示。软件设计比较简单,主要考虑各个锁存器的选通信号何时有效,最终实现4个LED数码管分别显示“2008”四个数字。数码管静态显示流程图如图6-2所示。图6-14位数码管静态显示仿真图图6-24位数码管静态显示流程图

2.程序设计所需指令表

程序设计所需指令表如表6-2所示。

3.参考程序代码

参考程序代码如下:

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN: MOV SP,#5FH ;程序初始化

MOV DPTR,#TAB ;段码表地址给 DPTR

MOV R0,#00H

MOV R1,#01H

MOV P2,#00H

LOOP: MOV A,R1

MOV P2,A ;送位选位

RL A

MOV R1,A

MOV A,R0

MOVCA,@A+DPTR ;得到当前要显示数据的段码

MOV P0,A

INC R0

MOV P2,#00H

ACALL DELAY10MS

CJNE R0,#03H,LOOP;四位数据是否都已显示完成? 若没有则再次显示下一位数据;若完成了,则顺序往下

AJMP $ DELAY10MS:

MOV R7,#50

DEL1: MOV R6,#100

DJNZ R6,$

DJNZ R7,DEL1

RET

TAB: DB 5BH,3FH,3FH,7FH

END

6.1.3LED动态显示方式

在有多位LED显示时,为了简化电路,降低成本,通常将各LED的段码线并联在一起,由一个8位I/O口控制,形成段码线的多路复用;各LED的位选线(共阴极或共阳极公共端)分别由相应的I/O口控制,实现各LED的分时选通,如图6-3所示。显示时轮流向各位数码管送出各字型的段码和相应的位选,位选选中的LED则显示段码对应的字符,没选中的LED则不显示新的内容,利用发光二极管的余辉和人眼视觉的暂留作用,使人感觉各个LED数码管好像同时都在显示。动态扫描显示的优点是电路简单,占用I/O资源少,成本低;缺点是占用CPU,软件稍复杂。图6-34位数码管动态显示图图6-3是由4个LED显示器组成的动态显示电路。由于每个LED的段码线都并联在一起,所以在某一瞬间,如果各LED位选都选通,则4个LED显示相同的字符。但是如果要显示不同字符,则必须采用动态扫描法轮流选通各个LED的位选,即在某一瞬间,段码线输出想要显示字符的段码,而位选线控制某个想要其点亮的LED(此处应选第一个),使其COM端为低电平。这样第一个数码管就显示了当前送入的段码对应的字符。同样在下一个时刻,让第二个LED被选中,其他不被选中,则第二个LED显示新的字符。如此轮流,使每位LED数码管分时显示不同的字符。若要显示“1234”,则应分时在P0口、P2口轮流输入段码、位选码,如表6-3所示。段码、位选码每送入一次要延时一段时间,以便让LED可以达到一定的亮度,一般这个时间我们设定为10ms。同时不要超过100ms,因为人眼的视觉暂留时间为100 ms,这样就可以造成视觉暂留效果,让人看上去每个数码管都是亮着的。

【练习】

项目:数码管动态显示。

项目编号:EX6_2。

任务要求:在Proteus中设计如图6-4所示的数码管动态显示电路,实现4个LED数码管分别显示“1234”四个数字,P0口输出段选码,P2口输出位选码,数码管为共阳极数码管。在MedWin集成开发环境中编辑/编译控制程序,并产生代码,在Proteus平台里仿真系统,撰写练习报告(格式要求见附录A)。

设计设备与软件:计算机1台,MedWin或其他同类软件1套,Proteus软件1套。设计步骤:

(1)打开MedWin软件。

(2)新建源程序文件,编辑源代码。

(3)编译源程序,若没有错,则产生代码;若有错,则修改错误。

(4)仿真调试程序代码。

(5)在Proteus中打开4位数码管动态显示电路图。

(6)加载程序代码,调试。

1.设计思路

根据前面讲述的动态显示方法以及数码管静态显示时所采用的查表法显示方法,在电路设计上,可以参考图6-3所示的原理图进行设计,设计仿真图如图6-4所示。此处采用4个相连的共阳极LED,位选位高电平有效。要让不同的数码管显示不同的数值,需将显示数值的段码送给数码管的各段,位选位用来选择具体哪个数码管被点亮,以实现4个LED数码管分别显示“1234”四个数字。数码管动态显示流程图如图6-5所示。图6-4数码管动态显示仿真图图6-5数码管动态显示流程图

2.程序设计所需指令表

程序设计所需指令表如表6-4所示。

3.参考程序代码

参考程序代码如下:

ORG 0000H

LJMPMAIN

ORG 0030H

MAIN: MOV R0, #00H ;置显示初值

MOVR1, #80H ;置选中第一个LED的位选

MOVR2, #03H ;置要显示的位的个数

MOVDPTR, #TAB ;送段码表头地址至DPT

LOOP:MOV A, R1 ;取位选

MOVP2, A ;送位选至P2口

RR A ;指向下一位LED

MOVR1, A ;保存位选

MOVA, R0 ;取显示数据

MOVCA, @A+DPTR ;取显示数据的段码

MOVP0, A ;送段码至P0口

LCALLDELAY10MS ;延时10ms

INC R0 ;显示数据加1

DJNZR2, LOOP

;要显示的4位数据显示未完,则继续

SJMPMAIN

;显示完4位数据,从头重新开始显示

DELAY10MS:

MOVR7,#10

DEL1: MOV R6,#50

DJNZ R6,$

DJNZ R7,DEL1

RET

TAB: DB 0F9H,0A4H,0B0H,99H ;字型段码表

END

思考:数码管静态显示与动态显示在这两个例程中的主要区别是什么?6.2键盘及其接口

学习目标◆正确理解非编码式独立键盘电路的构成、键值的识别,并对电路进行分析。◆正确理解非编码式矩阵键盘电路的设计原理、逐行扫描法、反转法等键值识别的方法,并对电路进行分析。

工作任务◆识别键盘按键并进行键值显示。

在单片机应用系统中,操作人员可以通过键盘向单片机输入数据、传送命令,实现人机交互。键盘是一组按键开关的集合,键盘分为编码式键盘和非编码式键盘。键盘上闭合键的识别由专用的译码器进行识别。产生键的编码或键值的键盘称为编码键盘,如我们经常使用的PC机的键盘就是编码式键盘;由软件来识别闭合键的键盘称为非编码式键盘。

单片机系统中应用较多的是非编码式键盘,它具有结构简单、应用灵活等特点。6.2.1键盘结构

常用的键盘可以分为独立式按键和矩阵式按键两种。

1.独立式键盘接口

独立式键盘就是各键相互独立,每个按键的一端单独接到单片机的一个I/O口上,另一端接地,如图6-6所示。这是最简单的一种键盘电路。采用查询方式加去抖动方式确认按键,即通过读I/O口来判断各I/O口的电平。如果有按键按下,则该I/O口为低电平;如果没有按键按下,则该I/O口为高电平。

下例对图6-6所示的键盘电路进行识别,当KS0按下时,执行KEY0子程序,当KS1按下时,执行KEY1子程序,以此类推,直到KS7为止。图6-6独立式键盘原理图程序清单如下:

ORG0000H

LJMPSTART

ORG0030H

START:MOVA,#0FFH ;输入时先将P1口全置1

MOVP1,A

MOVA,P1 ;读键盘状态

CJNEA,#0FFH,KEY

;有键按下,则转到KEY

AJMPSTART

;无键按下,则重新读键盘状态

KEY:LCALLDELAY;有键按下时,要先延时去抖动

JNBACC.0,KEY0;0号按键按下,转到KEY0

JNBACC.1,KEY1 ;1号按键按下,转到KEY1

JNBACC.2,KEY2 ;2号按键按下,转到KEY2

JNBACC.3,KEY3 ;3号按键按下,转到KEY3

JNBACC.4,KEY4 ;4号按键按下,转到KEY4

JNBACC.5,KEY5 ;5号按键按下,转到KEY5

JNBACC.6,KEY6 ;6号按键按下,转到KEY6

JNBACC.7,KEY7 ;7号按键按下,转到KEY7

LJMPSTART

KEY0:LJMP KEY0_SERVICE

;此处由于JNB指令,只能跳转128字节

KEY1: LJMP KEY1_SERVICE

;因此,将该8个入口地址集中放在一起

……

KEY7: LJMP KEY7_SERVICE

KEY0_SERVICE:……

LJMP START

KEY1_SERVICE:……

LJMP START

……

KEY7_SERVICE: ……

LJMPSTART

DELAY: MOV R0,#100

DL1: MOV R1,#50

DJNZ R1,$

DJNZ R0,DL1

RET

END由上面的例子我们可以看出独立式键盘查询方式的程序处理方法,也可以看出各按键有了一定的优先级,按键0优先级最高,按键7优先级最低。同时我们也看到了CPU要不停地查询I/O口电平的变化,而在实际中,我们也可以采用中断的方式来进行按键识别。如图6-7所示,各个按键都接到一个与非门上,与非门的输出接到单片机的外部中断,当任何一个按键按下时,都会使与非门的输出变低,从而引起单片机中断。我们可以在中断服务程序中确认到底是哪个按键按下,这样CPU就不需要不停地去查询I/O口了,从而可以去干其他必要的事情。图6-7中断独立式键盘原理图

2.矩阵式键盘接口

1)矩阵式键盘的工作原理

在单片机的应用系统中,如果要使用的按键比较多,那么我们不会采用独立式键盘,因为那样占用的I/O口较多。在实际中我们常采用矩阵式键盘,如图6-8所示,这种矩阵式键盘由行线和列线组成,按键位于行、列的交叉点上。按下按键时行线和列线就交叉到一起,没按下时行线和列线是不相通的。这样一个P1口就可以构成4×4=16个按键,比直接将键盘接到端口的独立式键盘多了一倍的按键。图6-8矩阵式键盘接口的原理图图6-8中,行线(P1.7~P1.4)通过上拉电阻接到 +5V,同时行线所接的I/O口作为输入口,列线所接的I/O口作为输出口输出低电平。这样当无按键按下时,行线处于高电平状态;当有按键按下时,行线的电平将被和它交叉的列线电平拉低。这样只要有一个按键按下,对应的4根行线中就必定有一个变为低电平,通过读输入口就可以知道现在是否有按键按下。

2)按键的识别

(1)逐行扫描法。逐行扫描法是键盘识别中最常用的识别方法。下面以图6-8所示的键盘为例来说明该扫描法。此方法分为两步进行:第一步,判断是否有键按下;第二步,如有按键按下,则判别具体哪个键被按下。

判断键盘中是否有键按下的方法:由单片机在列线上送出全0,即把全部的列线置为低电平,然后读输入(行线)状态。如果有键按下,则读进来的数据肯定不全为1;如果没有键按下,则读进来的数据肯定全为1。判别具体哪个键被按下的方法如下:

①将第1列线置0,其余列线置1,输出0111,然后读取行线的电平,判别第1列是否有键按下。如果在第1列上有键按下,则对应的行线会被拉低,即读入的该行电平为低电平,其余行电平为高电平,这表明第1列和此行线交叉位置上的按键被按下。若所有行线都为高电平,则表明该列上无键按下。

②将第2列线置0,其余列线置1,输出1011,然后读取行线的电平。判别哪个按键被按下,具体判别方法同上。③将第3列线置0,其余列线置1,输出1101,然后读取行线的电平。判别哪个按键被按下,具体判别方法同上。

④将第4列线置0,其余列线置1,输出1110,然后读取行线的电平。判别哪个按键被按下,具体判别方法同上。

通过以上的键盘扫描方法,我们可以确定是否有键按下和具体哪个键被按下这两件事情。这种扫描方法称为行(列)扫描法。

(2)反转法。采用行扫描法判断具体哪个按键被按下,往往需要多次的扫描,如某个按键在最后一行,那就需要扫描4次,才能得到此按键所处的行列值。那么有没有不需要多次扫描即可完成键值判断的方法呢?答案是肯定的。采用反转法只需要2次扫描就可以获得按键所处的行列值,其具体原理如下:

第一次,让所有的行线为输出线,列线为输入线,并使输出线全部为低电平0000输出,则列线中电平变低的列就是按键所在的列。

第二次,让所有的列线为输出线,行线为输入线,并使输出线全部为低电平0000输出,则行线中电平变低的行就是按键所在的行。

通过以上两次扫描就可以确定按键所在的行列值,从而可以识别出所按的按键。6.2.2矩阵式键盘识别

【练习】

项目:矩阵式键盘识别项目训练。

项目编号:EX6_3。

任务要求:在Proteus中设计一个4×4矩阵式键盘电路,通过软件编程实现对键盘电路的键值识别,并用一个LED数码管显示其键值。在MedWin集成开发环境中编辑/编译控制程序,并产生代码;在Proteus平台里仿真系统;撰写练习报告(格式要求见附录A)。

设计设备与软件:计算机1台,MedWin或其他同类软件1套,Proteus软件1套。设计步骤:

(1)打开MedWin软件。

(2)新建源程序文件,编辑源代码。

(3)编译源程序,若没有错,则产生代码;若有错,则修改错误。

(4)仿真调试程序代码。

(5)在Proteus中绘制4 × 4矩阵式键盘电路图。

(6)加载程序代码,调试。

1.设计思路

在前面介绍的两种识别方法中任选一种,此处我们选用第一种方法进行识别。在硬件电路设计上,用P1口接一个4×4的键盘,P0口接一个静态显示的LED数码管。把P1口得到的行列值转换为LED可以显示的数值,并通过查表法显示出来。具体仿真电路如图6-9所示。在软件设计上,分两个子程序,即显示子程序和键盘识别子程序。具体流程图如图6-10所示。图6-9矩阵式键盘识别显示仿真图图6-10矩阵式键盘识别显示流程图

2.程序设计所需指令表

程序设计所需指令表如表6-5所示。

3.参考程序代码

参考程序代码如下:

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN: MOV SP,#05FH ;初始化

MOV P1,#0F0H

MOV P0,#00H ;清除LED显示

CLR F0

;键盘按下标志位,初始化为无键按下

MOV DPTR,#TAB ;设置显示表首地址

LOOP: ACALL KEY_SCAN

JNB TF0,LOOP

ACALL LED_DISPLAY

AJMP LOOP

KEY_SCAN:

MOV P1,#0F0H ;使所有列线全部为低电平

MOV A,P1 ;读取P1口的行线值

ANL A,#0F0H ;判断是否有键按下

CJNE A,#0F0H,KEY1

;如行线不全为1,则有键按下

AJMP KEY_EXIT ;否则,退出键盘扫描

KEY1: ACALLDELAY10MS;去抖动,开始扫描键盘

MOV A,#0F7H;第一列扫描,列线输出0111

KEY2: MOV R7,A ;保存列扫描值到R7

MOV P1,A

MOV A,P1 ;读取P1行线值

ANL A,#0F0H

CJNE A,#0F0H,KEY_CODE

;若有键按下,则进行键处理

MOV A,R7 ;否则继续下一列扫描

RR A

CJNE A,#7FH,KEY2

KEY3: RET

KEY_CODE: ;键处理,得到键值

MOV B,#00H

KEY4: RLC A ;计算行×列的值

JNC KEY5

INC B

INC B

INC B

INC B

AJMP KEY4

KEY5: MOV A,R7

SWAP A

KEY6: RLC A ;计算列值

JNC KEY7

INC B

AJMP KEY6 ;保存键值到B中

KEY7: MOV A,P1 ;判断键是否释放

ANL A,#0F0H

CJNE A,#0F0H,KEY7

SETB F0 ;建立按键有效标志位

RET

LED_DISPLAY:

MOV A,B ;取要显示的数据

MOVC A,@A+DPTR ;取字段码

MOV P0,A ;送显示

CLR F0 ;清除按键有效标志位

RET

DELAY10MS:

……

……

RET

TAB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H, 7FH,6FH,77H,7CH,39H,5EH,79H,

DB71H,00H

END

思考:如果采用反转法进行按键的识别,那么应该如何修改程序以实现相同的功能呢?6.3简单计算器的设计学习目标◆理解数码管动态显示的工作原理,并设计相应的接口电路。◆掌握矩阵式键盘设计和键值识别的方法,并设计相应的接口电路。◆进一步掌握单片机I/O口作为输入/输出口应用的基本编程方法。◆进一步掌握单片机子程序调用的程序设计方法。工作任务◆设计简单计算器仿真电路并对结果进行描述。◆设计与调试简单计算器程序。◆撰写设计文档与测试报告。

【练习】

项目:简单计算器设计项目训练。

项目编号:EX6_4。

任务要求:设计一个简单的加、减法计算器,以实现100以内数据的加、减法运算。同时如果操作错误,则进行清零操作。在MedWin集成开发环境中编辑/编译控制程序,并产生代码,在Proteus平台里仿真系统,撰写练习报告(格式要求见附录A)。

设计设备与软件:计算机1台,MedWin或其他同类软件1套,Proteus软件1套。设计步骤:

(1)打开MedWin软件。

(2)新建源程序文件,编辑源代码。

(3)编译源程序,若没有错,则产生代码;若有错,则修改错误。

(4)仿真调试程序代码。

(5)在Proteus中绘制计算器设计电路图。

(6)加载程序代码,调试。

1.思路分析

根据6.1节和6.2节介绍的内容,具体设计键盘和LED数码管的实现方法。因为键盘需要0~9、+、-、=、清零共14个按键,所以考虑采用矩阵式键盘。数码显示需要3位数,同时为了节约硬件成本,也可以考虑采用动态显示方式进行显示。

2.硬件电路设计

(1)思路。根据思路分析和6.1.3节、6.2.3节所介绍的键盘及显示的内容,可以将4×4矩阵式键盘接到P1口,采用和前面所介绍的内容相同的硬件连接电路,只是把键值进行重新分配。数码管也采用前面所介绍的动态显示硬件电路,采用共阴极数码管,通过P0口8位接74LS241进行段码控制,位选采用P2口进行控制。单片机其他电路接成最小系统即可。

(2)在Proteus中画好电路图。仿真图如图6-11所示。图6-11简单计算器设计仿真图

3.软件设计

(1)绘制程序流程图。流程图如图6-12所示。图6-12简单计算器设计流程图

(2)编写程序代码。参考程序代码如下:

NUM1_ONE EQU 30H ;加数显示空间

NUM1_TEN EQU 31H

NUM1 EQU 33H

NUM2_ONE EQU 34H ;被加数显示空间

NUM2_TEN EQU 35H

NUM2 EQU 37H

NUM3_ONE EQU 38H ;计算结果显示空间

NUM3_TEN EQU 39H

NUM3_HUD EQU 3AH

NUM3 EQU 3BH

NOW_DISPLAY_NUM EQU 3DH ;当前要显示的数

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN: MOV SP,#5FH

MOV P0,#00H ;清显示

MOV P2,#0FH

SETB F0

;运算符号标志位,初始为加法运算

MOV R4,#00H ;清当前的位数标志

MOV NOW_DISPLAY_NUM,#00H

;把当前要显示的数置为加

MOV DPTR,#TAB

LOOP: ACALLKEY_SCAN

MOV A,B ;分析键值

CLR C

SUBB A,#0AH

JNC IS_SYMBOL

MOV A,NOW_DISPLAY_NUM

;此处按下了数字键

CJNE A,#02H,LOOP1

;此处为一次计算完成后再次按下数字键

MOV NOW_DISPLAY_NUM,#00H

;把当前要显示的数置为加数

MOV R4,#00H ;清数值的位数为0

LOOP1:

INC R4 ;当前的位数标志+1

ACALL NUM_STORAGE ;存储当前的数字

ACALL DISPLAY ;显示当前的数字

AJMP LOOP

IS_SYMBOL: ;此处按下的是符号键

MOV A,B

CJNE A,#0AH,NO_ADD

SETB F0 ;为加法运算,置F0标志位

INC NOW_DISPLAY_NUM

;当前要显示的数的标志+1

MOV R4,#00H

AJMP LOOP

NO_ADD:

CJNE A,#0BH,NO_SUB

CLR F0

;为减法运算,清F0标志位

INC NOW_DISPLAY_NUM

;当前要显示的数的标志+1

MOV R4,#00H

AJMP LOOP

NO_SUB:

CJNE A,#0CH,CLEAR

ACALL OPERATIONAL

;此处按下了“=”键

INC NOW_DISPLAY_NUM

;当前要显示的数的标志+1

ACALL DISPLAY

AJMP LOOP

CLEAR:AJMP MAIN

;************************************************

; KEY_SCAN

;************************************************

KEY_SCAN:

MOV P1,#0F0H ;使所有列线全部为低电平

MOV A,P1

ANL A,#0F0H ;判断是否有键按下

CJNE A,#0F0H,KEY1

AJMP KEY_EXIT

;若无键按下,则退出键扫描

KEY1: ACALL

DELAY10MS

MOV A,#0F7H

KEY2: MOV R7,A

MOV P1,A

MOV A,P1

ANL A,#0F0H

CJNE A,#0F0H,KEY_CODE

;若有键按下,则进行键处理

MOV A,R7 ;否则继续下一列扫描

RR A

CJNE A,#7FH,KEY2

KEY_EXIT:

ACALL DISPLAY

AJMP KEY_SCAN

KEY_CODE: ;键处理,得到键值

MOV B,#00H

KEY4: RLC A ;计算行×列的值

JNC KEY5

INC B

INC B

INC B

INC B

AJMP KEY4

KEY5: MOV A,R7

SWAP A

KEY6: RLC A ;计算列值

JNC KEY7

INC B

AJMP KEY6 ;保存键值到B中

KEY7: MOV A,P1 ;判断键是否释放

ANL A,#0F0H

CJNE A,#0F0H,KEY7

;

SETB F0 ;建立按键有效标志位

RET

;*************************************************

; NUM_STORAGE

;*************************************************

NUM_STORAGE:

MOVA,NOW_DISPLAY_NUM;当前要存储哪个数

JNZ

STORAGE_NUM2

MOV

R0,#NUM1_ONE

;存第一个数,即存被加数

AJMP

STORAGE2

STORAGE_NUM2:

MOV

R0,#NUM2_ONE

;存第二个数,即存加数

STORAGE2:

MOV

A,R4

DEC

A

JZ STORAGE_ONE

MOV

A,B

XCH

A,@R0 ;存十位数

INC R0

MOV

@R0,A ;存个位数

RET

STORAGE_ONE:

MOV

@R0,B

;该数为个位数,所以只要存一个数即可

RET

;************************************************

; DISPLAY

;************************************************

DISPLAY:

MOV A,R4

JNZ DISPLAY_NUM

MOV P2,#0FH

MOV P0,#00H

RET

DISPLAY_NUM:

MOV A,NOW_DISPLAY_NUM ;当前要显示哪个数

CJNE A,#00H,DISP_NUM2

MOV A,NUM1_ONE ;显示NUM1(即要显示加数)

MOV P2,#0E0H ;显示个位,即P2.4有效

ACALL NUM_DISPLAY

MOV A,R4

DEC A

JNZ DISP_NUM1_TEN

;如果有十位数,则再去显示十位数

RET

DISP_NUM1_TEN:

MOV A,NUM1_TEN

MOV P2,#0D0H ;显示个位,即P2.5有效

ACALL NUM_DISPLAY

RET

DISP_NUM2:

CJNE A,#01H,DISP_NUM3

MOV A,NUM2_ONE

;显示NUM2(即要显示被加数)

MOV P2,#0E0H ;显示个位,即P2.4有效

ACALL NUM_DISPLAY

MOV A,R4

DEC A

JNZ DISP_NUM2_TEN

;如果有十位数,则再去显示十位数

RET

DISP_NUM2_TEN:

MOV

A,NUM2_TEN

MOV

P2,#0D0H ;显示十位,即P2.5有效

ACALL NUM_DISPLAY

RET

DISP_NUM3:

CJNE

A,#02H,DISP_ERROR

JB F0,DISP_NUM3_ONE

;如果为加法,则不需要判断正负数

MOV

A,NUM1

;如果NUM1<NUM2,那么结果为负数显示负号

CLR C

CJNE

A,NUM2,DISP_NAG

AJMP

DISP_NUM3_ONE

DISP_NAG:

JC DISP_NAGATIVE

AJMP DISP_NUM3_ONE

DISP_NAGATIVE:

MOV P2,#7FH

MOV P0,#40H

ACALL DELAY10MS

DISP_NUM3_ONE:

MOV A,NUM3_ONE ;显示NUM3(即要显示结果)

MOV P2,#0E0H ;显示个位,即P2.4有效

ACALL

NUM_DISPLAY

MOV A,R4

DEC A

MOV R1,A

JNZ DISP_NUM3_TEN

;如果有十位数,则再去显示十位数

RET

DISP_NUM3_TEN:

MOV A,NUM3_TEN

MOV P2,#0D0H

;显示十位,即P2.5有效

ACALL NUM_DISPLAY

MOV A,R1

DEC A

JNZ DISP_NUM3_HUD

RET

DISP_NUM3_HUD: ;显示百位,即P2.6有效

MOV A,NUM3_HUD

MOV P2,#0B0H

ACALL NUM_DISPLAY

RET

DISP_ERROR:

MOV P0,#3FH ;错误,则显示----

MOV P2,#0FH

RET

NUM_DISPLAY:

MOVC A,@A+DPTR

MOV P0,A

ACALL DELAY10MS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论