⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cat93c46.asm

📁 MCS-51单片机实验 39个实用实验和源码
💻 ASM
字号:
;FOR  EAT598
;程序功能
;READ 	把R7指向地址的内容读入到R6(H),R5(L)
;WRITE 	把R6(H),R5(L)的内容写到R7指向地址上
;WRAL 	把R6(H),R5(L)的内容写到全部存储器上
;ERASE 	把R7指向地址的内容擦除
;ERAL 	把全部存储器的内容擦除
SK_93C46 	BIT P1.0
DI_93C46 	BIT P1.1
DO_93C46 	BIT P1.2
CS_93C46 	BIT P1.3
BIT_CNT 	EQU 10H
BIT_SEND 	EQU 11H
DATSEND 	EQU 12H
;******************************************************************
	ORG		0000H
	SJMP    MAIN
	ORG     0030H
MAIN:
	LCALL 	ERAL 	;把芯片的内容全部擦除
	MOV 	R7,#10H ;读出10H的内容查看
	LCALL 	READ
	NOP 			;在这里设置断点,查看读入内容应为R6=0FFH和R5=0FFH
	MOV 	R7,#10H ;把1234H写到10H中
	MOV 	R6,#12H
	MOV 	R5,#34H
	LCALL 	WRITE
	MOV 	R6,#00H
	MOV 	R5,#00H ;将R6和R5清0
	MOV 	R7,#10H ;读出10H的内容查看
	LCALL 	READ
	NOP             ;在这里设置断点,查看读入内容应为R6=12H和R5=34H
	MOV 	R7,#10H ;把10H内容擦除
	LCALL 	ERASE
	MOV 	R7,#10H ;读进10H的内容查看
	LCALL 	READ
	NOP
	MOV 	R6,#56H ;把5678H写到全部存储器中
	MOV 	R5,#78H
	LCALL 	WRAL
	MOV 	R6,#00H
	MOV 	R5,#00H ;将R6和R5清0
	MOV 	R7,#10H ;读进10H的内容查看
	LCALL	READ
	NOP             ;在这里设置断点,查看读入内容应为R6=56H和R5=78H
	JMP 	MAIN
;******************************************************************
;名称: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
;******************************************************************
;名称:读指令(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
;******************************************************************
;名称: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	
;******************************************************************
;名称: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	
END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -