📄 edit77.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 + -