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

📄 4jisuan.asm

📁 基于51开发
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;/*******************************************************************************
;*  标题:  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 + -