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

📄 x5045.asm

📁 C8051F340、LM317、X5045中文手册 x5045驱动程序(51汇编)
💻 ASM
字号:
;X5045读写程序(51汇编)
WREN_INST  EQU 06H;对应的是WREN指令,设置写使能锁存器(使能写操作)
WRDI_INST  EQU 04H;对应的是WRDI指令,复位写使能锁存器(禁止写操作)
WRSR_INST  EQU 01H;对应的是WRSR指令,写状态寄存器(看门狗和块锁)
RdsR_INST  EQU 05H;对应的是RSDR指令,读状态寄存器
WRITE_INST EQU 02H;对应的是WRITE指令,从选下的地址开始写入数据至存储器阵列(1-16字节)
READ_INST  EQU 03H;对应的是READ指令,
STATUS_REG EQU 30H
MAX_POLL  EQU 99H

X_SO  EQU P1.1;在读数据时,数据在SCK脉冲的下降沿由这个引脚送出
X_SCK  EQU P1.2;串行时钟,串行时钟的上升沿通过SI引脚进行数据的输入,下降沿通过SO引脚进行数据的输出
X_CS  EQU P1.0;上电之后任何操作之前,CS必须有一个高到低的过程,同时高到低过程能复位看门狗
X_SI  EQU P1.3;串行输入,SI是串行数据输入端 指令码 地址 数据都通过这个引脚进行输入 在SCK的上升沿进行数据的输入 并且高位MS在前
DISM0  EQU 30H
DISM1  EQU 38H
;WP---写保护,WP引脚是低电平时,向X5645里写操作是被禁止的,但其他功能正常;
;WP引脚是高电平时,所有操作正常,包括写操作
;如果是在CS低的时候,WP变为低电平,则会中断向X5645里写操作,R
;但是如果内部的非易失性写周期已经初始化了,WP变为低电平不起作用

;RESET,复位输出 RESET是一个开漏型输出引脚 只要VCC下降到最小允许VCC值
;这个引脚就会输出高电平 一直到VCC上升超过最小允许值之后200MS,同时
;它也受看门狗定时器控制 只要看门狗处于激活状态 并且WDI引脚上电平保持
;为高或者为低超过了定时的时间 就会产生复位信号 CS引脚上的一个下降沿
;将会复位看门狗定时器 由于这是一个开漏型的输出引脚 所以在使用时必须接上拉电阻

 ORG 0000H
 AJMP START
 ORG 0003H
 LJMP ERR
 NOP
 NOP
 LJMP ERR
 ORG 000BH
 LJMP ERR
 NOP
 NOP
 LJMP ERR
 ORG 0013H
 LJMP ERR
 NOP
 NOP
 LJMP ERR
 ORG 001BH
 LJMP ERR
 NOP
 NOP
 LJMP ERR
 ORG 0023H
 LJMP ERR
 NOP
 NOP
 LJMP ERR ;中断向量软件陷阱
 ORG 0100H

START:
          

           MOV  30H,#0AAH    ; 缓存区覆初值
           MOV  31H,#55H
           MOV  32H,#55H
           MOV  33H,#55H
           MOV  34H,#55H
           MOV  35H,#55H
           MOV  36H,#55H
           MOV  37H,#0AAH
;**********************************************************************************************
; 将CPU 首地址为DISM0连续8个字节写入x5045 的0000H~0007H单元 
;**********************************************************************************************        
           LCALL WREN_CMD          ;写允许命令    
           MOV R0,#DISM0
           MOV R4,#08H
           MOV DPTR,#0000H
           LCALL BYTE_WRITE       ;写存储器命令 写存储地址      
                                  
;**********************************************************************************************
; 将X5045 0000H~0008H单元的数据 读到首地址为DISM1连续8个字节中
;**********************************************************************************************                   
           LCALL WRSR_CMD          ;写状态寄存器命令   (禁止写保护,禁止看门狗)
           MOV DPTR,#0000H
           MOV R0,#DISM1
           MOV R4,#08H
           LCALL BYTE_READ        ;读存储器命令  读存储地址    
;**********************************************************************************************
; 将CPU 首地址为DISM1连续8个字节写入x5045 的0008H~000fH单元 
;**********************************************************************************************           
           
           LCALL WREN_CMD            ;写允许命令  
           MOV R0,#DISM1
           MOV R4,#08H
           MOV DPTR,#0008H
           LCALL BYTE_WRITE          ;写存储器命令 写存储地址 
sjmp $



;以下为x5045的子程序,用户可以直接调用,不用更改。
;********************************************************
RDSR_CMD: ;CLR X_SCK

           SETB X_SCK;初始状态是为1的


           NOP
           NOP
           NOP
           CLR X_CS
           MOV A,#RDSR_INST
           LCALL OUTBYT
           LCALL INBYT

           ;CLR X_SCK

           SETB X_SCK;初始状态是为1的


           NOP
           NOP
           NOP
           SETB X_CS

           mov 70h,a;


           RET

WRSR_CMD: ;CLR X_SCK

SETB X_SCK;初始状态是为1的

           NOP
           NOP
           NOP
           CLR X_CS
           MOV A,#WRSR_INST
           LCALL OUTBYT
           MOV A,#STATUS_REG
           LCALL OUTBYT

     ;CLR X_SCK

SETB X_SCK;初始状态是为1的

           NOP
           NOP
           NOP
           SETB X_CS
           ACALL WIP_POLL;----------
           MOV R7,#50H
WAIT_WRITE2: MOV R6,#0FFH
           DJNZ R6,$
           DJNZ R7,WAIT_WRITE2
           RET

WREN_CMD: ;CLR X_SCK

           SETB X_SCK;初始状态是为1的

           NOP
           NOP
           NOP
           CLR X_CS
           MOV A,#WREN_INST
           LCALL OUTBYT

           ;CLR X_SCK

           SETB X_SCK;初始状态是为1的


           NOP
           NOP
           NOP
           SETB X_CS
           RET

BYTE_READ: ;CLR X_SCK

           SETB X_SCK;初始状态是为1的

           NOP
           NOP
           NOP
           CLR X_CS
           MOV A,#READ_INST
           MOV B,DPH
           MOV C,B.0
           MOV ACC.3,C
           LCALL OUTBYT
           MOV A,DPL
           LCALL OUTBYT
LOOP_BYTE1: LCALL INBYT
           MOV @R0,A
           INC R0
           DJNZ R4,LOOP_BYTE1

           ;CLR X_SCK

           SETB X_SCK;初始状态是为1的


           NOP
           NOP
           NOP
           SETB X_CS
           RET

BYTE_WRITE: ;CLR X_SCK

            SETB X_SCK;初始状态是为1的

            NOP
            NOP
            NOP
            CLR X_CS
            MOV A,#WRITE_INST
            MOV B,DPH
            MOV C,B.0
            MOV ACC.3,C
            LCALL OUTBYT
            MOV A,DPL
            LCALL OUTBYT
LOOP_BYTE: MOV A,@R0
            LCALL OUTBYT
            INC R0
            DJNZ R4,LOOP_BYTE

            ;CLR X_SCK

            SETB X_SCK;初始状态是为1的


            NOP
            NOP
            NOP
            SETB X_CS
            ACALL WIP_POLL; ------------
            MOV R7,#50H
WAIT_WRITE1:MOV R6,#0FFH
            DJNZ R6,$
            DJNZ R7,WAIT_WRITE1
            RET

    INBYT: MOV R3,#08H
   INBYT1: SETB X_SCK
           NOP
           NOP
           NOP
           CLR X_SCK
           NOP
           NOP
           MOV C,X_SO
           RLC A
           DJNZ R3,INBYT1

           SETB X_SO;+++++++++

           RET

   OUTBYT: MOV R3,#08H
  OUTBYT1: CLR X_SCK
           RLC A
           MOV X_SI,C
           NOP
           NOP
           NOP
           SETB X_SCK
           NOP
           NOP
           DJNZ R3,OUTBYT1
           ;CLR X_SI
           SETB X_SI;释放总线

           RET

WIP_POLL: MOV R1,#MAX_POLL
WIP_POLL1: LCALL RDSR_CMD
           JNB ACC.0,WIP_POLL2
           DJNZ R1,WIP_POLL1
WIP_POLL2: RET



ERR:
           RET

END


⌨️ 快捷键说明

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