?? 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 + -