?? 波形信號發生器程序.asm
字號:
AD0 EQU 30H
AD1 EQU 31H
AD2 EQU 32H
AD3 EQU 33H
AD4 EQU 34H
AD5 EQU 35H
AD6 EQU 36H
ADA EQU 4FH
ADB EQU 5FH
ADC EQU 4DH
ADDV EQU 5DH
;非壓縮的BCD碼轉換成十六數
BCDHEX : MOV 4CH,#00H
MOV 4DH,#00H
MOV 4EH,#10H
MOV 4FH,#00H
MOV R7,#04H
KL: MOV A,@R0
MOV @R1,A
INC R0
MOV A,@R0
SWAP A
ORL A,@R1
MOV @R1,A
INC R0
DEC R1
DJNZ R7,KL
NOP ; N BYTES COMPRESSED BCD CODES TO M BYTES HEX CODES
MOV 30H,#07H ; HERE N=M=3 BCD(4C,4D,4E,4FH)--HEX(5C,5D,5E,5FH)
MOV 31H,#07H
MOV R1,#ADB
MOV R2,AD1
MOV R3,AD0
MOV A,#ADA
CLR C
SUBB A,R3
INC A
MOV R0,A
DBNZ: MOV @R1,#00H
DEC R1
DJNZ R2,DBNZ
SJMP DBNB
DBNJ: MOV R1,#ADB
MOV R2,AD1
CLR 00H
CLR A
DBNM: XCH A,@R1
MOV B,#64H
MUL AB
MOV C,00H
ADDC A,@R1
MOV @R1,A
MOV 00H,C
MOV A,B
DEC R1
DJNZ R2,DBNM
DBNB: CLR A
XCHD A,@R0
XCH A,@R0
SWAP A
MOV B,#0AH
MUL AB
ADD A,@R0
INC R0
DBNA: MOV R2,AD1
DEC R2
MOV R1,#ADB
ADD A,@R1
MOV @R1,A
DBNL: DEC R1
CLR A
ADDC A,@R1
MOV @R1,A
DJNZ R2,DBNL
DJNZ R3,DBNJ
NOP
RET
;乘法子程序
MULNM: NOP ; N BYTES X M BYTES = N+M BYTES HERE N=4;M=4
MOV 30H,#07H ; (4C,4D,4E,4FH)*(5C,5D,5E,5FH)=(58--5FH)
MOV 31H,#08H
MULTT: MOV A,AD0
MOV R3,AD1
MOV R2,A
ADD A,R3
INC A
MOV AD2,A
MOV A,#ADB
CLR C
SUBB A,R3
MOV AD6,A
MOV R1,A
SUBB A,R2
MOV AD5,A
INC R2
MULNMZ: MOV @R1,#00H
DEC R1
DJNZ R2,MULNMZ
MULNMB: MOV R2,AD0
MOV R1,AD6
MOV R0,#ADA
CLR 00H
MULNML: MOV A,ADB
JZ MULNMD
MOV B,@R0
MUL AB
ADD A,@R1
MOV @R1,A
JNB 00H,MULNM1
INC B
MULNM1: MOV A,B
DEC R1
ADDC A,@R1
MOV @R1,A
MOV 00H,C
DEC R0
DJNZ R2,MULNML
MULNMD: MOV R0,AD5
CLR A
MOV R2,AD2
MULNMS: XCH A,@R0
INC R0
DJNZ R2,MULNMS
DJNZ R3,MULNMB
NOP
RET
;除法子程序
DIVD2: NOP ;2N BYTE / N BYTE = N BYTE ,HERE N=3 IN 31H
MOV 30H,#0CH ;(4A,4B,4C,4D,4E,4FH)/(5D,5E,5FH)=(4D,4E,4FH)
MOV 31H,#06H
DIVPP: MOV A,AD1
MOV R2,A
RL A
RL A
RL A
MOV R3,A
CLR 0F0H
CLR C
MOV A,#ADA
SUBB A,R2
MOV AD3,A
MOV R1,#ADB
DIVMB2B: MOV A,@R1
JNZ DIVM2B
DEC R1
DJNZ R2,DIVMB2B
SETB 0F0H
RET
DIVM2B: MOV R2,AD1
MOV R1,#ADB
MOV R0,AD3
DIVM2L: MOV A,@R0
SUBB A,@R1
DEC R0
DEC R1
DJNZ R2,DIVM2L
JNC DIVM20
DIVM2D: LCALL SHIL1
JC DIVM2S
DIVM2C: MOV R0,AD3
MOV R1,#ADB
MOV R2,AD1
DIVM2CL: MOV A,@R0
SUBB A,@R1
DEC R0
DEC R1
DJNZ R2,DIVM2CL
JC DIVM2E
DIVM2S: INC ADA
MOV R2,AD1
MOV R0,AD3
MOV R1,#ADB
LCALL SUBMBB
DIVM2E: DJNZ R3,DIVM2D
RET
DIVM20: SETB 0F0H
RET
SHIL1: MOV R2,AD0
MOV R0,#ADA
SHIL1B: CLR C
SHILL: MOV A,@R0
RLC A
MOV @R0,A
DEC R0
DJNZ R2,SHILL
RET
SUBMBB: CLR C
SUBMB1: MOV A,@R0
SUBB A,@R1
MOV @R0,A
DEC R0
DEC R1
DJNZ R2,SUBMB1
RET
;24C04讀寫程序
;寫程序
w24c02: PUSH PSW
SETB RS0
SETB RS1
LCALL WRNBYT
LCALL DELAY
POP PSW
RET
;讀程序
R24C02: MOV COMXSTART,#0B8H ;液晶清屏
MOV COMXEND, #0BFH
MOV COMYSTART,#40H
MOV COMYEND, #7FH
LCALL CLEAR1
LCALL RDNBYT
CLR P1.2
NOP
NOP
SETB P1.2
NOP
NOP
CLR P1.2
CLR P1.0
CLR P1.1
NOP
MOV P2,#01H ;W0
NOP
SETB P1.0
NOP
NOP
CLR P1.0
NOP
NOP
MOV A,50H ;W1
MOV P2,A
NOP
SETB P1.0
NOP
NOP
CLR P1.0
NOP
NOP
MOV A,51H ;W2
MOV P2,A
NOP
SETB P1.0
NOP
NOP
CLR P1.0
NOP
NOP
MOV A,52H ;W3
MOV P2,A
NOP
SETB P1.0
NOP
NOP
CLR P1.0
NOP
NOP
MOV A,53H ;W4
MOV P2,A
NOP
SETB P1.0
NOP
NOP
CLR P1.0
NOP
NOP
SETB P1.1
NOP
NOP
NOP
NOP
CLR P1.1
NOP
NOP
NOP
NOP
LJMP TSF0
WRNBYT: PUSH PSW ;現場保護
CLR RS0
SETB RS1 ;使用1區工作寄存器
MOV A, #08H ;寫數據子程序。
MOV R3, A
LCALL STA ;開始子程序
MOV A, #0A0H ;定控制字,準備發送
LCALL WRBYT ;發送控制字
LCALL CACK ;應答判斷子程序
JB FFF, RETWRN
MOV A, ADDR ;寫入24C02的地址指針。從0FH開始放數據。
LCALL WRBYT ;發送數據指針。
LCALL CACK ;查應答信號。
MOV R1, #DATA0 ;將40 H單元開始的數據寫入24CO2,總共8個數據。
WRDA: MOV A, @R1
LCALL WRBYT
LCALL CACK
JB FFF, WRNBYT
INC R1
DJNZ R3, WRDA
RETWRN: LCALL STOP
POP PSW
RET
RDNBYT: PUSH PSW ;現場保護
MOV PSW, #18H ;使用IV區工作寄存器
MOV R3, #08H
LCALL STA ;發送開始信號
MOV A, #0A0H ;定控制字,準備發送
LCALL WRBYT ;發送控制字
LCALL CACK ;采集應答信號。
JB FFF, RETRDN ;非應答則重發
MOV A, ADDR ;準備發送地址指針。
LCALL WRBYT ;發送數據。
LCALL CACK ;采集應答信號。
JB FFF, RDNBYT
LCALL STA ;從新發送開始信號。
MOV A, #0A1H ;準備發送數據令R/W=‘1’。
LCALL WRBYT ;發送
LCALL CACK ;采樣應答信號
JB FFF, RDNBYT
MOV R1, #DATA1 ;設置采集數據保存單元。
RDN1: LCALL RDBYT
MOV @R1, A
DJNZ R3, SACK
LCALL MNACK
SJMP RETRDN
SACK: LCALL MACK
INC R1
SJMP RDN1
RETRDN: LCALL STOP
POP PSW
RET
;啟動I2C總線子程序
STA: SETB SDA
NOP
SETB SCL ;起始條件建立時間大于4.7uS
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP ;起始條件鎖定時大于4uS
NOP
NOP
NOP
NOP
CLR SCL ;鎖住總線,整備發數據
NOP
RET
;結束總線子程序
STOP: CLR SDA
NOP
SETB SCL ;發送結束條件的時鐘信號
NOP ;結束總線時間大于4uS
NOP
NOP
NOP
NOP
SETB SDA ;結束總線
NOP ;保證一個終止信號和起始信號的空閑時間大于4.7uS
NOP
NOP
CLR SCL
RET
;發送應答信號子程序
MACK: CLR SDA ;將SDA置0
NOP
NOP
SETB SCL
NOP ;保持數據時間,即SCL為高時間大于4.7uS
NOP
NOP
NOP
NOP
CLR SCL
NOP
SETB SDA
RET
;發送非應答信號子程序
MNACK: SETB SDA ;將SDA置1
NOP
NOP
SETB SCL
NOP
NOP ;保持數據時間,即SCL為高時間大于4.7uS
NOP
NOP
NOP
CLR SCL
RET
;檢查應答位子程序
;在FFF=0時表示有應答
CACK: SETB SDA
NOP
NOP
SETB SCL
CLR FFF
NOP
NOP
MOV C, SDA
JNC CEND
SETB FFF ;用用戶位做判斷應答位
CEND: NOP
CLR SCL
NOP
RET
;發送字節子程序
;字節數據放入ACC
;每發送一字節要調用一次CACK子程序,取應答位
WRBYT: MOV R0, #08H
WLP: RLC A ;取數據位
JC WR1
LJMP WR0 ;判斷數據位
WLP1: DJNZ R0, WLP
NOP
RET
WR1: SETB SDA ;發送1
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
LJMP WLP1
WR0: CLR SDA ;發送0
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
LJMP WLP1
;讀取字節子程序
;讀出的值在ACC
;每取一字節要發送一個應答/非應答信號
RDBYT: MOV R0, #08H
RLP: SETB SDA
NOP
SETB SCL ;時鐘線為高,接收數據位
NOP
NOP
MOV C, SDA ;讀取數據位
MOV A, R2
CLR SCL ;將SCL拉低,時間大于4.7uS
RLC A ;進行數據位的處理
MOV R2, A
NOP
NOP
NOP
DJNZ R0, RLP ;未夠8位,再來一次
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -