51单片机 实现计算器功能
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机多为计算器汇编程序
此程序并不仅仅局限于255以内操作
FIR0 EQU 30H
FIR1 EQU 31H
FIR2 EQU 32H
FIR3 EQU 33H ;第一个操作数
SEC0 EQU 34H
SEC1 EQU 35H
SEC2 EQU 36H
SEC3 EQU 37H ; 第二个操作数
LIN0 EQU 38H
LIN1 EQU 39H
LIN2 EQU 40H
LIN3 EQU 41H ; 数据暂存
RES0 EQU 42H
RES1 EQU 43H
RES2 EQU 44H
RES3 EQU 45H ;结果暂存区
XLINE EQU 46H
YLINE EQU 47H ;记录按键按键位置
SYMBLE EQU 48H ;操作符存储
DDE0 EQU 49H
DDE1 EQU 50H
DDE2 EQU 51H ;用于延时
FLEL4 EQU 52H
FLEL5 EQU 53H
FLEL6 EQU 54H
BEFOR EQU 55H
HH BIT 01H ;比较大
EE BIT 02H ;比较相等
FIL BIT 03H ;溢出标记
FLAG BIT 04H ;有无按键标记
ERR BIT 05H ;错误标记
YESY BIT 06H ; 有无操作符按键标记
NUM BIT 07H ;按键个数标记
YESN BIT 08H ;有无数字按键标记
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INTERUPT
MAIN:
MOV IE,#01H ;初始化
MOV SP,#6FH
LCALL CLRI
SETB IT0
SETB EA
DISPLAY: ;数码管显示函数
CJNE R3,#00H,TT1
MOV R3,#0AH
TT1: CJNE R3,#0AH,STARTD
CJNE R2,#00H,TT2
MOV R2,#0AH
TT2: CJNE R2,#0AH,STARTD
CJNE R1,#00H,STARTD
MOV R1,#0AH
STARTD: MOV A,R0
LCALL TRANS ;将所要显示的值转化为数码管对应的数据
MOV P2,A
MOV P1,#10H
LCALL DELAY10ms
MOV A,R1
LCALL TRANS
MOV P2,A
MOV P1,#20H
LCALL DELAY10ms
MOV A,R2
LCALL TRANS
MOV P2,A
MOV P1,#40H
LCALL DELAY10ms
MOV A,R3
LCALL TRANS
MOV P2,A
MOV P1,#80H
LCALL DELAY10ms
MOV A,P0
ANL A,#0F0H
CJNE A,#0F0H,YESYES
LJMP LOOP8
YESYES: LCALL INTERUPT
JNB FLAG,LOOP8
CLR FLAG
LCALL LOCATION
LCALL KEY
LOOP8: LJMP DISPLAY
/////////////////////////////////////////////// INTERUPT: ;确定有无按键
CLR FLAG
MOV XLINE,#00H
MOV YLINE,#00H ;初始化
LCALL DELAY100ms
MOV A,P0 ;判断是否有按键按下
ANL A,#0F0H
CJNE A,#0F0H,YES
LJMP LOOP7
YES: SETB FLAG ;是按键,置位标记位,及行列线
MOV XLINE, P0
MOV YLINE, P1
LOOP7: RETI
LOCATION: ;确定按键位置
CLR FLAG
MOV R6,#00H ;初始化
MOV A,XLINE ;取出行线的高四位,存入R7中
ANL A,#0F0H
MOV R6,A
MOV R7,#05H ;循环比较次数
MOV P1,#01H ;P1口重新初始化
COMPARE: ;循环比较,查找按键位置
MOV A,P0
ANL A,#0F0H
CJNE A,#0F0H,TIME
MOV A,P1
ANL A,#0FH
ADD A,R6
MOV R6,A ;确定按键位置
LJMP LOOP9;
TIME: ;比较次数以及为下次循环做准备
MOV A,P1
RL A
MOV P1,A
DJNZ R7,COMPARE
LOOP9: RET;
////////////////////乘法程序///////////////////////////////////////////////////// MULI: ;将第二个操作数的第一位一次与第一个操作数相乘CLR ERR
MOV RES0,#00H
MOV RES1,#00H
MOV RES2,#00H
MOV RES3,#00H
MOV FLEL4,#00H
MOV FLEL5,#00H
MOV FLEL6,#00H ;初始化处理
MOV A,SEC0 ;判断第一位是否为0
JZ SECOND ;为0,进行下一位操作
MOV A,FIR0
MOV B,SEC0
MUL AB
MOV RES0,A ;将乘积放入对应的结果存储区中
MOV A,FIR1
MOV B,SEC0
MUL AB
MOV RES1,A
MOV A,FIR2
MOV B,SEC0