;*******************************************************************
;* 当选择8 位结构时93C46 有7 条10 位的指令
;* 指令、地址和写入的数据在时钟信号SK 的上升沿时由DI 引脚输入
;* DO 引脚除了从器件读取据或在进行了写操作后查询准备/繁忙ready/busy 的器件工作状态外平常是高阻态的
;******************************************************************************************
;程序首先从89S51的 ADDR,WDM 读出欲写入93C46的地址和数据,然后再把写入的数据读出来
;存放在 RDM ,再把ADDR , RDM 同过四位数码管显示出来.
;-------------端口和存储单元的定义---------------
CS EQU P3.5 ;片选端
SK EQU P2.6 ;模拟时钟信号输出端
DI EQU P2.5 ;串行数据输出端
DO EQU P2.4 ;串行数据输入端
WDM EQU 51H ;欲写入数据存储单元
RDM EQU 50H ;读出存放于 89S51 RAM 的存储单元
ADDR EQU 42H ;欲写入93C46的地址
;------------------------------------------------
ORG 0000H
LJMP MAIN
ORG 0100H ;主程序
MAIN:
MOV ADDR,#20H ;欲写入的地址设置(可根据需要自行修改)
MOV WDM,#0ffH ;要写入的数据(可根据需要自行修改)
LCALL EWEN46 ;调用写允许子程序,93C46每次上电后在进行写操作前都要先写允许
LCALL WRITE ;调用写入子程序
LCALL READ ;调用读子程序
SJMP $
;*********************************************************************
;********************** 各功能子程序 *****************************
;*********************************************************************
;----------------------------------------------------
;发送高电平 1
;-----------------------------------------------------
HIGH46:
SETB DI
SETB SK
NOP
CLR SK
NOP
RET
;-----------------------------------------------------
;发送低电平 0
;-----------------------------------------------------
LOW46:
CLR DI
SETB SK
NOP
CLR SK
NOP
RET
;-------------------------------------------
;---------------------延时-------------------
DL2MS:
MOV R4,#8;
DD3:
MOV R5,#124
DJNZ R5,$
DJNZ R4,DD3
RET
;--------------------------------------------
;-----------------------------------------------------
;-------------------写操作允许子程序--------------------
;-----------------------------------------------------
EWEN46: ; ( 10011***** )
SETB CS ;启动93C46
NOP
LCALL HIGH46 ;1
LCALL LOW46 ;0
LCALL LOW46 ;0
LCALL HIGH46 ;1
LCALL HIGH46 ;1
LCALL LOW46 ;0
LCALL LOW46 ;0
LCALL LOW46 ;0
LCALL LOW46 ;0
LCALL LOW46 ;0
NOP
CLR CS ;93C46 进入休眠,降低功耗
RET
;-----------------------------------------------------------------
;------------向指定的地址中写入一个字节数据(八位)子程序---------
;-----------------------------------------------------------------
WRITE: ;101
SETB CS ;启动93C46
NOP
MOV A,ADDR ;把欲写入的数据的地址
LCALL HIGH46 ;1
LCALL LOW46 ;0
LCALL HIGH46 ;1
WR_ADDR: ;欲写入地址的设置,93C46的地址为 7 位
MOV C,ACC.6
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.5
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.4
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.3
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.2
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.1
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.0
MOV DI,C
SETB SK
NOP
CLR SK
NOP
WR_DAT: ;写入一个字节数据(8位)
MOV A,WDM
MOV C,ACC.7
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.6
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.5
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.4
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.3
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.2
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.1
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.0
MOV DI,C
SETB SK
NOP
CLR SK
NOP
LCALL DL2MS ;调用延时,等待DO空闲!!!
LCALL DL2MS
LCALL DL2MS
LLK: CLR CS ;93C46 进入休眠,降低功耗
RET
;-----------------------------------------------------------------
;-----------------------------------------------------
;----------从指定的地址中读出一个字节数据(八位)子程序
;-----------------------------------------------------
READ: ;110
SETB CS ;启动93C46
NOP
MOV A,ADDR ;把欲读出的数据的地址送给A
LCALL HIGH46
LCALL HIGH46
CLR DI
SETB SK
NOP
CLR SK
NOP
RD_ADDR: ;读出地址设置(7位地址)
MOV C,ACC.6
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.5
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.4
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.3
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.2
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.1
MOV DI,C
SETB SK
NOP
CLR SK
NOP
MOV C,ACC.0
MOV DI,C
SETB SK
NOP
CLR SK
NOP
RD_DAT: ;读出一个字节的数据
SETB SK
NOP
MOV C,DO
MOV ACC.7,C
CLR SK
NOP
SETB SK
NOP
MOV C,DO
MOV ACC.6,C
CLR SK
NOP
SETB SK
NOP
MOV C,DO
MOV ACC.5,C
CLR SK
NOP
SETB SK
NOP
MOV C,DO
MOV ACC.4,C
CLR SK
NOP
SETB SK
NOP
MOV C,DO
MOV ACC.3,C
CLR SK
NOP
SETB SK
NOP
MOV C,DO
MOV ACC.2,C
CLR SK
NOP
SETB SK
NOP
MOV C,DO
MOV ACC.1,C
CLR SK
NOP
SETB SK
NOP
MOV C,DO
MOV ACC.0,C
CLR SK
NOP
MOV RDM,A ;保存读出的数据到 RDM(22H)
CLR CS ;93C46 进入休眠,降低功耗
RET
;---------------------------------------------------------------------------
;-----------------------------------------------------
;-----------擦除所有单元子程序--------------------------
;-----------------------------------------------------
EARASE:
SETB CS ;启动93C46
NOP
LCALL HIGH46
LCALL LOW46
CLR DI
SETB SK
NOP
CLR SK
NOP
SETB DI
SETB SK
NOP
CLR SK
NOP
CLR DI
SETB SK
NOP
CLR SK
NOP
CLR DI
SETB SK
NOP
CLR SK
NOP
CLR DI
SETB SK
NOP
CLR SK
NOP
CLR DI
SETB SK
NOP
CLR SK
NOP
CLR DI
SETB SK
NOP
CLR SK
NOP
SETB DI
SETB SK
NOP
CLR SK
NOP
LCALL DL2MS ;调用延时,等待DO空闲!!!
LCALL DL2MS
LCALL DL2MS
LLL: CLR CS ;93C46 进入休眠,降低功耗
RET
;----------------------------------------------------------------------
END