51单片机简易计算器纸
首发: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
浸水使柔软
结束