您的位置 首页 编程

根据单片机计算器的汇编程序

程序中是实现了一字节整数的加减乘除计算,支持连续按键的情况,其程序流程图将要上传至图片,希望对爱好者有所帮助也希望能够得到高手的指

程序中是完成了一字节整数的加减乘除核算,支撑接连按键的状况,其程序流程图即将上传至图片,期望对爱好者有所协助也期望可以得到高手的点拨。

ORG 00H
LJMP MAIN
ORG 0BH ;守时器1处理
LJMP PROC_COUNT
Keydata EQU 35H ;0->0 ..9-> , +->10, –>11 , =->14 C->15
flag bit 0
last bit 1
Cup bit 2
tempc bit 3
DisBuffer EQU 50H
STA EQU 49H
OP1 EQU 40H
OP EQU 43H
OP2 EQU 44H
Buff EQU 42H
Resut EQU 41H

MAIN:
CLR flag
CLR last
CLR Cup
CLR tempc
MOV STA,#0
MOV OP1,#0
MOV OP2,#0
MOV OP,#0
MOV Buff,#0
MOV Keydata,#0
MOV SP,#60H
MOV psw ,#0
MOV TMOD,#01H ; clock =12mhz 守时器0的方法1
MOV TH0,#0D8H
MOV TL0,#0F0H ;守时时刻为10ms
SETB ET0
SETB EA
SETB TR0

MOV 50H,#3FH ;初始化缓冲区50h-52h
MOV 51H,#3FH
MOV 52H,#3FH

WORK:
CLR C
CALL KeyIN ;调用键盘扫描程序有键按下时C=1 Keydata回来 0~9 为0~9 “+-*/” 为10、11、12、13 “=”为14 C键为15
mov tempc,c
anl c,/last
mov Cup,c
mov c,tempc
mov last,c
mov c,Cup
JNC WORK ;进位为0则搬运

;检测状况程序段
MOV A,STA ;将状况值送A
RL A
MOV DPTR,#STTAB ;将分支程序的初值送DPTR
JMP @A+DPTR ;挑选程序分支
STTAB:
AJMP STA0 ;状况0子程序
AJMP STA1 ;状况1子程序
AJMP STA2 ;状况2子程序
AJMP STA3 ;状况3子程序
AJMP STA4 ;状况4子程序
AJMP STA5 ;状况5子程序
STA0:
MOV A,Keydata ;将键值送A
CLR C ;铲除进位位
SUBB A,#10 ;判别是否位数字键
JNC STA0END ;否时搬运到STA0END
CALL DATA_IN ;调用DATA_IN子程序讲数值送入Buff
MOV STA,#1
STA0END:
JMP Display
STA1:
MOV A,Keydata ;将键盘所对应的数值送A
CLR C ;铲除进位位
SUBB A,#10 ;判别是否位数字键
JNC STA1NEXT ;否时搬运到continue
CALL DATA_IN ;调用DATA_IN子程序讲数值送入Buff
JNC STA1END ;无溢出时跳至状况1完毕节点
MOV STA,#5 ;有溢出时将状况标志置为5
STA1END:
JMP Display
;判别是否为运算符 是时将Buff中的值送给OP1 将运算符送OP中保存 将状况置为2态
STA1NEXT:
MOV A,Keydata
CLR C
SUBB A,#14
JNC STA1NEXT1
MOV OP1,Buff
MOV OP,Keydata
MOV STA,#2
JMP STA1END
;判别是否是=
STA1NEXT1:
MOV A,Keydata
CJNE A,#14,STA1NEXT2 ;是否为等号 不是时搬运
MOV OP1,Buff ;是”=”时将Buff中的数值送OP1
MOV Buff,#0 ;将Buff清空将状况变为4态
MOV STA,#4
JMP STA1END ;跳到STA1END
;不是=时只能为C键
STA1NEXT2:
MOV Buff,#0 ;将Buff清空 将状况置为0态
MOV STA,#0
JMP STA1END ;跳至状况1完毕节点
;STA2处理程序
STA2:
MOV A,Keydata ;将键盘所对应的数值送A
CLR C ;铲除进位位
SUBB A,#10 ;判别是否位数字键
JNC STA2NEXT ;否时搬运到STA2NEXT
MOV Buff,#0
CALL DATA_IN ;调用DATA_IN子程序讲数值送入Buff
MOV STA,#3
STA2END:
JMP Display
;是否为运算符 是时将运算符送OP否时搬运至STA2NEXT1
STA2NEXT:
MOV A,Keydata
CLR C
SUBB A,#14
JNC STA2NEXT1
MOV A,Keydata
MOV OP,A

JMP STA2END
STA2NEXT1:
MOV A,Keydata
CJNE A,#14,STA2NEXT2 ;是否为等号 不是时搬运STA2NEXT2 是”=”时 将状况设为4态
MOV STA,#4
JMP STA2END
STA2NEXT2: ;是C键时将Buff清空将状况变为0态
MOV Buff,#0
MOV STA,#0
JMP STA2END
STA3:
MOV A,Keydata ;将键盘所对应的数值送A
CLR C ;铲除进位位
SUBB A,#10 ;判别是否位数字键
JNC STA3NEXT ;否时搬运到STA3NEXT
CALL DATA_IN ;调用DATA_IN子程序讲数值送入Buff
JNC STA3END ;无溢出时跳至状况3完毕节点
MOV STA,#5 ;有溢出时将状况标志置为5
STA3END:
JMP Display
;判别是否为运算符 是运算符时先进行运算 且判别是否有溢出
STA3NEXT:
MOV A,Keydata
CLR C
SUBB A,#14
JNC STA3NEXT1 ;不是运算符时进行下次判别是否为=
MOV OP2,Buff ;是运算符时将缓冲区的数值给OP2 再将缓冲区铲除
MOV Buff,#0
CALL Comput ;调用Comput 将成果Resut送入OP1

JNC STA3NEXT2 ;核算完成后判别数值是否有溢出 没有时跳至STA3NEXT2

MOV STA,#5 ;成果有溢出时进入状况5
JMP STA3END
STA3NEXT2:
MOV OP1,Resut
MOV OP,Keydata ;接连按运算符的状况
MOV STA,#2
JMP STA3END
;判别是否为”=”的状况
STA3NEXT1:
MOV A,Keydata
CJNE A,#14,STA3NEXT3
MOV OP2,Buff ;是运算符时将缓冲区的数值给OP2 再将缓冲区铲除
MOV Buff,#0
CALL Comput
JNC STA3NEXT4 ;核算完成后判别数值是否有溢出 没有时跳至STA3NEXT4
MOV STA,#5 ;成果有溢出时进入状况5
JMP STA3END
STA3NEXT4: ;将成果送入OP1进入状况4
MOV A,Resut
MOV OP1,A
MOV STA,#4
JMP STA3END
STA3NEXT3: ;按C键的状况将缓冲区铲除 进入状况0
MOV Buff,#0
MOV STA,#0
JMP STA3END
STA4:
MOV A,Keydata ;将键盘所对应的数值送A
CLR C ;铲除进位位
SUBB A,#10 ;判别是否位数字键
JNC STA4NEXT ;不是数字键时处理
MOV Buff,#0 ;铲除缓冲区

CALL DATA_IN ;调用DATA_IN子程序
MOV STA,#1 ;进入状况1
STA4END:
JMP Display
;判别是否为运算符
STA4NEXT:
MOV A,Keydata
CLR C
SUBB A,#14
JNC STA4NEXT1
MOV OP,Keydata ;将键盘所对应的数值送OP
MOV STA,#2
JMP STA4END
;为C键的处理
STA4NEXT1:
MOV A,Keydata
CJNE A,#15,STA4END
MOV Buff,#0
MOV STA,#0
JMP STA4END
;在状况5判别是否为C键 若是则铲除缓冲区
STA5:
MOV A,Keydata
CJNE A,#15,STA5END
MOV Buff,#0
MOV STA,#0
STA5END:
JMP Display
;Display子程序段 当为状况0、1、3时转向Buff_display 当为状况2、4时转向OP1_display当为状况5和其他状况时转向E_display
Display:
MOV A,STA
JZ Buff_display

CJNE A,#1,DNEXT
JMP Buff_display
DNEXT:
CJNE A,#2,DNEXT1
JMP OP1_display
DNEXT1:
CJNE A,#3,DNEXT2
JMP Buff_display
DNEXT2:
CJNE A,#4,DEND
JMP OP1_display
DEND:
JMP E_display
;因 OP1_display与 Buff_display 的处理共同所以运用共用的程序段BandOP1dis
Buff_display:
MOV R3,Buff
JMP BandOP1dis
OP1_display:
MOV R3,OP1
JMP BandOP1dis
;查看是一位数时进入G_display 是两位数时进入SH_display 三位数时进行 B_display
BandOP1dis:
MOV A,R3
MOV B,#10 ;将R3中的内容除10 若商为0则为一位数
DIV AB
JZ G_display
MOV A,R3 ;将R3中的内容除100 若商为0则为两位数否则为三位数
MOV B,#100
DIV AB
JZ SH_display
JMP B_display
G_display:
MOV DPTR,#SEG1_TABLE ;B中的数便是个位上的数 将个位数所对应的7段码送50h 且将51h、52H 存入0FFH将数码管平息
MOV R2,B
MOV A,R2
MOVC A,@A+DPTR
MOV 52H,A
MOV 51H,#0
MOV 50H,#0
JMP BandOend
SH_display: ;将R3中的内容除10 商为十位上的数 余数为个位上的数
MOV DPTR,#SEG1_TABLE
MOV A,R3
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV 51H,A ;将十位上的数所对应的7段码送51h
MOV R2,B
MOV A,R2
MOV DPTR,#SEG1_TABLE
MOVC A,@A+DPTR
MOV 52H,A ;将个位上的数所对应的7段码送50h
MOV 50H,#0
JMP BandOend
B_display: ;通过判别今后 A中的数为百位上的数将所对应的7段码送52h
MOV DPTR,#SEG1_TABLE
MOVC A,@A+DPTR
MOV 50H,A
MOV R2,B ;B中为后两位数
MOV A,R2
MOV B,#10
DIV AB ;运算后A中为十位上的数 B中为个位上的数
MOV DPTR,#SEG1_TABLE
MOVC A,@A+DPTR
MOV 51H,A
MOV R2,B
MOV A,R2
MOV DPTR,#SEG1_TABLE
MOVC A,@A+DPTR
MOV 52H,A
BandOend:
JMP DisOver ;跳入显现完毕程序口 DisOver
E_display:
MOV DPTR,#SEG1_TABLE
MOV A,#10
MOVC A,@A+DPTR
MOV 52H,A
MOV 51H,#00H
MOV 50H,#00H
JMP DisOver ;跳入显现完毕程序口 DisOver

DisOver:
JMP WORK

;DATA_IN 子程序段完成 Buff=Buff*10+Keydata并判别是否有溢出 送C中
DATA_IN :
CLR C
MOV A,Buff
MOV B,#10
MUL AB
MOV C,PSW.2
JNC DATA_IN1
JMP DOVER
DATA_IN1:
ADDC A,Keydata
MOV C,PSW.2
DOVER:
MOV Buff,A
RET
;核算子程序段
Comput:
MOV A,OP ;因运算符的末位数为0、1、2、3
MOV B,#10 ;将OP除以10所得的余数为所对应的末尾数 再将其赋予A进行分支程序挑选
DIV AB
MOV R5,B
MOV A,R5
RL A
MOV DPTR,#ComTAB
JMP @A+DPTR
ComTAB:
AJMP ADDER ;为0时为加法运算
AJMP SUBBER ;为1时为减法运算
AJMP MULER ;为2时为乘法运算
AJMP DIVER ;为3时为除法运算
ADDER: ;加法运算
MOV A,OP1
ADDC A,OP2
JMP ComEND
SUBBER: ;减法运算
MOV A,OP1
SUBB A,OP2
JMP ComEND
MULER: ;乘法运算
MOV A,OP1
MOV B,OP2
MUL AB
JMP ComEND
DIVER: ;除法运算
MOV A,OP1
MOV B,OP2
DIV AB
JMP ComEND
ComEND: ;将成果送Resut
MOV Resut,A
MOV C,PSW.2 ;将溢出标志送C
RET

;中止程序处理中止使命

PROC_COUNT: ;将缓冲区的内容送数码管显现
PUSH ACC ; r0 显现位 计数 0~7
PUSH PSW
MOV PSW ,#08H ;select r group 1
CLR TR0
CLR EA
MOV TH0,#0D8H ; 2.1ms
MOV TL0,#0F0H
CLR TF0 ;铲除中止溢出位

MOV A,R0 ;显现的位数超越4时R0赋值0
SUBB A,#3 ;R0的值与3相减有借位时搬运到pro1
JC pro1
MOV R0,#0
pro1: MOV P2,#0FFH ;先平息数码管避免发生扫尾现象
MOV A,R0
MOV P1,A
MOV A,#DisBuffer
ADD A,R0 ;第R0位对应的缓冲区的地址
MOV R1,A
MOV A,@R1 ;将缓冲区的内容送A
MOV P2,A ;将A中的内容送P2口显现
INC R0
SETB EA
SETB TR0
POP PSW
POP ACC
RETI

KeyIN:
PUSH PSW
MOV PSW,#10H ;挑选第二组寄存器组

MOV P0,#0FFH
CLR P0.0
MOV A,P0
CJNE A,#0XFE,CHECK ;Scane L1若有键按下时调用CHECK子程序

SETB P0.0
CLR P0.1
MOV A,P0
CJNE A,#0XFD,CHECK ;Scane L2 若有键按下时调用CHECK子程序

SETB P0.0
SETB P0.1
CLR P0.2
MOV A,P0
CJNE A,#0XFB,CHECK ;Scane L3 若有键按下时调用CHECK子程序

SETB P0.0
SETB P0.1
SETB P0.2
CLR P0.3
MOV A,P0
CJNE A,#0XF7,CHECK ;Scane L4 若有键按下时调用CHECK子程序
CLR C ;没有键按下铲除C

retsub:
MOV flag,c
POP PSW
MOV C,flag
RET

CHECK:

MOV Keydata,A ;将P0口的状况给Keydata
MOV R2,#16 ;设定查找次数为15次而R2赋16
MOV A,#0
MOV R6,#0 ;初始计数寄存器
MOV DPTR,#key_TABLE ;开端查表键
D:
MOV A,R6 ;将寄存器6的值送a
MOVC A,@A+DPTR ;查表将得到是值送a
CJNE A,Keydata,D1 ;将a的值与p0口比照若不持平查询下一个
JMP OK ;持平调用OK子程序
D1:
INC R6 ;将R6的值加1
DJNZ R2, D ;r2不等于0搬运
CLR C
MOV Keydata,#0FFH ;没有查到数时将0FF送 Keydata
RET

OK:
SETB C
MOV A,R6 ;查到第R6个数则这个数是R6
MOV Keydata,A ;将数值送Keydata
JMP retsub


SEG1_TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,79H ;数字的0~9 + – */ 对应 ASCD “E”对应过错
key_TABLE:
DB 7EH,7DH,7BH,0BEH,0BDH,0BBH,0DEH,0DDH,0DBH,0EEH,77H,0B7H,0D7H,0E7H,0EBH,0EDH ;键盘的16个键

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/259073.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部