;-----------------------;向93C46写"1"(起始位 子程序
INSB: SETB CS ;置片选无效
NOP
CLR SK ;时钟置低
NOP
SETB SD
NOP
NOP
NOP
NOP
CLR CS ;置片选有效
NOP
NOP
NOP
NOP
SETB SK ;时钟置高,移入数据
NOP
NOP
NOP
NOP
CLR SK
RET
;-----------------------;向93C46送8位数据子程序
WR1: MOV R4,#8 ;写入的数据位数
W10: RLC A
NOP
NOP
MOV SD,C ;将CY输入DI
NOP
NOP
NOP
NOP
SETB SK ;时钟置高,移入数据
NOP
NOP
NOP
NOP
CLR SK ;时钟置低
NOP
NOP
DJNZ R4,W10 ;未写完,继续
RET
;-----------------------;从DE引脚读取8位数据子程序
;入口:A(存放DE引脚输出的8位串行数据
RD1: MOV R4,#8 ;读取的数据位数
R10: NOP
NOP
NOP
NOP
SETB SK ;时钟置高,移出数据
NOP
NOP
NOP
NOP
CLR SK
NOP
NOP ;时钟置低
MOV C,SD ;数据从DO读入CY
RLC A
DJNZ R4,R10 ;未读完,继续
RET
;----------------;写数据:入口:B(存放要写入的8位指令:两位操作码,6位地址码A5~A0
; R2(存入写入数据的高8位 ,R3(存入写入数据的低8位
WRITE: LCALL INSB ;写允许指令
MOV A,B
ANL A,#30H ;
LCALL WR1
LCALL INSB ;写入指令
MOV A,B
ORL A,#40H
LCALL WR1
MOV A,R2 ;写入高位字节
LCALL WR1
MOV A,R3 ;写入低位字节
LCALL WR1
SETB CS ;置片选无效
NOP
NOP
NOP
NOP
CLR CS ;片选有效
NOP
NOP
NOP
NOP
SETB SD
NOP
NOP
NOP
NOP
WAIT: JNB SD,WAIT ;编程未完,等待
LCALL INSB ;写禁止指令
MOV A,#0
LCALL WR1
SETB CS ;置片选无效
RET
;-----------------------;读16位串行数据,入口参数:B(2位操作码,6位地址码
;出口参数:R2(存放从DE引脚读取的串行数据的高8位
; R3(存放从DE引脚读取的串行数据的低8位
READ: LCALL INSB ;写读取指令
MOV A,B
ORL A,#80H
LCALL WR1
NOP
NOP
NOP
NOP
LCALL RD1
MOV R2,A ;读出高位字节
LCALL RD1
MOV R3,A ;读出胝位字节
SETB CS ;置片选无效
RET