📄 波形信号发生器程序.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 + -