?? 源程序.asm
字號:
;//////////////////////////////////////////////////
;////////////////////////////////////////////AD轉換
AD:
29
MOV DPTR,#7F00H ;指向轉換地址
MOV A,#03H ;指向轉換口
MOVX @DPTR,A ;轉換
MOV R1,#64H
D1: DJNZ R1,D1 ;等100微秒轉換完
MOVX A,@DPTR ;轉換后的值給A
MOV ADNUMBER,A ;轉換的值給30H
RET
;//////////////////////////////////////////////////
;拆分AD值程序//////////////////////////////////////
CAIFEN:
MOV A,ADNUMBER
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
;顯示//////////////////////////////////////////////
DISPLAY:
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
30
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
MOV A,ADDJW
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D5: JNB TI,D5
CLR TI
MOV SBUF,#00H
D6: JNB TI,D6
CLR TI
RET
;//////////////////////////////////////////////////
;加法程序//////////////////////////////////////////
ADD1:
CLR C
MOV ADDTOTAL,ADNUMBER
MOV A,ADNUMBER
ADDC A,ADDHOLD
MOV ADDHOLD,A
JNC ADDJW1
INC ADDJW
31
ADDJW1: ANL A,#0FH
MOV DISL,A ;加值取低位
MOV A,ADDHOLD
ANL A,#0F0H
SWAP A
MOV DISH,A ;加值取高位
RET
;///////////////////////////////////////////////
DELAY: ;延時
MOV R3,#0AH
DD1: MOV R1,#0FFH
D2 : MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,D2
DJNZ R3,DD1
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
END
7.32 求六位和中的最大值和最小值(數碼顯示)
程序實例(add61.asm):
ORG 0000H
MAIN:
ADNUMBER EQU 30H ;AD轉換值
ADL EQU 32H ;//
32
ADH EQU 33H ;ADL轉換高低位值
DISL EQU 34H ;//
DISH EQU 35H ;顯示高低位值
ADDTOTAL EQU 36H ;第一次AD轉換值
ADDJW EQU 37H ;加法進位數
ADDHOLD EQU 38H
ADDFLAG EQU 39H ;加標志
ENDFLAG EQU 40H
ADH1 EQU 41H ;AD中最大的值
ADL1 EQU 42H ;AD中最小的值
ADHOLDH EQU 43H
ADHOLDL EQU 44H ;求AD最大值與最小
值時AD的比較值,即以此兩個值為比較中轉
FOUR EQU 45H
SUB EQU 46H ;減去高低位后的值
JWHOLD EQU 47H ;保存進位值
;賦初值////////////////////////////////////////////
MOV ADDHOLD,#00H
MOV ADL,#00H
MOV ADH,#00H
MOV DISL,#00H
MOV DISH,#00H
MOV ADDJW,#00H
MOV ADDFLAG,#00H
MOV ENDFLAG,#00H
MOV ADDTOTAL,#00H
MOV ADH1,#00H
MOV ADL1,#00H
33
MOV ADHOLDH,#00H
MOV FOUR,#00H
MOV ADHOLDL,#00H
MOV JWHOLD,#00H
MOV SUB,#00H
;//////////////////////////////////////////////////
MAIN1:
ACALL DELAY
ACALL DELAY
ACALL AD ;取AD值
MAIN3: ACALL CAIFEN
ACALL DISPLAY ;顯示
ACALL DELAY
ACALL DELAY
;算最大值和最小值//////////////////////////////////
ACALL ADDH
ACALL ADDL
;//////////////////////////////////////////////////
;加和值顯示///////////////////////////////////////
ACALL ADD1
ACALL DISPLAY
;//////////////////////////////////////////////////
;判是否加到了6次///////////////////////////////////
INC ADDFLAG
MOV A,ADDFLAG
CJNE A,#06H,MAIN2
;/////////////////////////////////////////////////
ACALL DELAY
34
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL CAIFEN1 ;拆最小值
ACALL CAIFEN2 ;拆最大值
ACALL DISPLAY ;顯示最大值最小值
LOOP: AJMP LOOP
;判有沒有來新AD值,沒有顯示以前,有顯示現在的///////
MAIN2:
ACALL DELAY
ACALL AD
MOV A,ADNUMBER
CJNE A,ADDTOTAL,MAIN3
AJMP MAIN2
;//////////////////////////////////////////////////
;AD轉換////////////////////////////////////////////
AD: MOV DPTR,#7F00H ;指向轉換地址
MOV A,#03H ;指向轉換口
MOVX @DPTR,A ;轉換
MOV R1,#64H
D1: DJNZ R1,D1 ;等100微秒轉換完
MOVX A,@DPTR ;轉換后的值給A
MOV ADNUMBER,A ;轉換的值給30H
RET
;//////////////////////////////////////////////////
;拆分AD值程序//////////////////////////////////////
35
CAIFEN:
MOV A,ADNUMBER
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
;顯示//////////////////////////////////////////////
DISPLAY:
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
MOV A,ADDJW
MOV DPTR,#SETTAB
36
MOVC A,@A+DPTR
MOV SBUF,A
D5: JNB TI,D5
CLR TI
MOV A,FOUR
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D6: JNB TI,D6
CLR TI
RET
;////////////////////////////////////////////////
;加法程序////////////////////////////////////////
ADD1:
CLR C
MOV ADDTOTAL,ADNUMBER
MOV A,ADNUMBER
ADDC A,ADDHOLD
MOV ADDHOLD,A
JNC ADDJW1
INC ADDJW
ADDJW1: ANL A,#0FH
MOV DISL,A ;加值取低位
MOV A,ADDHOLD
ANL A,#0F0H
SWAP A
MOV DISH,A ;加值取高位
RET
37
;//////////////////////////////////////////////////
;AD值中的最大值////////////////////////////////////
ADDH:
MOV A,ADH1
CJNE A,#00H,ADDH1
MOV ADH1,ADNUMBER
AJMP RE
ADDH1: MOV A,ADNUMBER
CLR C
SUBB A,ADH1
JC RE
MOV ADH1,ADNUMBER
RE: RET
;//////////////////////////////////////////////////
;AD值中的最小值////////////////////////////////////
ADDL:
MOV A,ADL1
CJNE A,#00H,ADDL1
MOV ADL1,ADNUMBER
AJMP RE1
ADDL1: MOV A,ADNUMBER
CLR C
SUBB A,ADL1
JNC RE1
MOV ADL1,ADNUMBER
RE1: RET
;//////////////////////////////////////////////////
;分解AD最小值的個,十位////////////////////////////
38
CAIFEN1:
MOV A,ADL1
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADL1
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;/////////////////////////////////////////////
;分解AD最大值的個,十位///////////////////////
CAIFEN2:
MOV A,ADH1
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADH1
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV JWHOLD,ADDJW
MOV ADDJW,ADL
MOV FOUR,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
DELAY: ;延時
MOV R3,#0AH
39
DD1: MOV R1,#0FFH
D2 : MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,D2
DJNZ R3,DD1
RET
;//////////////////////////////////////////////////
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
END
7.33 求減去最大和最小值后的值(數碼顯示)
程序實例(add62.asm)
ORG 0000H
MAIN:
ADNUMBER EQU 30H ;AD轉換值
ADL EQU 32H ;//
ADH EQU 33H ;ADL轉換高低位值
DISL EQU 34H ;//
DISH EQU 35H ;顯示高低位值
ADDTOTAL EQU 36H ;第一次AD轉換值
ADDJW EQU 37H ;加法進位數
ADDHOLD EQU 38H
ADDFLAG EQU 39H ;加標志
ENDFLAG EQU 40H
ADH1 EQU 41H ;AD中最大的值
40
ADL1 EQU 42H ;AD中最小的值
ADHOLDH EQU 43H
ADHOLDL EQU 44H ;求AD最大值與最小
值時AD的比較值,即以此兩個值為比較中轉
FOUR EQU 45H
SUB EQU 46H ;減去高低位后的值
JWHOLD EQU 47H ;保存進位值
;賦初值///////////////////////////////////////////
MOV ADDHOLD,#00H
MOV ADL,#00H
MOV ADH,#00H
MOV DISL,#00H
MOV DISH,#00H
MOV ADDJW,#00H
MOV ADDFLAG,#00H
MOV ENDFLAG,#00H
MOV ADDTOTAL,#00H
MOV ADH1,#00H
MOV ADL1,#00H
MOV ADHOLDH,#00H
MOV FOUR,#00H
MOV ADHOLDL,#00H
MOV JWHOLD,#00H
MOV SUB,#00H
;//////////////////////////////////////////////////
MAIN1:
ACALL DELAY
ACALL DELAY
41
ACALL AD ;取AD值
MAIN3: ACALL CAIFEN
ACALL DISPLAY ;顯示
ACALL DELAY
ACALL DELAY
;算最大值和最小值//////////////////////////////////
ACALL ADDH
ACALL ADDL
;//////////////////////////////////////////////////
;加和值顯示///////////////////////////////////////
ACALL ADD1
ACALL DISPLAY
;/////////////////////////////////////////////////
;判是否加到了6次//////////////////////////////////
INC ADDFLAG
MOV A,ADDFLAG
CJNE A,#06H,MAIN2
;//////////////////////////////////////////////////
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL CAIFEN1 ;拆最小值
ACALL CAIFEN2 ;拆最大值
ACALL DISPLAY ;顯示最大值最小值
ACALL DELAY
42
ACALL DELAY
ACALL JIAN1 ;呼叫減最大值最小
值程序
ACALL CAIFEN3 ;拆分
ACALL DISPLAY ;顯示減去最大值最
小值后的值
ACALL DELAY
ACALL DELAY
ACALL DELAY
LOOP: AJMP LOOP
;判有沒有來新AD值,沒有顯示以前,有顯示現在的///
MAIN2:
ACALL DELAY
ACALL AD
MOV A,ADNUMBER
CJNE A,ADDTOTAL,MAIN3
AJMP MAIN2
;/////////////////////////////////////////////////
;AD轉換///////////////////////////////////////////
AD:
MOV DPTR,#7F00H ;指向轉換地址
MOV A,#03H ;指向轉換口
MOVX @DPTR,A ;轉換
MOV R1,#64H
D1: DJNZ R1,D1 ;等100微秒轉換完
MOVX A,@DPTR ;轉換后的值給A
MOV ADNUMBER,A ;轉換的值給30H
RET
43
;//////////////////////////////////////////////////
;拆分AD值程序//////////////////////////////////////
CAIFEN:
MOV A,ADNUMBER
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
;顯示//////////////////////////////////////////////
DISPLAY:
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
44
MOV A,ADDJW
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D5: JNB TI,D5
CLR TI
MOV A,FOUR
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D6: JNB TI,D6
CLR TI
RET
;/////////////////////////////////////////////
;加法程序/////////////////////////////////////
ADD1:
CLR C
MOV ADDTOTAL,ADNUMBER
MOV A,ADNUMBER
ADDC A,ADDHOLD
MOV ADDHOLD,A
JNC ADDJW1
INC ADDJW
ADDJW1:
ANL A,#0FH
MOV DISL,A ;加值取低位
MOV A,ADDHOLD
ANL A,#0F0H
45
SWAP A
MOV DISH,A ;加值取高位
RET
;/////////////////////////////////////////////////
;AD值中的最大值///////////////////////////////////
ADDH:
MOV A,ADH1
CJNE A,#00H,ADDH1
MOV ADH1,ADNUMBER
AJMP RE
ADDH1: MOV A,ADNUMBER
CLR C
SUBB A,ADH1
JC RE
MOV ADH1,ADNUMBER
RE: RET
;//////////////////////////////////////////////////
;AD值中的最小值////////////////////////////////////
ADDL:
MOV A,ADL1
CJNE A,#00H,ADDL1
MOV ADL1,ADNUMBER
AJMP RE1
ADDL1: MOV A,ADNUMBER
CLR C
SUBB A,ADL1
JNC RE1
MOV ADL1,ADNUMBER
46
RE1: RET
;//////////////////////////////////////////////////
;分解AD最小值的個,十位////////////////////////////
CAIFEN1:
MOV A,ADL1
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADL1
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;/////////////////////////////////////////////////
;分解AD最大值的個,十位///////////////////////////
CAIFEN2:
MOV A,ADH1
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADH1
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV JWHOLD,ADDJW
MOV ADDJW,ADL
MOV FOUR,ADH ;給顯示值
RET
47
;//////////////////////////////////////////////////
;分解減去最高位和最低位的數////////////////////////
CAIFEN3:
MOV A,SUB
ANL A,#0FH
MOV ADL,A
MOV A,SUB
ANL A,#0F0H
SWAP A
MOV ADH,A
MOV DISL,ADL
MOV DISH,ADH
RET
;//////////////////////////////////////////////////
;減去最高位和最低位////////////////////////////////
JIAN1:
MOV FOUR,#00H
MOV ADDJW,JWHOLD
MOV A,ADDHOLD ;取和值
CLR C
SUBB A,ADH1 ;SUBB最高位
JNC JIAN2
DEC ADDJW ;有進位,高位減一
JIAN2:
CLR C
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -