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

📄 edit77.asm

📁 DSP2000 语言写的93C46程序
💻 ASM
字号:
	;***********************变量定义*************************************
;		variable_def
COMFLAG 			.EQU 0200H	
WRITEADDRESS		.EQU 0201H	
WRITEDATA			.EQU 0202H	
WRITENUM 			.EQU 0203H	
SHIFTINDEX	        .EQU 0204H	
READADDRESS			.EQU 0205H	
READDATA			.EQU 0206H
READNUM				.EQU 0207H
SUB15INDEX			.EQU 0208H
GPR0				.EQU 0209H
WRITEADDRESS1		.EQU 020AH
READADDRESS1		.EQU 020BH      
HEAD				.EQU 023BH
;******************************************************************
;建立中断向量表
		.sect		".vectors"	;定义主向量段	
RSVECT		B		START

;*********************************************************************
		.include	"240X.H"  																																													
		
;=====================================================================
;主程序
;=====================================================================
		.text
START:
		LDP		#0
		SETC 		INTM
		CLRC 		SXM 			;Clear Sign Extension Mode
		CLRC 		OVM 			;Reset Overflow Mode
		CLRC 		CNF 			;Config Block B0 to Data mem.
		 					;Disable interrupts during initialization.
		LDP		#0E0H                                      		
      	SPLK	#02FDH,SCSR1		;CLKIN=15M,CLKOUT=30M			
		SPLK	#06FH,WDCR	   ;禁止WDT 
		LDP		#0H                                    
		SPLK		#0000H,IMR     
		LDP	#0E1H
		SPLK	#0FF03H,MCRB
		SPLK	#0FBFBH,PCDATDIR     
		;SPLK	#0011,1000,0000,0000,PCDATDIR
		LDP	#4 
		SPLK	#20H,WRITEADDRESS
		SPLK	#20H,WRITEADDRESS1
		SPLK	#56H,WRITEDATA
		SPLK	#0H,WRITENUM         
		SPLK	#0H,COMFLAG            
WR93C46:			
		LDP	#4			
		LACL	COMFLAG
		BCND	EWEN,EQ				;ACC=0,即COMFLAG=0,JUMP TO EWEN
		SUB	#1
		BCND	ERASE,EQ			;ACC=0,即COMFLAG=1,JUMP TO ERASE
		SUB	#1
		BCND	WRITE,EQ			;ACC=0,即COMFLAG=2,JUMP TO WRITE
EWDS:		
		SPLK	#100000000B,WRITEADDRESS	;COMFLAG=3,EWDS
		B	COMJUDGEEND		
EWEN:		
		SPLK	#100110000B,WRITEADDRESS
		B	COMJUDGEEND
ERASE:		
		LACL	WRITEADDRESS1
		OR	#111000000B
		SACL	WRITEADDRESS		;在地址上附加擦指令
		B	COMJUDGEEND
WRITE:	
;		B      	FAILRD
		LACL	WRITEADDRESS1		
		OR	#101000000B		;在地址上附加写指令
		SACL	WRITEADDRESS
COMJUDGEEND:	
		SPLK	#7,SHIFTINDEX		;因为各命令地址是8位的,bit7-0,顾令SHIFTINDEX初值为7,
 						;输出的时候是从第15-7=8位开始的
        	LT	SHIFTINDEX		;SHIFTINDEX->TREG
		LDP	#PCDATDIR>>7
		LACC	#00100000B
		OR	PCDATDIR
		SACL	PCDATDIR		;将CS置1(IOPC5=1)

		LACC	#1111111111101111B
		AND	PCDATDIR
		SACL	PCDATDIR		;将SK置低(IOPC4=0)		

SENDADDRESSWR:	
		LDP	#WRITEADDRESS>>7			
		BITT	WRITEADDRESS
		BCND	SETDIWR,TC		;TC=1,JUMP TO SETDIWR

CLRDIWR:	
		LACC	#1111111111110111B
		LDP	#PCDATDIR>>7
		AND	PCDATDIR
		SACL	PCDATDIR		;将DI置0(TC=0,即被检测的地址位为0)
		B	DIFINISHWR
SETDIWR:	
		LACC	#1000B
		LDP	#PCDATDIR>>7
		OR	PCDATDIR	
		SACL	PCDATDIR		;将DI置1(TC=1,即被检测的地址位为1)
DIFINISHWR:	RPT	#60			;延迟2微秒
		NOP
	
		LACC	#00010000B
		LDP	#PCDATDIR>>7
		OR	PCDATDIR
		SACL	PCDATDIR		;将SK置高(IOPC4=1)

		RPT	#60			;延迟2微秒
		NOP

		LACC	#1111111111101111B
		LDP	#PCDATDIR>>7
		AND	PCDATDIR
		SACL	PCDATDIR		;将SK置低(IOPC4=0)

		LDP	#SHIFTINDEX>>7				
		LACL	SHIFTINDEX
		ADD	#1
		SACL	SHIFTINDEX
		LT	SHIFTINDEX
		SUB	#15
		BCND	SENDADDRESSWR,LEQ	;ACC<=0,即SHIFTINDEX<=15,地址位还没检测输出完,jump to sendaddress
		                                ;ACC>=0,地址位均检测输出完成,
		LACL	COMFLAG                
		SUB	#2
		BCND	DELAY1,NEQ		;ACC/=0,不是写命令,跳到DELAY1
						;ACC=0,是写命令,下面开始向eeprom输出要写入的数据
		SPLK	#0,SHIFTINDEX		;在senddata前还要把shiftindex重新附初值为0,因为数据是16位的,bit15-0
		LT	SHIFTINDEX

SENDDATA:	
		BITT	WRITEDATA
		BCND	SETDIWRD,TC		;TC=1,JUMP TO SETDIWRD
						;TC=0,CLRDIWRD
CLRDIWRD:	
		LACC	#1111111111110111B
		LDP	#PCDATDIR>>7
		AND	PCDATDIR
		SACL	PCDATDIR		;将DI置0(IOPC3=0)
		B	DIFINISHWRD	
SETDIWRD:	
		LACC	#1000B
		LDP	#PCDATDIR>>7
		OR	PCDATDIR
		SACL	PCDATDIR		;将DI置1(IOPC3=1)

DIFINISHWRD:	
		RPT	#60			;延迟2微秒
		NOP
		
		LACC	#00010000B
		LDP	#PCDATDIR>>7
		OR	PCDATDIR
		SACL	PCDATDIR		;将SK置高(IOPC4=1)

		RPT	#60			;延迟8微秒
		NOP

		LACC	#1111111111101111B
		LDP	#PCDATDIR>>7
		AND	PCDATDIR	
		SACL	PCDATDIR		;将SK置低(IOPC4=0)

		LDP	#SHIFTINDEX>>7				
		LACL	SHIFTINDEX
		ADD	#1
		SACL	SHIFTINDEX
		LT	SHIFTINDEX
		SUB	#15
		BCND	SENDDATA,LEQ		;ACC<=0,即SHIFTINDEX<=15,16位数据尚未输出完,jump to senddata
						;acc>0,即数据输出完成,继续向下执行
						;在执行其他命令前cs需要至少250ns的低电平,程序才能正常
DELAY:	LDP	#PCDATDIR>>7
		LACC	#1111111111011111B
		AND	PCDATDIR
		SACL	PCDATDIR		;将CS置0(IOPC5=0)
		LDP	#4
		SPLK	#0FFFFH,SHIFTINDEX
		RPT		SHIFTINDEX
		NOP
		RPT		SHIFTINDEX
		NOP
		RPT		SHIFTINDEX
		NOP
		RPT		SHIFTINDEX
		NOP
		LDP	#COMFLAG>>7
		SPLK	#1,COMFLAG
		LACL	WRITEADDRESS1
		ADD	#1
		SACL	WRITEADDRESS1
		LACL	WRITEDATA
		ADD	#1
		SACL	WRITEDATA
		LACL	WRITENUM
		ADD	#1
		SACL	WRITENUM
		SUB	#8			;写入8段速度
		BCND	WR93C46,LEQ
		B       FAILRD
DELAY1:
		LDP	#PCDATDIR>>7
		LACC	#1111111111011111B
		AND	PCDATDIR
		SACL	PCDATDIR		;将CS置0(IOPC5=0)
		LDP	#4
		SPLK	#0FFFFH,SHIFTINDEX
		RPT		SHIFTINDEX
		NOP
		RPT		SHIFTINDEX
		NOP
		RPT		SHIFTINDEX
		NOP
		RPT		SHIFTINDEX
		NOP
		LDP	#COMFLAG>>7
		LACL	COMFLAG
		ADD	#1
		SACL	COMFLAG
		SUB	#2
		BCND	WR93C46,LEQ
		
;--------------------------------------------------------------	
;写93C46的子程序结尾
;==============================================================

;RDEEPROM	.MACRO
;==================================================================
;读93C46到映象的内存单元模块
;------------------------------------------------------------------
;变量
;READADDRESS		;输入的地址放在 READADDRESS 中,只有低7位有效
;READDATA		;数据输出放在 READDATA中
;READNUM		;读数据的计数器
;------------------------------------------------------------------
;常量
;READNUM_K	.SET	8	;读取8个数,放在HEAD及其以后的数据单元内
;------------------------------------------------------------------
;辅助寄存器AR6作间接寻址
;------------------------------------------------------------------
;调用子程序:RD93C46
;------------------------------------------------------------------
FAILRD:		
		LDP	#4			;200H-027FH
		SPLK	#0,READNUM
		SPLK	#0,READDATA
		MAR	*,AR6
		LAR	AR6,#HEAD
	    ;SPLK	#20H,READADDRESS
	    SPLK	#20H,READADDRESS1
NEXTNUM:CALL    RD93C46
		LDP	#4			;200H-027FH
		LACL	READDATA
		MAR	*,AR6
		SACL	*+
		
		LACL	READADDRESS1
		ADD 	#1
		;SACL	READADDRESS
		SACL	READADDRESS1
		LACL	READNUM
		ADD	#1
		SACL	READNUM
		SUB	#8
		BCND	NEXTNUM,LEQ		;读出八段速度
WAIT:
		NOP
		B		WAIT	
		
		
		
;------------------------------------------------------------------
;93C46读取结束
;==================================================================		
;==============================================================
;读93C46的子程序
;--------------------------------------------------------------
;输入量:READADDRESS,输入的地址,只有低7位有效
;--------------------------------------------------------------
;输出量:READDATA,数据输出		
;--------------------------------------------------------------
;中间变量:
;SHIFTINDEX,移位的计数标志
;SUB15INDEX,15-SHIFTINDEX
;程序中用到了T寄存器
;--------------------------------------------------------------
;其始位及读命令为110
;CS---IOPC5
;SK---IOPC4
;DI---IOPC3
;DO---IOPC2
;--------------------------------------------------------------
RD93C46:	
		LDP	#READDATA>>7			
		SPLK	#0,READDATA
		LACL	READADDRESS1
		OR	#110000000B		;在地址(A5-A0)上附加读指令(110)
		SACL	READADDRESS
		SPLK	#7,SHIFTINDEX		;同前面写93c46部分
		LT	SHIFTINDEX	
		
		LDP	#PCDATDIR>>7
		LACC	#00100000B
		OR	PCDATDIR
		SACL	PCDATDIR		;将CS置1,IOPC5=1
		
		LACC	#1111111111101111B
		AND	PCDATDIR
		SACL	PCDATDIR		;将SK置低,IOPC4=0     
		LDP	#PCDATDIR>>7
		LACC	#00010000B
		OR	PCDATDIR
		SACL	PCDATDIR		;将SK置高,IOPC4=1

		RPT	#60		;延迟8微秒
		NOP

		LACC	#1111111111101111B
		LDP	#PCDATDIR>>7
		AND	PCDATDIR
		SACL	PCDATDIR		;将SK置低,IOPC4=0

SENDADDRESSRD:	
		LDP 	#READADDRESS>>7
		BITT	READADDRESS		;测试的位由TREG决定,亦即由SHIFTINDEX决定
		BCND	SETDIRD,TC

CLRDIRD:	
		LDP	#PCDATDIR>>7
		LACC	#1111111111110111B
		AND	PCDATDIR
		SACL	PCDATDIR		;将DI置0,IOPC3=0
		B	DIFINISHRD
SETDIRD:	
		LDP	#PCDATDIR>>7
		LACC	#1000B
		OR	PCDATDIR
		SACL	PCDATDIR		;将DI置1,IOPC3=1
			
DIFINISHRD:	
		RPT	#60			;延迟2微秒
		NOP

		LDP	#PCDATDIR>>7
		LACC	#00010000B
		OR	PCDATDIR
		SACL	PCDATDIR		;将SK置高,IOPC4=1

		RPT	#60		;延迟8微秒
		NOP

		LACC	#1111111111101111B
		LDP	#PCDATDIR>>7
		AND	PCDATDIR
		SACL	PCDATDIR		;将SK置低,IOPC4=0
		
		LDP	#SHIFTINDEX>>7
		LACL	SHIFTINDEX
		ADD	#1
		SACL	SHIFTINDEX
		LT	SHIFTINDEX
		SUB	#15
		BCND	SENDADDRESSRD,LEQ	;同前写93c46部分的说明

		LDP	#SHIFTINDEX>>7
		SPLK	#0,SHIFTINDEX
		LT	SHIFTINDEX		

RECEIVEDATA:	
		RPT	#60		;延迟2微秒
		NOP   
		LDP	#PCDATDIR>>7
		LACC	#1111111111110111B
		AND	PCDATDIR
		SACL	PCDATDIR		;将DI置0,IOPC3=0
		
		LACC	#00010000B
		LDP	#PCDATDIR>>7
		OR	PCDATDIR
		SACL	PCDATDIR	;将SK置高,IOPC4=1

		RPT	#60		;延迟8微秒
		NOP
		
		LACC	#1111111111101111B
		LDP	#PCDATDIR>>7
		AND	PCDATDIR
		SACL	PCDATDIR	;将SK置低,IOPC4=0

		LDP	#PCDATDIR>>7
		BIT	PCDATDIR,BIT2;DO---IOPC2
		BCND	AZEROBIT,NTC	;若TC=0,即检测到DO=0,则jump to AZEROBIT,不加什么,否则先执行NZEROBIT部分
NZEROBIT:	
		LACC	#15
		LDP	#SHIFTINDEX>>7
		SUB	SHIFTINDEX
		SACL	SUB15INDEX
		LT	SUB15INDEX	;保存T
		ZAC
		SPLK	#1,GPR0
		ADDT	GPR0
		ADD	READDATA
		SACL	READDATA
		LT	SHIFTINDEX	;恢复T
		
AZEROBIT:	
		LDP	#SHIFTINDEX>>7
		LACL	SHIFTINDEX
		ADD	#1
		SACL	SHIFTINDEX
		LT	SHIFTINDEX
		SUB	#15
		BCND	RECEIVEDATA,LEQ	

		LDP	#PCDATDIR>>7
		LACC	#1111111111011111B
		AND	PCDATDIR
		SACL	PCDATDIR	;将CS置0,IOPC5=0
		RET
;--------------------------------------------------------------
;读93C46的子程序结尾
;==============================================================
  ;假中断程序
;=====================================================================

;*****************************************

⌨️ 快捷键说明

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