⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jisuanqi.txt

📁 整数计算 计算器 汇编语言 不含负数
💻 TXT
字号:
org 0000h
ajmp main
org 0030h
main:
   mov sp,#60h
   mov 60h,#0ch
   mov 30h,#00h ;将30H个位显示缓冲单元清零
   mov 31h,#00h ;将31H十位显示缓冲单元清零
   mov 32h,#00h ;将32H百位显示缓冲单元清零
   mov 33h,#00h ;将33H千位显示缓冲单元清零
   mov 34h,#00h ;将33H万位显示缓冲单元清零
   mov 35h,#00h ;将33H十万位显示缓冲单元清零
   mov 36h,#00h
   mov 37h,#00h
   mov 38h,#00h
   mov 40h,#00h
   mov 41h,#00h
   mov 42h,#00h
   mov 43h,#00h
   mov 44h,#00h
   mov 45h,#00h
   mov 46h,#00h
   mov 47h,#00h
   mov 50h,#00h
   mov 51h,#00h
   mov 52h,#00h
   mov 53h,#00h
loop:
   lcall display ;调用显示程序
   lcall key ;调用键盘描程序
   cpl a ;将A的值取反
   jz loop ;无键键按下则返回
new:
   mov a,39h
   clr c
   subb a,#0ah
   jnc fun
   mov 30h,31h
   mov 31h,32h
   mov 32h,33h
   mov 33h,34h
   mov 34h,35h
   mov 35h,36h ;将32H显示单元的内容送入33H
   mov 36h,37h ;将31H显示单元的内容送入32H
   mov 37h,38h ;将30H单元的内容送入31H
   mov a,30h
   jz read
   lcall error
read:
   mov a,39h ;将键值送入ACC
   mov 38h,a ;将ACC的值送入30H
   ljmp loop ;返回主程序循环
fun:
   clr c
   subb a,#01h
   jz reset
   pop a
   clr c
   subb a,#0ah
   mov dptr ,#table
   clr c
   rl a
   jmp  @a+dptr
table:
   ajmp  equal
   nop
   nop
   ajmp  adder
   ajmp  subtracter
   ajmp  multiplication
   ajmp  division

equal:
   nop
   lcall changebcd
   push  39h
   lcall result
   lcall clear
   ljmp new

reset:
   ljmp main

adder:
   lcall changebcd
   mov  r0,#40h
   mov  r1,#50h
   mov  r3,#04h
   mov  a,r0
   add  a,r3
   mov  r0,a
   dec  r0
   mov  a,r1
   add  a,r3
   mov  r1,a
   dec  r1
   clr  c
cadl_d1:
   mov  a,@r0
   addc a,@r1
   da   a
   mov  @r0,a
   dec  r0
   dec  r1
   djnz r3,cadl_d1
   jnc next0
   lcall error
next0:
   push  39h
   lcall result
   lcall clear
   ljmp new

subtracter:
   lcall changebcd
   mov  r0,#40h
   mov  r1,#50h
   mov  r3,#04h
   mov  a,r0
   add  a,r3
   mov  r0,a
   dec  r0
   mov  a,r1
   add  a,r3
   mov  r1,a
   dec  r1
   setb c
csu_l1:
   clr  a
   addc a,#99h
   subb a,@r1
   add  a,@r0
   da   a
   mov  @r0,a
   dec  r0
   dec  r1
   djnz r3,csu_l1
   jc   next1
   lcall error
next1:
   push  39h
   lcall result
   lcall clear
   ljmp  new
multiplication:
   lcall changebcd
   mov   r0,#40h
   mov   r1,#50h
   mov   r3,#04h
   mov   a,r3
   mov   r6,a
   add   a,r3
   mov   r2,a
   mov   a,r3
   add   a,r0
   mov   r0,a
   mov   a,r1
   add   a,r3
   dec   a
   mov   r1,a
   clr   a
cmul1:
   mov @r0,a
   inc r0
   djnz r6,cmul1
   mov a,r2
   mov r6,a
   dec r0
cmul2:
   clr a
cmul3:
   xch a,@r0
   swap a
   xchd a,@r0
   xch a,@r0
   dec r0
   djnz r2,cmul3
   mov r7,a
   jz cmul7
cmul4:
   mov a,r3
   mov r2,a
   add a,r3
   add a,r0
   mov r0,a
   clr c
cmul5:
   mov a,@r0
   addc a,@r1
   da a
   mov @r0,a
   dec r0
   dec r1
   djnz r2,cmul5
   mov a,r3
   mov r2,a
cmul6:
   clr a
   addc a,@r0
   da a
   mov @r0,a
   dec r0
   djnz r2,cmul6
   mov a,r3
   add a,r1
   mov r1,a
   djnz r7,cmul4
cmul7:
   mov a,r3
   add a,r3
   mov r2,a
   add a,r0
   mov r0,a
   djnz r6,cmul2
   mov a,40h
   orl a,41h
   orl a,42h
   orl a,43h
   jnz bridge3
   ajmp goon3
bridge3:
   lcall error
goon3:
   mov 40h,44h
   mov 41h,45h
   mov 42h,46h
   mov 43h,47h
   mov 44h,#00h
   mov 45h,#00h
   mov 46h,#00h
   mov 47h,#00h
   push  39h
   lcall result
   lcall clear
   ljmp new
division :
   lcall changebcd
   mov  r0,#40h
   mov  r1,#50h
   mov  r3,#04h
   mov a,50h
   orl a,51h
   orl a,52h
   orl a,53h
   jnz shift
   lcall error
shift:
   mov 44h,40h
   mov 45h,41h
   mov 46h,42h
   mov 47h,43h
   mov 40h,#00h
   mov 41h,#00h
   mov 42h,#00h
   mov 43h,#00h
   mov a,r3
   add a,r3
   mov r7,a
   dec r0
   dec r1
cdiv1:
   mov a,r3
   add a,r3
   mov r2,a
   add a,r0
   mov r0,a
   clr a
cdiv2:
   xch a,@r0
   swap a
   xchd a,@r0
   xch a,@r0
   dec r0
   djnz r2,cdiv2
   mov r4,a
cdiv3:
   mov a,r3
   mov r6,a
   add a,r0
   mov r0,a
   add a,r3
   xch a,r0
   inc @r0
   xch a,r0
   mov a,r1
   add a,r3
   mov r1,a
   setb c
cdiv4:
   clr a
   addc a,#99h
   subb a,@r1
   add a,@r0
   da a
   mov @r0,a
   dec r0
   dec r1
   djnz r6,cdiv4
   cpl c
   mov a,r4
   subb a,#0
   mov r4,a
   jnc cdiv3
   mov a,r3
   mov r6,a
   add a,r0
   mov r0,a
   add a,r3
   xch a,r0
   dec @r0
   xch a,r0
   mov a,r1
   add a,r3
   mov r1,a
   clr c
cdiv5:
   mov a,@r0
   addc a,@r1
   da a
   mov @r0,a
   dec r0
   dec r1
   djnz r6,cdiv5
   djnz r7,cdiv1
   mov 40h,44h
   mov 41h,45h
   mov 42h,46h
   mov 43h,47h
   mov 44h,#00h
   mov 45h,#00h
   mov 46h,#00h
   mov 47h,#00h
   push  39h
   lcall result
   lcall clear
   ljmp new

display:
   mov p3,#0ffh ;将P3口置高电平
   mov r7,#50 ;软件计数器赋值
   mov dptr,#tab ;将表头位置送入DPTR
dd1:
   mov a,38h ;将显示缓冲区30H中的值送入ACC
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.0 ;开个位显示单元
   lcall delay100us ;延时100US
   setb p3.0 ;关个位显示单

   mov a,37h ;将显示缓冲区别31H中的值送入A
   orl a,36h
   orl a,35h
   orl a,34h
   orl a,33h
   orl a,32h
   orl a,31h
   jz n0
   mov a,37h
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.1 ;开十位显示单元
   lcall delay100us ;延时100US
n0:setb p3.1 ;关十位显示单元

   mov a,36h ;将显示缓冲区32H中的值送入ACC
   orl a,35h
   orl a,34h
   orl a,33h
   orl a,32h
   orl a,31h
   jz n1
   mov a,36h
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.2 ;开百位显示单元
   lcall delay100us ;延时100US
n1:setb p3.2 ;关百位显示单元

   mov a,35h ;将显示缓冲区33H中的值送入ACC
   orl a,34h
   orl a,33h
   orl a,32h
   orl a,31h
   jz n2
   mov a,35h
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.3 ;开千位显示单元
   lcall delay100us ;延时100US
n2:setb p3.3 ;关千位显示单元

   mov a,34h ;将显示缓冲区33H中的值送入ACC
   orl a,33h
   orl a,32h
   orl a,31h
   jz n3
   mov a,34h
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.4 ;开万位显示单元
   lcall delay100us ;延时100US
n3:setb p3.4 ;关万位显示单元

   mov a,33h ;将显示缓冲区33H中的值送入ACC
   orl a,32h
   orl a,31h
   jz  n4
   mov a,33h
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.5 ;开十万位显示单元
   lcall delay100us ;延时100US
n4:
   setb p3.5 ;关十万位显示单元

   mov a,32h ;将显示缓冲区36H中的值送入ACC
   orl a,31h
   jz  n5
   mov a,32h
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.6 ;开百万位显示单元
   lcall delay100us ;延时100US
n5:
   setb p3.6 ;关百万位显示单元

   mov a,31h ;将显示缓冲区33H中的值送入ACC
   jz  n6
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.7 ;开千万位显示单元
   lcall delay100us ;延时100US
n6:
   setb p3.7 ;关千万位显示单元
   djnz r7,bridge ;R7不等于0返回至DD1处
   sjmp goon
bridge:
   ljmp dd1
goon:
   ret ;R7等于0子程序返回

KEY:
   LCALL KS ;调用检测按键子程序
   JNZ K1 ;有键按下继续
   ljmp key_exit ;无键按下退出KEY子程序
K1:
   LCALL delay4ms ;返回继续检测有无按键按下
   LCALL delay4ms
   LCALL KS ;有键按下继续延时去抖动
   JNZ K2 ;再一次调用检测按键程序
   ljmp key_exit ;无键按下退出KEY子程序
K2:
   MOV R2,#0EFH ;将扫描值送入 R2暂存
   MOV R4,#00H ;将第一列的列值00H送入R4暂存,R4用于存放列
K3:
   MOV P1,R2 ;将R2的值送入P1口
L6:
   JB P1.0,L1 ;P1.0等于1跳转到L1
   MOV A,#00H ;将第一行的行值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,NEXT ;P1.3等于1跳转到NEXT处
   MOV A,#0cH ;将第四行的行值送入ACC
LK:
   ADD A,R4 ;行值与列值相加后的键值送入A
   mov 39h,a ;将A中的值送入39h暂存
K4:
   lcall display ;调用动态显示子程序
   LCALL KS
   JNZ K4 ;按键没有松开继续返回检测
   RET ;按键松开返回

NEXT:
   INC R4 ;将列值加一
   MOV A,R2 ;将R2的值送入A
   JNB ACC.7,key_exit ;扫描完成跳至KEY处进行下一回合的扫描
   RL A ;扫描未完成将A中的值右移一位进行下一列的扫
   MOV R2,A ;将ACC的值送入R2暂存
   AJMP K3 ;跳转到K3继续
key_exit:
   mov a,#0ffh ;无键按下则将A赋成0FFH。
   ret

KS:
   MOV P1,#0FH ;将P1口高四位置0低四位值1
   MOV A,P1 ;读P1口
   XRL A,#0FH ;将A中的值与A中的值相异或
   RET ;子程序返回
delay4ms: ;4ms延时程序
   MOV R5,#08H
L7:
   MOV R6,#0FAH
L8:
   DJNZ R6,L8
   DJNZ R5,L7
   RET

delay100us: ;100US延时程序
   mov r5,#50
   djnz r5,$
   ret

error:
   mov p3,#0ffh ;将P3口置高电平
   lcall delay100us
   lcall delay100us
   lcall delay100us
   lcall delay100us
   mov r7,#8h ;软件计数器赋值
dd2:
   mov r6,#50h
again:
   mov p2,#0b9h ;将要显示的数送入P0口
   clr p3.3
   lcall delay100us ;延时100US
   lcall delay100us
   lcall delay100us
   lcall delay100us
   setb p3.3 ;关个位显示单

   mov p2,#28h ;将要显示的数送入P0口
   clr p3.4 ;开十位显示单元
   lcall delay100us ;延时100US
   lcall delay100us
   lcall delay100us
   lcall delay100us
   setb p3.4 ;关十位显示单元

   mov p2,#0b9h ;将要显示的数送入P0口
   clr p3.5 ;开百位显示单元
   lcall delay100us ;延时100US
   lcall delay100us
   lcall delay100us
   lcall delay100us
   setb p3.5 ;关百位显示单元

   mov p2,#0b9h ;将要显示的数送入P0口
   clr p3.6 ;开千位显示单元
   lcall delay100us ;延时100US
   lcall delay100us
   lcall delay100us
   lcall delay100us
   setb p3.6 ;关千位显示单元

   mov p2,#0a1h ;将要显示的数送入P0口
   clr p3.7 ;开万位显示单元
   lcall delay100us ;延时100US
   lcall delay100us
   lcall delay100us
   lcall delay100us
   setb p3.7 ;关万位显示单元
   djnz r6,again
   djnz r7,dd2;R7不等于0返回至DD1处
   ljmp main
   ret

result:
   mov p3,#0ffh ;将P3口置高电平
   mov r7,#50 ;软件计数器赋值
   mov dptr,#tab
dd3:
   mov a,43h
   anl a,#0fh
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.0 ;开个位显示单元
   lcall delay100us ;延时100US
   setb p3.0 ;关个位显示单

   mov a,43h
   anl a,#0f0h
   swap a
   orl a,42h
   orl a,41h
   orl a,40h
   jz m0
   mov a,43h
   anl a,#0f0h
   swap a
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.1 ;开十位显示单元
   lcall delay100us ;延时100US
m0:
   setb p3.1 ;关十位显示单元

   mov a,42h
   orl a,41h
   orl a,40h
   jz m1
   mov a,42h
   anl a,#0fh
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.2 ;开百位显示单元
   lcall delay100us ;延时100US
m1:setb p3.2 ;关百位显示单元

   mov a,42h
   anl a,#0f0h
   orl a,41h
   orl a,40h
   jz m2
   mov a,42h
   anl a,#0f0h
   swap a
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.3 ;开千位显示单元
   lcall delay100us ;延时100US
m2:setb p3.3 ;关千位显示单元

   mov a,41h
   orl a,40h
   jz m3
   mov a,41h
   anl a,#0fh
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.4 ;开万位显示单元
   lcall delay100us ;延时100US
m3:setb p3.4 ;关万位显示单元

   mov a,41h
   anl a,#0f0h
   orl a,40h
   jz  m4
   mov a,41h
   anl a,#0f0h
   swap a
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.5 ;开十万位显示单元
   lcall delay100us ;延时100US
m4:setb p3.5 ;关十万位显示单元

   mov a,40h
   jz  m5
   anl a,#0fh
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.6 ;开百万位显示单元
   lcall delay100us ;延时100US
m5:setb p3.6 ;关百万位显示单元

   mov a,40h
   anl a,#0f0h
   swap a
   jz  m6
   movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
   mov p2,a ;将要显示的数送入P0口
   clr p3.7 ;开千万位显示单元
   lcall delay100us ;延时100US
m6:setb p3.7 ;关千万位显示单元
   djnz r7,bridge1 ;R7不等于0返回至DD1处
   sjmp goon1
bridge1:
   ljmp dd3
goon1:
   lcall key ;调用键盘描程序
   cpl a ;将A的值取反
   jz bridge2 ;无键键按下则返回
   sjmp goon2
bridge2:
   ljmp result
goon2:
   ret


changebcd:
   mov  r0,#31h
   mov  r1,#50h
   mov  r3,#04h
d_bcd_y:
   mov    a,@r0
   swap   a
   inc       r0
   xchd   a,@r0
   mov    @r1,a
   xchd     a,@r0
   inc      r0
   inc       r1
   djnz     r3,d_bcd_y
   ret
clear:
   mov 30h,#00h ;将30H个位显示缓冲单元清零
   mov 31h,#00h ;将31H十位显示缓冲单元清零
   mov 32h,#00h ;将32H百位显示缓冲单元清零
   mov 33h,#00h ;将33H千位显示缓冲单元清零
   mov 34h,#00h ;将33H万位显示缓冲单元清零
   mov 35h,#00h ;将33H十万位显示缓冲单元清零
   mov 36h,#00h
   mov 37h,#00h
   mov 38h,#00h
   ret

tab: db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
   end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -