📄 93c46.asm
字号:
CS_93C46 BIT P1.0
SK_93C46 BIT P1.1
DI_93C46 BIT P1.2
DO_93C46 BIT P1.3
BIT_CNT DATA 10H ;移位次数
BIT_SEND DATA 11H ;发送Bit数
DATSEND DATA 12H ;待发送数据缓存
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R7,#0
MOV R6,#0
LCALL ERAL ;把芯片的内容全部擦除
MOV R7,#10H ;读进10H的内容查看
LCALL READ
MOV A,R5
MOV P0,A ;显示R5的值
MOV A,R6
MOV P2,A ;显示R6的值
NOP ;在这里设置断点,查看读入内容应为R6=0FFH和R5=0FFH
;SJMP $
MOV R7,#10H ;把1234H写到10H中
MOV R6,#12H
MOV R5,#34H
LCALL WRITE
MOV R6,#00H
MOV R5,#00H ;改变R5、R6的值,以变和后面比较
MOV R7,#10H ;读进10H的内容查? ;sjMP $
LCALL READ
MOV A,R5
MOV P0,A ;显示R5的值
MOV A,R6
MOV P2,A ;显示R6的值
NOP ;在这里设置断点,查看读入内容应为R6=12H和R5=34H
;SJMP $
MOV R7,#10H ;把10H内容擦除
LCALL ERASE
MOV R7,#10H ;读进10H的内容查看
LCALL READ
MOV A,R5
MOV P0,A ;显示R5的值
MOV A,R6
MOV P2,A ;显示R6的值
NOP ;在这里设置断点,查看读入内容应为R6=0FFH和R5=0FFH
;SJMP $
MOV R6,#56H ;把5678H写到全部内存中
MOV R5,#78H
LCALL WRAL
MOV R6,#00H
MOV R5,#00H ;改变R5、R6的值,以变和后面比较
MOV R7,#10H ;读进10H的内容查看
LCALL READ
MOV A,R5
MOV P0,A ;显示R5的值
MOV A,R6
MOV P2,A ;显示R6的值
NOP ;在这里设置断点,查看读入内容应为R6=56H和R5=78H
SJMP $
;******************************************************************
;名称:读指令(READ指令)
;功能:把93C46中R7所指向的内存的资料读到R6(H),R5(L)
;******************************************************************
READ:
LCALL START_93C46
MOV DATSEND,#06H ;发送读操作指令
MOV BIT_SEND,#03H
LCALL SEND_DATA
MOV DATSEND,R7 ;发送写入地址
MOV BIT_SEND,#06H
LCALL SEND_DATA
SETB DO_93C46 ;准备读入资料
MOV BIT_CNT,#16
READ1:
SETB SK_93C46 ;产生一个时钟信号
SETB SK_93C46
CLR SK_93C46
CLR SK_93C46
NOP
MOV C,DO_93C46 ;读取DO的信息
MOV A,R5 ;移位保存
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV R6,A
DJNZ BIT_CNT,READ1
LCALL STOP_93C46
RET
;******************************************************************
;名称:写指令(WRITE指令)
;功能:把R6(H),R5(L)的资料写到93C46中R7所指向的内存中
;******************************************************************
WRITE:
LCALL WEN_93C46
LCALL START_93C46
MOV DATSEND,#05H ;发送写入操作指令
MOV BIT_SEND,#03H
LCALL SEND_DATA
MOV DATSEND,R7 ;发送写入地址
MOV BIT_SEND,#06H
LCALL SEND_DATA
MOV DATSEND,R6 ;发送写入资料
MOV BIT_SEND,#08H
LCALL SEND_DATA
MOV DATSEND,R5
MOV BIT_SEND,#08H
LCALL SEND_DATA
LCALL STOP_93C46
LCALL WDS_93C46
RET
;******************************************************************
;名称:写全部(WRAL指令)
;功能:把R6(H),R5(L)的资料写到93C46的全部内存中
;******************************************************************
WRAL:
LCALL WEN_93C46
LCALL START_93C46
MOV DATSEND,#11H ;发送写全部操作指令
MOV BIT_SEND,#05H
LCALL SEND_DATA
MOV DATSEND,#00H
MOV BIT_SEND,#04H
LCALL SEND_DATA
MOV DATSEND,R6 ;发送写全部资料(高位)
MOV BIT_SEND,#08H
LCALL SEND_DATA
MOV DATSEND,R5 ;发送写全部资料(低位)
MOV BIT_SEND,#08H
LCALL SEND_DATA
LCALL STOP_93C46
LCALL WDS_93C46
RET
;******************************************************************
;名称:START_93C46
;功能:片选93C46做好读/写资料的准备
;******************************************************************
START_93C46:
SETB DO_93C46
SETB DI_93C46
CLR SK_93C46
SETB CS_93C46
JNB DO_93C46,$ ;查询器件是否繁忙
SETB SK_93C46
CLR SK_93C46
CLR CS_93C46
CLR SK_93C46
CLR DI_93C46
SETB CS_93C46
RET
;******************************************************************
;名称:STOP_93C46
;功能:停止对93C46操作
;******************************************************************
STOP_93C46:
CLR SK_93C46
CLR DI_93C46
CLR CS_93C46
SETB DO_93C46
RET
;******************************************************************
;名称:WEN_93C46(EWEN指令)
;功能:93C46写允许
;******************************************************************
WEN_93C46:
LCALL START_93C46
MOV DATSEND,#04H ;发送开始位和写允许操作码,共3位
MOV BIT_SEND,#03H
LCALL SEND_DATA ;调用发送子程序
MOV DATSEND,#30H ;发送6位的指令操作码
MOV BIT_SEND,#06H
LCALL SEND_DATA
LCALL STOP_93C46
RET
;******************************************************************
;名称:WDS_93C46(EWDS指令)
;功能:93C46写禁止
;******************************************************************
WDS_93C46:
LCALL START_93C46
MOV DATSEND,#04H ;发送开始位和写禁止操作码,共3位
MOV BIT_SEND,#03H
LCALL SEND_DATA ;调用发送子程序
MOV DATSEND,#00H ;发送6位的指令操作码
MOV BIT_SEND,#06H
LCALL SEND_DATA
LCALL STOP_93C46
RET
;******************************************************************
;名称:ERASE(ERASE指令)
;功能:擦除93C46中R7所指向的地址的内容
;******************************************************************
ERASE:
LCALL WEN_93C46
LCALL START_93C46
MOV DATSEND,#07H ;发送擦除指令
MOV BIT_SEND,#03H
LCALL SEND_DATA
MOV DATSEND,R7
MOV BIT_SEND,#06H
LCALL SEND_DATA
LCALL STOP_93C46
LCALL WDS_93C46
RET
;******************************************************************
;名称:ERAL(ERAL指令)
;功能:擦除93C46所有内容
;******************************************************************
ERAL:
LCALL WEN_93C46
LCALL START_93C46
MOV DATSEND,#04H ;发送全部擦除指令
MOV BIT_SEND,#03H
LCALL SEND_DATA
MOV DATSEND,#20H
MOV BIT_SEND,#06H
LCALL SEND_DATA
LCALL STOP_93C46
LCALL WDS_93C46
RET
;******************************************************************
;名称:SEND_DATA
;功能:资料发送子程序,把待发送资料DATSEND的低BIT_SEND位送到DI上
;******************************************************************
SEND_DATA:
;因为为了使程序容易读懂,前面把要发送的内容
;直接送给DATSEND,而现在就要把DATSEND中无用
;的位去掉,把要发送的内容移到最高位来
MOV BIT_CNT,BIT_SEND
MOV A,#08H ;计算要移位的个数
CLR C
SUBB A,BIT_CNT
MOV BIT_CNT,A
JZ SEND_DATA2 ;如果发送的位数为8位,则不用移位,跳转
MOV A,DATSEND ;把要送出资料的移到DATSEND的最高位
SEND_DATA1:
RL A
DJNZ BIT_CNT,SEND_DATA1
JMP SEND_DATA3
SEND_DATA2:
MOV A,DATSEND ;把要送出的8位资料DATSEND传给A
;(只有8位资料都要送出时才执行这条指令)
SEND_DATA3:
MOV BIT_CNT,BIT_SEND
SEND_DATA4:
RLC A ;移位元送出BIT_SEND位资料
JC SEND_DATA5
CLR DI_93C46 ;发送0码
JMP SEND_DATA6
SEND_DATA5:
SETB DI_93C46 ;发送1码
NOP
NOP
SEND_DATA6:
SETB SK_93C46 ;产生移位元时钟信号
CLR SK_93C46
DJNZ BIT_CNT,SEND_DATA4
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -