📄 4jisuan.asm
字号:
;/*******************************************************************************
;* 标题: xl系列单片机实验仪演示程序 矩阵键盘1602液晶显示乘法计算器 *
;* 日期: 2006-1-5 *
;* 版本: 3.0 (试验通过版)可用xl600-xl1000单片机综合试验仪试验 *
;* 邮箱: sxj1974@163.com *
;* 网站: http://www.51c51.com www.8951.com *
;********************************************************************************
;四位数乘法运算 LCD1602显示、矩阵键盘、蜂鸣器。 *
;硬件连接:矩阵键盘接p1口1602液晶控制p2.0-2.2 液晶数据p0,喇叭接P3.7口 *
;0C键-乘法键,0*键-平方键 *
;00键-结果键,0#键-清零键 *
;矩阵键盘定义: *
;P1.0-P1.3为列线,P1.4-P1.7为行线 出口:A、R3存键值 *
;********************************************************************************
;* 【版权】 Copyright(C)深圳市学林电子有限公司 www.51c51.com *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
;* 【技术支持】请访问http://www.51c51.com/bbs/index.asp 官方论坛 *
;********************************************************************************/
BEEP EQU P3.7
RS EQU P2.0
RW EQU P2.1
EN EQU P2.2
X EQU 3FH ;LCD 地址变量
;------------------------------------------------------------
RES_A EQU 30H ;(BCD码)积的最低位
RES_B EQU 31H ;
RES_C EQU 32H ;
RES_D EQU 33H ;(BCD码)积的最高位
TEMP1 EQU 35H ;放设置数的最低位1
TEMP2 EQU 36H ;放设置数2
TEMP3 EQU 37H ;放设置数3
TEMP4 EQU 38H ;放设置数的最高位4
RES_1 EQU 40H ;存放被乘数高位
RES_2 EQU 41H ;存放被乘数低位
RES_3 EQU 42H ;存放乘数高位
RES_4 EQU 43H ;存放乘数低位
;----------------------------------------------------------
ORG 0000H
JMP MAIN ;主程序开始
;----------------------------------------------------------
ORG 0100H
MAIN: MOV SP,#60H ;设置SP指针
LCALL PRO_SET ;初始化
CALL SET_LCD1
MOV R0,#00H
LOOP:
MOV R1,#30H
MOV A,#00H ;30H-3EH单元清零
CLR_01: MOV @R1,A
INC R1
CJNE R1,#3FH,CLR_01
LOOP0: CALL KEY_IN
JNB 20H.0,LOOP0
CALL BEEP_BL
SUBB A,#0AH ;判键值大于9的无效
JNC LOOP0 ;数字键有效
CALL SET_LCD2
AJMP LOOP0B
LOOP0A: CALL KEY_IN ;清零键功能
JNB 20H.0,LOOP0A
CALL BEEP_BL
CJNE A,#0FH,LOOP0B
AJMP MAIN
LOOP0B: MOV A,R3 ;键值重新送入A
INC R0
CJNE R0,#01H,LOOP1
MOV TEMP1,A
MOV X,#05H
CALL SHOW_BIG1
LOOP1: CJNE R0,#02H,LOOP2
CJNE A,#0DH,LOOP1A ;判是否是平方键?
AJMP LOOP5A
LOOP1A: CJNE A,#0CH,LOOP1B ;判是否是乘法键?
AJMP LOOP5
LOOP1B: MOV TEMP2,TEMP1
MOV TEMP1,A
MOV X,#05H
CALL SHOW_BIG1
MOV X,#04H
MOV A,TEMP2
CALL SHOW_BIG1
LOOP2:
CJNE R0,#03H,LOOP3
CJNE A,#0DH,LOOP2A
AJMP LOOP5A
LOOP2A: CJNE A,#0CH,LOOP2B
AJMP LOOP5
LOOP2B: MOV TEMP3,TEMP2
MOV TEMP2,TEMP1
MOV TEMP1,A
MOV X,#05H
CALL SHOW_BIG1
MOV A,TEMP2
MOV X,#04H
CALL SHOW_BIG1
MOV A,TEMP3
MOV X,#03H
CALL SHOW_BIG1
LOOP3: CJNE R0,#04H,LOOP4
CJNE A,#0DH,LOOP3A
AJMP LOOP5A
LOOP3A: CJNE A,#0CH,LOOP3B
AJMP LOOP5
LOOP3B: MOV TEMP4,TEMP3 ;数据交换
MOV TEMP3,TEMP2
MOV TEMP2,TEMP1
MOV TEMP1,A ;数据显示 (个位)
MOV X,#05H
CALL SHOW_BIG1
MOV A,TEMP2 ;数据显示 (十位)
MOV X,#04H
CALL SHOW_BIG1
MOV A,TEMP3 ;数据显示 (百位)
MOV X,#03H
CALL SHOW_BIG1
MOV A,TEMP4 ;数据显示 (千位)
MOV X,#02H
CALL SHOW_BIG1
JMP LOOP4A
LOOP4: AJMP LOOP0A
LOOP4A: CALL KEY_IN
JNB 20H.0,LOOP4A
CALL BEEP_BL
CJNE A,#0DH,LOOP4B
AJMP LOOP5A
LOOP4B: CJNE A,#0CH,LOOP4C
AJMP LOOP5
LOOP4C: CJNE A,#0FH,LOOP4A
AJMP MAIN
LOOP5:
MOV A,#2AH ;显示乘号
MOV B,#7
CALL LCDP1
MOV R0,#00H
MOV A,TEMP2 ;合并被乘数低位数据
ANL A,#0FH
SWAP A
ORL A,TEMP1
MOV RES_2,A ;被乘数低位(BCD码)
MOV A,TEMP4
ANL A,#0FH ;合并被乘数高位数据
SWAP A
ORL A,TEMP3
MOV RES_1,A ;被乘数高位(BCD码)
AJMP MAIN2
LOOP5A:
MOV R0,#00H ;执行平方功能操作
MOV A,TEMP2
ANL A,#0FH
SWAP A
ORL A,TEMP1
MOV RES_2,A ;被乘数低位(BCD码)
MOV RES_4,A
MOV A,TEMP4
ANL A,#0FH
SWAP A
ORL A,TEMP3
MOV RES_1,A ;被乘数高位
MOV RES_3,A
ACALL DUBCDM
ACALL CONV2
MAIN1: CALL KEY_IN ;等待复位
JNB 20H.0,MAIN1
CALL BEEP_BL
CJNE A,#0FH,MAIN1
MOV R0,#00H
JMP MAIN
;-----------------------------------------------
MAIN2: MOV R0,#00H
MOV R1,#30H
MOV A,#00H
CLR_02: MOV @R1,A
INC R1
CJNE R1,#3FH,CLR_02
LOOPA: CALL KEY_IN
JNB 20H.0,LOOPA
CALL BEEP_BL
CJNE A,#0FH,LOOPAA
AJMP MAIN
LOOPAA: INC R0
CJNE R0,#01H,LOOPB
MOV TEMP1,A
MOV X,#09H
CALL SHOW_BIG1
LOOPB: CJNE R0,#02H,LOOPC
CJNE A,#0EH,LOOPBA
AJMP LOOPF
LOOPBA: MOV TEMP2,TEMP1
MOV TEMP1,A
MOV X,#0AH
CALL SHOW_BIG1
MOV X,#09H
MOV A,TEMP2
CALL SHOW_BIG1
LOOPC:
CJNE R0,#03H,LOOPD
CJNE A,#0EH,LOOPCA
AJMP LOOPF
LOOPCA: MOV TEMP3,TEMP2
MOV TEMP2,TEMP1
MOV TEMP1,A
MOV X,#0BH
CALL SHOW_BIG1
MOV A,TEMP2
MOV X,#0AH
CALL SHOW_BIG1
MOV A,TEMP3
MOV X,#09H
CALL SHOW_BIG1
LOOPD: CJNE R0,#04H,LOOPE
CJNE A,#0EH,LOOPDA
AJMP LOOPF
LOOPDA: MOV TEMP4,TEMP3
MOV TEMP3,TEMP2
MOV TEMP2,TEMP1
MOV TEMP1,A
MOV X,#0CH
CALL SHOW_BIG1
MOV A,TEMP2
MOV X,#0BH
CALL SHOW_BIG1
MOV A,TEMP3
MOV X,#0AH
CALL SHOW_BIG1
MOV A,TEMP4
MOV X,#09H
CALL SHOW_BIG1
JMP LOOPEA
LOOPE: AJMP LOOPA
LOOPEA: CALL KEY_IN
JNB 20H.0,LOOPEA
CALL BEEP_BL
CJNE A,#0EH,LOOPEB
AJMP LOOPF
LOOPEB: CJNE A,#0FH,LOOPEA
AJMP MAIN
LOOPF:
MOV R0,#00H
MOV A,TEMP2 ;合并乘数低位
ANL A,#0FH
SWAP A
ORL A,TEMP1
MOV RES_4,A ;乘数低位(BCD码)
MOV A,TEMP4
ANL A,#0FH ;合并乘数高位
SWAP A
ORL A,TEMP3
MOV RES_3,A ;乘数高位(BCD码)
ACALL DUBCDM
CALL CONV2
MAIN3: CALL KEY_IN ;等待复位
JNB 20H.0,MAIN3
CALL BEEP_BL
CJNE A,#0FH,MAIN3
MOV R0,#00H
JMP MAIN
;***************************************************
;(双字节)BCD码乘法子程序
;入口:R1(高)、R0(低)为被乘数;R3(高)、R2(低)为乘数
;出口:R7(最高)、R6、R5、R4(最低)BCD码形式的积
;《MCS-51系列单片机实用子程序集锦》Page 70
;-----------------------------------------------------
DUBCDM:
PUSH PSW
SETB PSW.3
CLR PSW.4
mov r1,RES_1 ;被乘数高位(BCD码)
mov r0,RES_2 ;被乘数低位(BCD码)
mov r3,RES_3 ;乘数高位(BCD码)
mov r2,RES_4 ;乘数低位(BCD码)
CLR A ;积单元清零
MOV R7,A
MOV R6,A
MOV R5,A
MOV R4,A
MOV 21H,R3
MOV A,R3 ;乘数高位入A
JZ LL ;乘数高位是否为0?
ANL A,#0F0H ;取R3高四位
JZ HN ;R3高四位是否为0?
SWAP A
ACALL DDUBCD
ACALL LSTBCD
HN:
MOV A,21H
ANL A,#0FH ;取R3低四位
JZ LL1 ;R3低四位是否为0?
ACALL DDUBCD
LL1: ACALL LSTBCD
LL: MOV A,R2 ;乘数低位人A
JZ RETURN ;乘数低位是否为0?
ANL A,#0F0H ;取R2高四位
JZ LN1 ;R2高四位是否为0?
SWAP A
ACALL DDUBCD
LN1: ACALL LSTBCD
LN: MOV A,R2 ;乘数低位人A
ANL A,#0FH ;取R2低四位
JZ RETURN ;R2低四位是否为0?
ACALL DDUBCD
RETURN:
MOV RES_D,R7 ;存乘积
MOV RES_C,R6
MOV RES_B,R5
MOV RES_A,R4
POP PSW
RET
;------------------------------------------------
;一位BCD码乘法子程序
;------------------------------------------------
DDUBCD:
MOV R3,A
LP0: MOV A,R4
ADD A,R0
DA A
MOV R4,A
MOV A,R5
ADDC A,R1
DA A
MOV R5,A
MOV A,R6
ADDC A,#00H
DA A
MOV R6,A
MOV A,R7
ADDC A,#00H
DA A
MOV R7,A
DJNZ R3,LP0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -