📄 jisuan.asm
字号:
;/*******************************************************************************
;* 标题: xl系列单片机实验仪演示程序 矩阵键盘1602液晶显示计算器 *
;* 日期: 2006-1-5 *
;* 版本: 3.0 (试验通过版)可用xl600-xl1000单片机综合试验仪试验 *
;* 邮箱: sxj1974@163.com *
;* 网站: http://www.51c51.com www.8951.com *
;********************************************************************************
;简单的计算器演示程序 硬件连接:矩阵键盘接p1口1602液晶控制p2.0-2.2 液晶数据p0 *
;0-99之间的加、减、乘、除运算 *
; 0a键+ 0b键- 0c键* 0#键/ 0#键清除 00键 等于 *
;矩阵键盘定义: *
;P1.0-P1.3为列线,P1.4-P1.7为行线 *
;出口:A、R3存键值 *
;********************************************************************************
;* 【版权】 Copyright(C)深圳市学林电子有限公司 www.51c51.com *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
;* 【技术支持】请访问http://www.51c51.com/bbs/index.asp 官方论坛 *
;********************************************************************************/
RELAY EQU P1.3
BEEP EQU P3.7
;-------------------------------
RS EQU P2.0
RW EQU P2.1
EN EQU P2.2
X EQU 3fH ;LCD 地址变量
;-------------------------------
TEMP1 EQU 30H ;临时暂存器
TEMP2 EQU 31H
TEMP3 EQU 32H
TEMP4 EQU 33H
RES_H EQU 24H ;输入被加(减、乘、除)数
RES_L EQU 25H ;输入加(减、乘、除)数
OUT_H EQU 26H ;运算结果高位
OUT_L EQU 27H ;运算结果低位
;-------------------------------
ORG 0000H
JMP MAIN
;-------------------------------
MAIN: MOV SP,#60H
CLR EN
CALL SET_LCD
MOV 20H,#00H
CALL BEEP_BL ;起延时作用
MOV R1,#00H
MOV TEMP1,#00H
MOV TEMP2,#00H
MOV TEMP3,#00H
MOV RES_L,#00H
MOV RES_H,#00H
MOV OUT_H,#00H
MOV OUT_L,#00H
LOOP:
CALL KEY_IN ;送被(加、减、乘、除)数
JNB 20H.0,LOOP ;键标记
CALL BEEP_BL
INC R1
CJNE R1,#01H,LOOP_1
MOV TEMP2,A ;高位
MOV X,#2
CALL CONV0
LOOP_1: CJNE R1,#02H,LOOP
SUBB A,#0AH ;判是否是功能键?
JNC LOOP_2 ;是,转LOOP_2
MOV TEMP1,TEMP2
MOV A,TEMP1
MOV X,#1
CALL CONV0
MOV A,R3 ;恢复有效键值
MOV TEMP2,A ;低位
MOV X,#2
CALL CONV0
MOV A,TEMP1
ANL A,#0FH
SWAP A
ORL A,TEMP2
MOV RES_H,A
JMP LOOP0
LOOP_2:
MOV RES_H,TEMP2
AJMP LOOP0A
LOOP0: CALL KEY_IN
JNB 20H.0,LOOP0
CALL BEEP_BL
LOOP0A: MOV A,R3 ;重装键值
CJNE A,#0AH,LOOP1 ;加运算
CALL CONV1
SETB 20H.1 ;加运算标记
AJMP LOOP5
LOOP1: CJNE A,#0BH,LOOP2 ;减运算
CALL CONV2
SETB 20H.2 ;减运算标记
AJMP LOOP5
LOOP2: CJNE A,#0CH,LOOP3 ;乘运算
CALL CONV3
SETB 20H.3 ;乘运算标记
AJMP LOOP5
LOOP3: CJNE A,#0DH,LOOP4 ;除运算
CALL CONV4
SETB 20H.4 ;除运算标记
AJMP LOOP5
LOOP4: CJNE A,#0FH,LOOP4A
AJMP MAIN
LOOP4A: AJMP LOOP0
LOOP5: MOV R1,#00H
MOV TEMP1,#00H
MOV TEMP2,#00H
CLR 20H.0 ;送(加、减、乘、除)数
LOOP5A: CALL KEY_IN
JNB 20H.0,LOOP5A
CALL BEEP_BL
CJNE A,#0FH,LOOP5B
AJMP MAIN
LOOP5B: INC R1
CJNE R1,#01H,LOOP5C
MOV TEMP2,A
MOV X,#6
CALL CONV0
LOOP5C: CJNE R1,#02H,LOOP5A
SUBB A,#0AH ;判是否是功能键?
JNC LOOP5D ;是,转LOOP5C
MOV TEMP1,TEMP2
MOV A,TEMP1
MOV X,#6
CALL CONV0
MOV A,R3
MOV TEMP2,A
MOV X,#7
CALL CONV0
MOV A,TEMP1
ANL A,#0FH
SWAP A
ORL A,TEMP2
MOV RES_L,A
JMP LOOP6
LOOP5D: MOV RES_L,TEMP2
JMP LOOP6A
LOOP6: CALL KEY_IN
LOOP6A: MOV A,R3 ;重装键值
CJNE A,#0FH,LOOP6B
AJMP MAIN
LOOP6B: CJNE A,#0EH,LOOP6 ;显示(=)
CALL CONV5
CALL BEEP_BL ;显示运算结果
JNB 20H.1,LOOP6C
CALL SUADD
LOOP6C: JNB 20H.2,LOOP6D
CALL SUSUB
LOOP6D: JNB 20H.3,LOOP6E
CALL SUMUL
LOOP6E: JNB 20H.4,LOOP7
CALL SUDIV
LOOP7: CALL KEY_IN
CJNE A,#0FH,LOOP7 ;复位(清零)
AJMP MAIN
;------------------------
;加法运算子程序
;入口:R0-被加数,R1-加数
;出口:R4(高)、R2(低)为和值
;------------------------
SUADD:
MOV R1,RES_L
MOV R0,RES_H
MOV A,R0
ADD A,R1
DA A
MOV R2,A
CLR A
ADDC A,#00H
MOV R4,A
MOV OUT_H,R4
MOV OUT_L,R2
CALL T_CONV
RET
;------------------------
;减法运算子程序
;入口:R0-被减数,R1-减数
;出口:R2-差值
;------------------------
SUSUB:
MOV R1,RES_L
MOV R0,RES_H
CLR C
MOV A,#9AH
SUBB A,R1 ;减数十进制求补
ADD A,R0
DA A
MOV R2,A ;差值送R2
JC POSI ;C=1,表示差值为正
NEGA: MOV A,#9AH ;差值为负,求补后得差值的绝对值
SUBB A,R2
MOV R2,A
SETB 20H.5 ;显示负号标记
POSI: MOV OUT_H,#00H
MOV OUT_L,R2
CALL T_CONV
RET
;-------------------------
;乘法运算子程序
; 单字节BCD码乘法子程序
;入口: R0(被乘数)、R1(乘数)
;出口: R3(高)、R2(低),积为双字节,BCD码形式的积
;从乘数高位开始进行BCD码移位乘法
;-------------------------
SUMUL:
MOV R1,RES_L
MOV R0,RES_H
BCDMUL:
CLR A ;积单元清零
MOV R2,A
MOV R3,A
MOV A,R1
JZ RETURN
ANL A,#0F0H ;取乘数高位
JZ LBCD ;乘数高位是否为0?
SWAP A
MOV R4,A
ACALL DDBCDM
SWAP A ;BCD码左移一位
MOV R3,A
MOV A,R2
SWAP A
MOV R2,A
ANL A,#0FH
ORL A,R3
MOV R3,A
MOV A,R2
ANL A,#0F0H
MOV R2,A
LBCD: MOV A,R1 ;取乘数低位
ANL A,#0FH
JZ RETURN ;乘数低位是否为0?
MOV R4,A
ACALL DDBCDM
RETURN: MOV OUT_H,R3
MOV OUT_L,R2
CALL T_CONV
RET
DDBCDM: ;一位BCD码乘法
MOV A,R2
ADD A,R0
DA A
MOV R2,A
MOV A,R3
ADDC A,#00H
DA A
MOV R3,A
DJNZ R4,DDBCDM
RET
;------------------------------------------------
;除法运算子程序
;单字节BCD码除法
;入口:R0(被除数)、R1(非零除数)
;出口:R2(商)、R3(余数)
;《MCS-51系列单片机实用子程序集锦》Page 73
;-----------------------------------------------
SUDIV:
MOV R1,RES_L
MOV R0,RES_H
BCDDIV:
MOV R2,#00H ;商单元清零
MOV A,R1 ;除数求补
CPL A
ADD A,#9BH
MOV R1,A
MOV A,R0 ;被除数高位移入
ANL A,#0F0H ;部分余单元
SWAP A
LP0: MOV R3,A ;做除法
ADD A,R1
DA A
JNC LP1 ;部分余数>=除数?
INC R2 ;商加1
SJMP LP0
LP1: MOV A,R3 ;
SWAP A
MOV R3,A
MOV A,R2 ;商左移一位
SWAP A
MOV R2,A
MOV A,R0 ;移位
ANL A,#0FH
ORL A,R3
LP2: MOV R3,A ;做除法
ADD A,R1
DA A
JNC LP3
INC R2 ;商加1
SJMP LP2
LP3: MOV A,R3 ;四舍五人
ADD A,R3
DA A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -