📄 text2_xicor9241.asm
字号:
;*********************************************************
;*
;* 80C31 MICROCONTROLLER ROUTINES FOR MANIPULATING AN X9241
;* QUAD EEPOT
;*
;* (C) XICOR INC. 1993
;* GHC IV
;*********************************************************
SDA BIT P0.0
SCL BIT P0.1
ACK BIT 00H
TEMP EQU R1 ;* SCRATCH REGISTER
COUNT EQU R2 ;* LOOP COUNTING REGISTER
PULSES EQU R3 ;* BITS -> DIR X###### (# = 1 or 0)
COMMAND EQU R4 ;* INSTRUCTION (I.E. 0,4,8,12,16,...)
ID EQU R5 ;* BITS -> 0 0 0 0 P1 P0 R1 R0
ADDR_BYTE EQU R6 ;* BITS -> 0 1 0 1 A3 A2 A1 A0
DATA_BYTE EQU R7 ;* BITS -> CM DW D5 D4 D3 D2 D1 D0
TEMP1 EQU 40H
DATA0 EQU 41H
DATA1 EQU 42H
DATA2 EQU 43H
DATA3 EQU 44H
BITCNT EQU 46H ;I2C位计数器
BYTECNT EQU 47H ;数据字节长度计数器
SLVADR EQU 48H ;从机寻址字节
RCVDAT EQU 49H ;IIC接收数据缓冲区
XMTDAT EQU 4AH ;IIC发送数据缓冲区
ORG 0000H
JMP MAIN
MAIN:
MOV R2,#0FFH
DJNZ R2,$
LOOP: MOV TEMP1,#80H
MOV DATA0,#80H
MOV DATA1,#0C0H
MOV DATA2,#0C0H
MOV DATA3,#0C0H
CALL X9241_INI
LOOP0: CALL D20MS
CALL D20MS
CALL D20MS
CALL START
MOV A,#50H
CALL SENDBYTE
MOV A,#0A0H
CALL SENDBYTE
MOV A,TEMP1
CALL SENDBYTE
CALL STOP
INC TEMP1
MOV A,TEMP1
CJNE A,#0C0H,LOOP0
MOV TEMP1,#80H
MOV DATA0,#0C0H
MOV DATA1,#80H
MOV DATA2,#0C0H
MOV DATA3,#0C0H
CALL X9241_INI
LOOP1: CALL D20MS
CALL D20MS
CALL D20MS
CALL START
MOV A,#50H
CALL SENDBYTE
MOV A,#0A4H
CALL SENDBYTE
MOV A,TEMP1
CALL SENDBYTE
CALL STOP
INC TEMP1
MOV A,TEMP1
CJNE A,#0C0H,LOOP1
MOV TEMP1,#80H
MOV DATA0,#0C0H
MOV DATA1,#0C0H
MOV DATA2,#80H
MOV DATA3,#0C0H
CALL X9241_INI
LOOP2: CALL D20MS
CALL D20MS
CALL D20MS
CALL START
MOV A,#50H
CALL SENDBYTE
MOV A,#0A8H
CALL SENDBYTE
MOV A,TEMP1
CALL SENDBYTE
CALL STOP
INC TEMP1
MOV A,TEMP1
CJNE A,#0C0H,LOOP2
MOV TEMP1,#80H
MOV DATA0,#0C0H
MOV DATA1,#0C0H
MOV DATA2,#0C0H
MOV DATA3,#80H
CALL X9241_INI
LOOP3: CALL D20MS
CALL D20MS
CALL D20MS
CALL START
MOV A,#50H
CALL SENDBYTE
MOV A,#0ACH
CALL SENDBYTE
MOV A,TEMP1
CALL SENDBYTE
CALL STOP
INC TEMP1
MOV A,TEMP1
CJNE A,#0C0H,LOOP3
MOV TEMP1,#80H
JMP LOOP
SJMP $
;******************X9241初始化子程序*******************
X9241_INI:
;*****************WCR0*****************
CALL START
MOV A,#50H ;器件地址50H
CALL SENDBYTE
MOV A,#0A0H ;命令字,对WCR0写数据
CALL SENDBYTE
MOV A,DATA0 ;数据字:串联,滑动端正常联到引脚
CALL SENDBYTE ;滑动端位置为0
CALL STOP
;*****************WCR1*****************
CALL START
MOV A,#50H ;器件地址50H
CALL SENDBYTE
MOV A,#0A4H ;命令字,对WCR1写数据
CALL SENDBYTE
MOV A,DATA1 ;数据字:串联,滑动端悬浮
CALL SENDBYTE
CALL STOP
;*****************WCR2*****************
CALL START
MOV A,#50H ;器件地址50H
CALL SENDBYTE
MOV A,#0A8H ;命令字,对WCR2写数据
CALL SENDBYTE
MOV A,DATA2 ;数据字:串联,滑动端悬浮
CALL SENDBYTE
CALL STOP
;*****************WCR3*****************
CALL START
MOV A,#50H ;器件地址50H
CALL SENDBYTE
MOV A,#0ACH ;命令字,对WCR3写数据
CALL SENDBYTE
MOV A,DATA3 ;数据字:串联,滑动端悬浮
CALL SENDBYTE
CALL STOP
RET
;***************延时子程序****************
D20MS: MOV R6,#14H ;20MS
D201: ACALL D1MS
DJNZ R6,D201
RET
D1MS: MOV R7,#0C7H ;1MS,1T
DD1: NOP ;1T
NOP ;1T
NOP ;1T
DJNZ R7,DD1 ;2T
RET ;2T
D250MS: MOV R5,#0CH ;250MS
DD2: ACALL D20MS
DJNZ R5,DD2
RET
D500MS: MOV R5,#19H ;500MS
DD3: ACALL D20MS
DJNZ R5,DD3
RET
D400MS: MOV R5,#16H ;400MS
DD4A: ACALL D20MS
DJNZ R5,DD3
RET
D1S: MOV R5,#32H ;1S
DD4: ACALL D20MS
DJNZ R5,DD4
RET
D1M: MOV R6,#20H ;32S
D1MA: LCALL D1S
DJNZ R6,D1MA
RET
D2S: MOV R5,#64H ;2S
DD5: ACALL D20MS
DJNZ R5,DD5
RET
D80MS: MOV R3,#50H ;20MS软件延时程序
DD1B: ACALL D1MS
DJNZ R3,DD1B ;喂狗
RET
D6S: MOV R5,#0A0H
DD2A: ACALL D20MS
DJNZ R5,DD2A
RET
;**************延时子程序结束*************
;***************发送数据程序*************
INPUT: MOV SLVADR,A
MOV BYTECNT,#1
ACALL RCVDATA
RET
OUTPUT: MOV SLVADR,A
MOV BYTECNT,#1
;MOV XMTDAT,#0AAH
ACALL SENDDATA
RET
SENDDATA: ACALL START
MOV A,SLVADR
ACALL SENDBYTE
JB F0,SENDRETURN
MOV R0,#XMTDAT
SENTNEXT: MOV A,@R0
ACALL SENDBYTE
JB F0,SENDRETURN
INC R0
DJNZ BYTECNT,SENTNEXT
ACALL STOP
DELAY10: MOV R7,#30H
D1: MOV R6,#34H
D2: DJNZ R6,D2
DJNZ R7,D1
SENDRETURN: RET
;****************接收数据程序*************
;
RCVDATA: ACALL START
MOV A,SLVADR
SETB ACC.0
ACALL SENDBYTE
JB F0,RCVRETURN
CLR ACK
MOV R0,#RCVDAT
DJNZ BYTECNT,RCVNEXT
SJMP RCVLAST
RCVNEXT: ACALL RCVBYTE
MOV @R0,A
INC R0
DJNZ BYTECNT,RCVNEXT
RCVLAST: SETB ACK
ACALL RCVBYTE
MOV @R0,A
ACALL STOP
RCVRETURN: RET
;***************虚拟IIC子程序**********
;
START: SETB SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
CLR SCL
RET
;
STOP: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
NOP
RET
SENDBYTE: MOV BITCNT,#08H
SENDB: RLC A
JC SEND1
CLR SDA
SJMP SEND
SEND1: SETB SDA
NOP
SEND: NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
DJNZ BITCNT,SENDB
NOP
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR F0
JNB SDA,ACKEND
SETB F0
ACKEND: NOP
CLR SCL
RET
;
RCVBYTE: SETB SDA
MOV BITCNT,#08H
RCV: NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
CLR C
JNB SDA,RCV0
SETB C
RCV0: RLC A
NOP
NOP
DJNZ BITCNT,RCV
CLR SCL
NOP
NOP
NOP
CLR SDA
JNB ACK,SENDACKB
SETB SDA
SENDACKB: NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
CLR ACK
RET
;****************虚拟IIC子程序结束*************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -