51单片机简易计算器纸

ORG 0000H

首发:MOV 78H,# 0;初始化:78H放0段代码,其余放代码。

MOV 79H,#10

MOV 7AH,#10

MOV 7BH,#10

MOV 7CH,#10

MOV 7DH,#10

MOV R5,# 0;R5是击键次数,初始设置为0。

MOV 30H,# 0;30H是功能键存储单元,设置为0。

MOV 40H,# 0;40H单元最初设置为0。

MOV 41H,# 0;41H单元格最初设置为0。

循环:LCALL DIR

LCALL键

INC R5

;分散程序以确定哪个键被按下。

S1:CJNE A,#10,S2;不是“+”键,跳到S2。

LJMP好玩;是“+”键,跳到好玩。

S2:CJNE A,#11,S3;不是“-”键,跳到S3。

LJMP好玩;是“-”键,跳转到FUN。

S3:CJNE A,#12,S4;不是“*”键,跳到S4。

LJMP好玩;是“*”键,跳转到FUN。

S4:CJNE A,#13,S5;不是“/”键,跳到S5。

LJMP好玩;是“/”键,跳转到FUN。

S5:CJNE A,#14,S6;不是“=”键,跳到S6。

LJMP好玩;就是“=”键,跳起来好玩。

S6:CJNE A,#15,n 1;不是“CL”键,跳到N1。

LJMP启动;是“CL”键,跳转开始。

N1:CJNE R5,#1,N2;判断按下按键的次数

LJMP D11

N2:CJNE R5,#2,N3

LJMP T2

N3:CJNE R5,#3,N4

LJMP T3

N4:CJNE R5,#4,N5

LJMP T4

N5:CJNE R5,#5,N6

LJMP T5

N6:CJNE R5,#6,启动

LJMP T6

MOV·R4

MOV 78H,A;输入值被发送到显示位缓冲器。

MOV 79H,#10

MOV 7AH,#10

MOV 7BH,#10

MOV 7CH,#10

MOV 7DH,#10

LJMP环路

T2:MOV·R7

MOV B,#10

R4 MOV

MUL AB

添加A,R7

MOV·R4

MOV 7AH,#10

MOV 7BH,#10

MOV 7CH,#10

MOV 7DH,#10

MOV 79H,78H一到十。

MOV 78H,R7;新号码是一位数。

LJMP环路

T3:MOV R7,A

MOV B,#10

R4 MOV

MUL AB

添加A,R7

MOV·R4

MOV 7BH,#10

MOV 7CH,#10

MOV 7DH,#10

MOV 7AH,79H十到一百

MOV 79H,78H一到十。

MOV 78H,R7;新号码是一位数。

LJMP环路

T4:MOV·R7

MOV B,#10

R4 MOV

MUL AB

添加A,R7

MOV·R4

MOV 7CH,#10

MOV 7DH,#10

MOV 7BH,7AH

MOV 7AH,79H

MOV 79H,78H

MOV 78H,R7

LJMP环路

T5:MOV R7,A

MOV B,#10

R4 MOV

MUL AB

添加A,R7

MOV·R4

MOV 7DH,#10

MOV 7CH,7BH

MOV 7BH,7AH

MOV 7AH,79H

MOV 79H,78H

MOV 78H,R7

LJMP环路

T6:MOV R7,A

MOV B,#10

R4 MOV

MUL AB

添加A,R7

MOV·R4

MOV 7DH,7CH

MOV 7CH,7BH

MOV 7BH,7AH

MOV 7AH,79H

MOV 79H,78H

MOV 78H,R7

LJMP环路

MOV 7CH,7BH

MOV 7BH,7AH

MOV 7AH,79H

MOV 79H,78H

MOV 78H,R7

LJMP环路

好玩:MOV 78H,#10

MOV 79H,#10

MOV 7AH,#10

MOV R0,30h;与最后一个功能键交换

MOV 30H,A

MOV A,R0

CJNE A,#10,fun 1;判断功能键

LJMP ADDY"+"

FUN1:CJNE A,#11,FUN2

LJMP SUBT;"-"

FUN2:CJNE A,#12,FUN3

LJMP MULT;"*"

FUN3:CJNE A,#13,FUN4

LJMP DIVI"/"

FUN4:CJNE A,#14,FUN5第一次按功能键,也就是A=#0。

LJMP EQUA"="

FUN5:MOV 40H,R4;保存第一个号码

MOV R5,# 0;清除击键次数

LJMP BCD把它分解成bcd码,以便以后显示。

的:LJMP开始;溢出处理

艾迪:MOV A,40H第一个数字被发送到累加器

加一个,R4;第一个数字加上第二个数字

JB CY,OF;溢出

MOV 40H,A;保存此结果

MOV R5,# 0;清除击键次数

LJMP BCD

SUBT:MOV A,40H

R4 SUBB

JB CY,OF

MOV 40H,A

MOV R5,#0

LJMP BCD

MULT:MOV A,40H

MOV湾

R4 MOV

MUL AB

JB OV

MOV 40H,A

MOV R5,#0

LJMP BCD

迪维:DIVI阿·R4

MOV湾

MOV A,40H

分部AB

JB OV

MOV 40H,A

MOV R5,#0

LJMP BCD

等式:MOV R5,#0

LJMP BCD

BCD:MOV B,#10

MOV A,40H结果被发送到累加器。

DIV AB结果除以10

MOV 41H,A;暂时存储“业务”

MOV甲、乙;取一位数

MOV 78H,A;发送到显示缓冲区的单元号。

MOV A,41H

JZ回归;结果是个位数,返回LOOP。

MOV B,#10

MOV A,41H

分部AB

MOV 41H,A

MOV A,B

MOV 79H,A;十位显示缓冲器

MOV A,41H

JZ回归;结果是一个两位数的数字,这将返回循环。

MOV 7AH,A;百位数传输显示缓存

返回:LJMP循环

;动态显示子程序

导演:MOV·DPTR,# TAB数码管解码表头地址

MOV R0,# 78H要显示的缓冲区的位地址

MOV A,# 0FEH单位位选择信号

MOV R1,A

LD1:MOV A,@R0

MOVC A,@ A+DPTR;查表

MOV P2,r 1;* * *阳极管字位选择发送到P2端口。

MOV P0,A;字段代码被发送到P0端口。

LCALL delay 1 ms;延迟调整1ms子程序

INC R0R0指向下一个模块。

MOV A,r 1;

JNB ACC.5,LD2判断是否发出6个数字。

RL A;指向下一位

MOV R1,A;位选择信号被存储回R3。

SJMP LD 1;跳过以显示下一个数字。

LD2:RET;发送6个号码后返回。

TAB:DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,80H,90H,0FFH* * *阳极解码表

延迟1毫秒:MOV R6,第二

LOOP1:MOV R7,#248

nototherwiseprovided(for)除非另有规定

环路2:DJNZ R7,环路2

DJNZ R6,LOOP1

浸水使柔软

KEY:LCALL KS;调用检测键子程序

JNZ k 1;按键继续。

LCALL DELAY2无键按键呼叫延迟去抖

ACALL DIR呼叫动态显示

AJMP密钥;返回继续检测按钮

k 1:LCALL delay 2;有一个按键延迟抖动。

LCALL KS然后调用检测压筋子程序。

JNZ K2确认有一个按钮可以继续下一步。

ACALL DIR呼叫动态显示

AJMP密钥;按下无键返回继续检测。

K2:MOV R2,# 0EFH将扫描值发送到R2进行临时存储。

MOV R3,# 00H将第一列值发送到R3进行临时存储。

K3:MOV P1,R2;将R2值发送到端口P1。

L0:JB P1.0,l 1;P1.0等于1。跳到L1。

MOV A,# 00H将第一行值发送到ACC。

AJMP LK跳转到键值处理程序

L1:JB P1.1,L2;P1.1等于1跳转到L2。

MOV A,# 04H将第二行的行值发送到ACC。

AJMP LK跳转到键值处理程序

L2:JB P1.2,L3;P1.2等于1跳转到L3。

MOV A,# 08H将第三行值发送到ACC。

AJMP LK跳转到键值处理程序

L3:JB P1.3,下一个;P1.3等于1跳到下一页。

MOV A,# 0CH将第四行值发送到ACC。

LK:加一个,R3;将行值和列值相加后的键值被发送到。

推ACC将中的值发送到堆栈进行临时存储。

K4:LCALL delay 2;调用延时去抖程序。

LCALL KS调用键检测程序

JNZ K4;该键不被释放并继续返回到检测状态。

POP ACC将堆栈值发送到ACC

MOV·DPTR,#键盘

MOVC A,@A+DPTR

浸水使柔软

接下来:INC R3列值加1

MOV A,R2;R2值被发送到。

JNB升速7,调;扫描后,转到键进行下一次扫描。

RL A;扫描尚未完成。将值向左移动一位以扫描下一列。

MOV·R2;将ACC值发送到R2进行临时存储。

AJMP K3跳到K3继续。

KS:MOV P1,# 0FH设定P1,高四位0,低四位1。

MOV A,p 1;读取端口P1。

XRL A,# 0FH将中的值与或中的值区分开来

RET子程序返回

KEYTAB:DB 1,2,3,10,4,5,6,11,7,8,9,12,15,0,14,13;键值表

延迟2:MOV R6,# 2H;延迟去抖动子程序

LP1:MOV R7,#0FAH

LP2:DJNZ R7,LP2

DJNZ R6,LP1

浸水使柔软

结束