?? jisuan.asm
字號:
;/*******************************************************************************
;* 標(biāo)題: xl系列單片機實驗儀演示程序 矩陣鍵盤1602液晶顯示計算器 *
;* 日期: 2006-1-5 *
;* 版本: 3.0 (試驗通過版)可用xl600-xl1000單片機綜合試驗儀試驗 *
;* 郵箱: sxj1974@163.com *
;* 網(wǎng)站: http://www.51c51.com www.8951.com *
;********************************************************************************
;簡單的計算器演示程序 硬件連接:矩陣鍵盤接p1口1602液晶控制p2.0-2.2 液晶數(shù)據(jù)p0 *
;0-99之間的加、減、乘、除運算 *
; 0a鍵+ 0b鍵- 0c鍵* 0#鍵/ 0#鍵清除 00鍵 等于 *
;矩陣鍵盤定義: *
;P1.0-P1.3為列線,P1.4-P1.7為行線 *
;出口:A、R3存鍵值 *
;********************************************************************************
;* 【版權(quán)】 Copyright(C)深圳市學(xué)林電子有限公司 www.51c51.com *
;* 【聲明】 此程序僅用于學(xué)習(xí)與參考,引用請注明版權(quán)和作者信息! *
;* 【技術(shù)支持】請訪問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 ;輸入被加(減、乘、除)數(shù)
RES_L EQU 25H ;輸入加(減、乘、除)數(shù)
OUT_H EQU 26H ;運算結(jié)果高位
OUT_L EQU 27H ;運算結(jié)果低位
;-------------------------------
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 ;送被(加、減、乘、除)數(shù)
JNB 20H.0,LOOP ;鍵標(biāo)記
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 ;是,轉(zhuǎn)LOOP_2
MOV TEMP1,TEMP2
MOV A,TEMP1
MOV X,#1
CALL CONV0
MOV A,R3 ;恢復(fù)有效鍵值
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 ;加運算標(biāo)記
AJMP LOOP5
LOOP1: CJNE A,#0BH,LOOP2 ;減運算
CALL CONV2
SETB 20H.2 ;減運算標(biāo)記
AJMP LOOP5
LOOP2: CJNE A,#0CH,LOOP3 ;乘運算
CALL CONV3
SETB 20H.3 ;乘運算標(biāo)記
AJMP LOOP5
LOOP3: CJNE A,#0DH,LOOP4 ;除運算
CALL CONV4
SETB 20H.4 ;除運算標(biāo)記
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 ;送(加、減、乘、除)數(shù)
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 ;是,轉(zhuǎn)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 ;顯示運算結(jié)果
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 ;復(fù)位(清零)
AJMP MAIN
;------------------------
;加法運算子程序
;入口:R0-被加數(shù),R1-加數(shù)
;出口: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-被減數(shù),R1-減數(shù)
;出口:R2-差值
;------------------------
SUSUB:
MOV R1,RES_L
MOV R0,RES_H
CLR C
MOV A,#9AH
SUBB A,R1 ;減數(shù)十進(jìn)制求補
ADD A,R0
DA A
MOV R2,A ;差值送R2
JC POSI ;C=1,表示差值為正
NEGA: MOV A,#9AH ;差值為負(fù),求補后得差值的絕對值
SUBB A,R2
MOV R2,A
SETB 20H.5 ;顯示負(fù)號標(biāo)記
POSI: MOV OUT_H,#00H
MOV OUT_L,R2
CALL T_CONV
RET
;-------------------------
;乘法運算子程序
; 單字節(jié)BCD碼乘法子程序
;入口: R0(被乘數(shù))、R1(乘數(shù))
;出口: R3(高)、R2(低),積為雙字節(jié),BCD碼形式的積
;從乘數(shù)高位開始進(jìn)行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 ;取乘數(shù)高位
JZ LBCD ;乘數(shù)高位是否為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 ;取乘數(shù)低位
ANL A,#0FH
JZ RETURN ;乘數(shù)低位是否為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
;------------------------------------------------
;除法運算子程序
;單字節(jié)BCD碼除法
;入口:R0(被除數(shù))、R1(非零除數(shù))
;出口:R2(商)、R3(余數(shù))
;《MCS-51系列單片機實用子程序集錦》Page 73
;-----------------------------------------------
SUDIV:
MOV R1,RES_L
MOV R0,RES_H
BCDDIV:
MOV R2,#00H ;商單元清零
MOV A,R1 ;除數(shù)求補
CPL A
ADD A,#9BH
MOV R1,A
MOV A,R0 ;被除數(shù)高位移入
ANL A,#0F0H ;部分余單元
SWAP A
LP0: MOV R3,A ;做除法
ADD A,R1
DA A
JNC LP1 ;部分余數(shù)>=除數(shù)?
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -