有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx

上传人:b****1 文档编号:3881469 上传时间:2023-05-02 格式:DOCX 页数:33 大小:240.74KB
下载 相关 举报
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第1页
第1页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第2页
第2页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第3页
第3页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第4页
第4页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第5页
第5页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第6页
第6页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第7页
第7页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第8页
第8页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第9页
第9页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第10页
第10页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第11页
第11页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第12页
第12页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第13页
第13页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第14页
第14页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第15页
第15页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第16页
第16页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第17页
第17页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第18页
第18页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第19页
第19页 / 共33页
有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx

《有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx(33页珍藏版)》请在冰点文库上搜索。

有简易计算器到复杂计算器的设计说明Word文档下载推荐.docx

8255A可为86系列CPU与外部设备之间提供并行输入/输出的通道。

由于它是可编程的,可以通过软件来设置芯片的工作方式,因此,用8255A连接外部设备时,通常不用再附加外部电路,使用教方便。

并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。

  在输入过程中,输入设备把数据送给接口,并且使状态线“输入准备好”有效。

接口把数据存放在“输入缓冲寄存器”中,同时使“输入回答”线有效,作为对外设的响应。

外设在收到这个回答信号后,就撤消数据和“输入准备好”信号。

数据到达接口中后,接口会在“状态寄存器”中设置输入准备好标志,或者向CPU发一个中断请求。

CPU可用查询方式或中断方式从接口中读取数据。

接口中的数据被读取后,接口会自动清除状态寄存器中的标志,且撤消对CPU的中断请求。

  在输出过程中,每当输出寄存器可以接收数据,接口就会将状态寄存器中“输出准备好”状态置1或向CPU发一个中断请求,CPU可用查询或中断方式向接口输出数据。

当CPU输出的数据到达接口后,接口会清除“输出准备好”状态,把数据送往外设,并向外设发一个“数据输出准备好”信号。

外设受到驱动后,便接收数据,并向接口电路发一个“输出回答”信号,接口收到该回答信号后,又将状态寄存器中“输出准备好”置位,以便CPU输出下一个数据。

定义工作方式控制字:

 

LED数码管

LED为发光二极管构成的显示器件,亦称数码管。

由7个字符段和一个小数点段组成,每段对应一个发光二极管,当发光二极管点亮时,相应的字符段点亮。

LED有共阴极和共阳极两种供应状态。

共阴极显示时,将LED显示的COM接地,将八个字符段端a、b、c、d、e、f、g、dp依次与一个8位I/O口的最低到最高位连接,当I/O给LED的哪个字符段送入一个高电平时,该段就被点亮,从而可从这7个字符段中被点亮的构成相应的字符显示出来。

同理,COM阳极即将COM端接Vcc,其显示原理与COM阴极的基本相同,但I/O口送入低电平是相应的段才被点亮。

5.软件设计

程序流程图:

(1)总程序流程图:

(2)键盘扫描程序流程图:

6.具体代码实现

DATASEGMENT

XDB?

?

;

存放数据的每一位

X1DW?

存放第一个数据值

X2DW?

存放第二个数据值

YDW?

存放运算结果

SDB?

存放运算符号值

EDB?

按下等号键标记

CCDB?

存放运算数据位数

HDB0;

存放按键行号

LDB0;

存放按键列号

Z1DB?

Z2DB?

Z3DB?

Z4DB?

DISCODEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;

段码表

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVAL,90H;

设置为A口输入,B口输出,C口输出

OUT46H,AL

MOVDI,OFFSETX+3;

DI指向X的高位

KKK:

CALLKEY;

扫描按键

JMPKKK

;

以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号

KEYPROC

CHECK:

CALLDISP;

等待按键按下的同时进行显示

MOVAL,0F0H;

所有行输出低电平

OUT44H,AL

INAL,40H

CMPAL,0FFH;

读列值

JZCHECK;

若都为高电平则无键按下,等待

MOVCX,100

LOOP$;

延时消抖

INAL,DX;

重读列值

CMPAL,0FFH

无键按下一直等待

MOVH,0;

有键按下,先把行列号变量清0

MOVL,0

MOVBL,01H

MOVBH,0FEH;

扫描法读键值:

从第一行开始测试,即PC0输出低电平

NEXT:

MOVAL,BH

NEXTH:

INAL,40H;

读列值,判断是第几列有键按下

TESTAL,BL;

从第一列开始判断

JZWAIT0

ROLBL,1

CMPBL,80H;

当前行状态下没有任何列有键按下,则转为对下一行的测试

JZNEXTL

INCH;

每判断一列,列号加1

JMPNEXTH;

再对下一列进行判断

NEXTL:

MOVH,0

ROLBH,1;

对下一行测试,让下一个PC口输出低电平

CMPBH,0EFH

JZEXIT

INCL

JMPNEXT

WAIT0:

若有键按下,则等该按键松开后再计算键值

JNZWAIT0

CALLKEYVALUE;

调计算键值子程序

EXIT:

RET

KEYENDP

以下为计算键值子程序,通过行列号计算键值(键值=列号*4+行号)

键值存放在DL寄存器中

KEYVALUEPROC

MOVDL,L

MOVDH,H

SHLDL,1

SHLDL,1;

列号乘4

ADDDL,DH

CMPDL,9;

按下的是数字键

JNGNUM_CALL

CMPDL,16

JLCONT_CALL;

按下的是运算键

JZOUTP_CALL;

按下的是等于键

CMPDL,17

JZCLR_CALL;

按下的是清除键

NUM_CALL:

CALLNUMBER;

调数字键处理子程序

JMPEXIT1

CONT_CALL:

MOVS,DL;

存放运算键的键值

MOVE,0

CALLCOUNT;

调运算键处理子程序,计算第一个加数

OUTP_CALL:

CALLOUTP;

调等号键处理子程序

CLR_CALL:

CALLCLEAR;

调清除键处理子程序

EXIT1:

KEYVALUEENDP

以下为清除键处理子程序,按下清除键后,X变量全部清0

CLEARPROC

MOVX[3],0

MOVX[2],0

MOVX[1],0

MOVX[0],0

CALLBITP

CLEARENDP

以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量

并根据运算符号,调用相应的运算子程序

OUTPPROC

PUSHAX

PUSHDX

PUSHBX

INCE

调运算键处理子程序,计算第二个运算数据

CMPS,10

JZADD_CALL;

运算符为加号,则调用加法子程序

CMPS,11

JZLOG_CALL;

运算符为对数,则调用对数子程序

CMPS,12

JZJCE_CALL;

运算符为阶乘号,则调用阶乘子程序

CMPS,13

JZDIVP_CALL;

运算符为除号,则调用除法子程序

CMPS,14

JZK_CALL

CMPS,15

CALLER

JMPSTORE1

ADD_CALL:

CALLADDP

LOG_CALL:

CALLLOG

JCE_CALL:

CALLJCE

DIVP_CALL:

CALLDIVP

K_CALL:

CALLK

STORE1:

MOVAX,Y;

以下程序将各运算子程序返回的运算结果,按位分解,送入X变量

MOVDX,0

MOVBX,1000

DIVBX

MOVX[0],AL

MOVAX,DX

MOVBL,100

DIVBL

MOVX[1],AL

MOVAL,AH

MOVAH,0

MOVBL,10

MOVX[2],AL

MOVX[3],AH

POPBX

POPDX

POPAX

OUTPENDP

以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量

或者将第二个运算数据的数值计算出来并存入X2变量

将运算符的值存入S变量

COUNTPROC

CALLBITP;

测试X中的数据是多少位

CMPCC,4;

输入的数据是4位数?

JZC4

CMPCC,3;

输入的数据是3位数?

JZC3

CMPCC,2;

输入的数据是2位数?

JZC2

JMPC1;

输入的数据是1位数?

C4:

MOVAX,0

MOVAL,X[0]

MULBX

MOVDX,AX

C3:

MOVAL,X[1]

MULBL

ADDDX,AX

C2:

MOVAL,X[2]

C1:

MOVAL,X[3]

CMPE,1

JNZX1_S

MOVX2,DX;

按下的是等号,则将第二个运算数据的值存入X2变量

JMPEXIT3

X1_S:

MOVX1,DX;

按下的是运算符号,则将第一个运算数据的值存X1变量

MOVX[3],0;

清空X变量

EXIT3:

COUNTENDP

以下为数字键处理子程序

该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数

NUMBERPROC

JNZCONTINUE

CALLCLEAR

CONTINUE:

CMPCC,0;

目前数据为0位,即没有数据,则转到SSS

JZSSS

若已有数据,以下程序将X左移8位。

例如:

先输入“1”,当再输入2时,

先要将“1”从个位移到十位,然后再将“2”存放到个位

MOVAH,X[2]

MOVDL,X[1]

MOVDH,X[0]

MOVCX,8

LL:

SHLAX,1

RCLDX,1

LOOPLL

MOVX[3],AL

MOVX[2],AH

MOVZ3,AH

MOVX[1],DL

MOVZ2,DL

MOVX[0],DH

MOVZ1,DH

SSS:

MOV[DI],DL;

将当前键入的数据存放到X的最低位

MOVZ4,DL

INCCC;

数据位数加1

判断数据位数

JNGEXIT2

MOVCC,0;

如果数据超过4位,重新从最低位开始存放

EXIT2:

调显示子程序,显示输入的数据

NUMBERENDP

加法子程序

ADDPPROC

MOVAX,X1

ADDAX,X2

MOVY,AX

ADDPENDP

对数子程序

LOGPROC

PUSHAX

PUSHBX

PUSHCX

PUSHDX

MOVAX,X1

MOVBX,0

MOVCX,2

MOVDX,0

LO:

DIVCX

CMPAX,0

JZG2

INCBX

JMPLO

G2:

MOVY,BX

POPDX

POPCX

POPBX

POPAX

RET

LOGENDP

阶乘子程序

JCEPROC

MOVDX,AX

SUBDX,1

MOVCX,DX

MOVBX,DX

CHENG:

MULDX

DECBX

MOVDX,BX

LOOPCHENG

MOVY,AX

JCEENDP

除法子程序

DIVPPROC

MOVBX,X2

DIVPENDP

次方子程序

KPROC

PUSHCX

MOVCX,X2

DECCX

N:

MOVDX,X1

LOOPN

POPCX

KENDP

二进制转换成十进制子程序

ERPROC

MOVBL,8

MOVAL,Z1

MULBL

MOVCX,AX

MOVBL,4

MOVAL,Z2

ADDCX,AX

MOVBL,2

MOVAL,Z3

MOVAL,Z4

MOVBL,1

MOVY,CX

ERENDP

显示子程序,将X中的数值按位显示出来

DISPPROC

MOVBH,0

LEASI,DISCODE

测试X位数

CMPCC,4

JZQIAN

CMPCC,3

JZBAI

CMPCC,2

JZSHI

CMPCC,1

JMPG

JMPNONE

QIAN:

MOVAH,11100000B;

从第4位开始显示

MOVBL,X[0]

MOVAL,[SI+BX]

OUT42H,AL

CALLDELY

MOVAL,0

BAI:

MOVAH,11010000B;

从第3位开始显示

MOVBL,X[1]

SHI:

MOVAH,10110000B;

从第2位开始显示

MOVBL,X[2]

G:

MOVAH,01110000B;

从第1位开始显示

MOVBL,X[3]

JMPEXIT4

NONE:

MOVAL,0;

X中没有数据,不显示

EXIT4:

DISPENDP

分析数据位数子程序

BITPPROC

CMPX[0],0;

如果X[0]不为0,则数据为4位数

JNZFOURBIT

CMPX[1],0;

如果X[1]不为0,则数据为3位数

JNZTHREEBIT

CMPX[2],0;

如果X[2]不为0,则数据为2位数

JNZTOWBIT

CMPX[3],0;

如果X[3]不为0,则数据为1位数

JNZONEBIT

JMPZER0BIT;

否则,没有数据

FOURBIT:

MOVCC,4

JMPEXIT5

THREEBIT:

MOVCC,3

TOWBIT:

MOVCC,2

ONEBIT:

MOVCC,1

ZER0BIT:

MOVCC,0

EXIT5:

BITPENDP

延时子程序

DELYPROC

LOOP$

DELYENDP

CODEENDS

ENDSTART

7.调试与测试

第一步,进行数码管显示的仿真。

编写一段直接赋值送到数码管显示的程序,进行数码管显示的仿真。

编写程序,输入使数码管显示“HELO”的程序,进行仿真,通过多次修改,最终可得结果如图:

第二步,进行键盘扫描的仿真。

编写代码,将扫描到的键值送到数码管显示。

编写程序,使数码管显示所扫描到的键值,进行仿真,通过多次修改可得结果。

测试步骤为:

首先选取任意keypad键盘,连接好电路,按下键盘上数字的8,如图可见,电路线的颜色变化说明产生了脉冲。

松开鼠标后,此时数码管显示为所扫描到的键值:

再换其他案件,并使数码管显示相应扫描到的键值。

第三步,在数码管显示和键盘扫描程序都正确的基础上,逐步增加代码,增加功能,逐步实现按键值的存储与显示、清零、加法、减法、乘法、除法等功能的仿真。

第四步,在确立好了之前的计算器基础应有程序都正确后,又加入了几个扩展模块,再次模拟仿真,将调试不通过的扩展部分删去,只留下可执行的模块。

1.实现二进制与十进制转换功能:

输入二进制111b:

按下二进制转换键:

再按下=号键,可见数码管显示转换后的十进制数:

2.实现求阶乘功能:

1.按下要求的数,数码管开始显示:

2.按下求阶乘按键,可见产生了脉冲:

3.再按下=号键,可见数码管显示结果:

计算器扩展后还有其他扩展功能,在此不作赘述。

8.关键技术

一、键盘扫描

根据如上键盘及电路,可以先扫描列,再扫描行,先给出PC0为低电平,PC1、PC2、PC3均为高电平。

若不按键盘,则PA0、PA1、PA2、PA3、PA4、PA5均为高电平,然后转入下一行测试,给下一行提供低电平、依次类推。

若其中有键按下,则其对应位应显示低电平。

这样,就把按下的键给定位了。

根据以上键盘,通过计算按键的值来定位该位按键。

键值=行*4+列,而行、列值可通过循环来实现。

二、数据存储与显示

首先定义X[0]、X[1]、X[2]、X[3]四个变量,分别存放按下数据的每一位的值,若为数字键,首先按下的数字存放在X[3]中,然后可以通过移位将输入的数据依次存放于X

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2