bodu.com

电子/电气工程师博客

正文 更多文章

X5045 汇编语言版驱动程序

            X5045驱动程序

            徐丽红  王佰营

     wbymcs51.blog.bokee.net


   该程序已经使用过N次,很稳定!免调试。

;X5045有512个字节,共分为4页,读写数据指令的位3作为地址A8,通过A8的高低电平,

;又将器件分为上半部分和下半部分;;页地址从地址A8 A7A6A5A4A3A200开始到A8

;A7A6A5A4A3A211结束; A7-A2字节地址,它与外界接口按三总线的串行接口协议。

;读数据和写数据的工作方式完全不同,读数据的全部8位用来计数(A7A6A5A4A3A2 A1A0),

;0FFH溢出后变成00H;写数据时,只用最低两位计数,XXXXXX11B溢出后变成XXXX XX00B,

;所以连续写的实际结果是在4个单元中反复写入。;因此,将每个控制点压缩为4个字节,

;可用连续写入方式快速存储数据;

;==================================================================
;                       X5045  utility
;==================================================================
;=================================================================
;  function:  in1_byte  ;产生读一个字节数据时序
;  input:     -------------
;  output:    a
;               usage:     a,c,r7
;=================================================================
in1_byte: ;产生读一个字节数据时序
  mov  r7,  #08h

re_loop: setb  so
  setb  sck  ;读数据下降沿有效

  clr  sck
  mov  c,  so
  rlc  a
  
  djnz  r7,  re_loop
  ret

;=================================================================
;  function:  out1_byte  ;产生写一个字节数据时序
;  input:     a
;  output:    X5045
;               usage:     a,c,r7
;=================================================================
out1_byte: ;产生写一个字节数据时序
  ;jb  P0.7,  $  ;断电保护作用
  mov  r7,  #08h
outbyt1: clr  sck  ;写数据上升沿有效
  rlc  a
  mov  si,  c
  setb  sck    
  nop
  nop
  djnz  r7,  outbyt1
  ;clr  si
  ret
;=================================================================
;  function:  wrsr   ;写状态控制字
;  input:     -------------
;  output:    -------------
;               usage:     a,c,r7
;=================================================================
wrsr:  ;写状态控制字
  setb  cs
  clr  sck
  clr  cs
  mov  a,  #WRSR_INST ;写状态寄存器指令(正在写)
  lcall  out1_byte

  clr  sck
  setb  cs
  lcall  wait_writ_ok
  ret
;=================================================================
;  function:  rdsr  ;读状态控制字
;  input:     -------------
;  output:    -------------
;               usage:     a,c,r7
;=================================================================
rdsr:  ;读状态控制字
  setb  cs
  clr  sck
  clr  cs

  mov  a,  #RDSR_INST ;读状态寄存器指令
  lcall  out1_byte

  lcall  in1_byte
  
  clr  sck
  setb  cs
  ret
;=================================================================
;  function:  wait_writ_ok ;等待写完成
;  input:     -------------
;  output:    -------------
;               usage:     a,c,r1,r7
;=================================================================
wait_writ_ok: ;等待写完成
  
wip_poll: mov  r1,  #MAX_POLL
wip_poll1: lcall  rdsr
  jnb  acc.0,  wip_poll2
  djnz  r1,  wip_poll1
wip_poll2: ret 
;=================================================================
;  function:  write_byte  ;向X5045写一个字节数据 
;  input:      r1-----向X5045写一个字节数据的地址
;    r0-----从RAM需要写数据的地址
;    bA8----X5045上下部分    
;  output:    -------------
;               usage:     a,c,r0,r1,r7
;=================================================================
write_byte: ;向X5045写一个字节数据
  setb  cs
  clr  sck
  clr  cs
  
  mov  a,  #WREN_INST ;打开写使能
  lcall  out1_byte
  
  setb  cs
  clr  sck
  clr  cs

  mov  a,  #WRITE_INST ;写数据指令;
  mov  c,  bA8  ;写入单元地址最高位(第三位代表单元地址最高位)
  mov  acc.3,  c
  lcall  out1_byte   ;写命令

  mov  a,  r1
  lcall  out1_byte   ;写入X5045要存放的地址
 
  mov  a,  @r0  ;从缓冲区取数据
  lcall  out1_byte

  clr  sck
  setb  cs
  lcall  wait_writ_ok

  ret
;=================================================================
;  function:  read_byte  ;从X5045读一个字节数据 
;  input:     r1-----向RAM写一个字节数据的地址
;    r0-----从X5045读数据的地址
;    bA8----X5045上下部分
;  output:    -------------
;               usage:     a,c,r0,r1,r7
;=================================================================
read_byte: ;从X5045读一个字节数据

  setb  cs
  clr  sck
  clr  cs
  mov  a,  #READ_INST ;写入读数据指令;
  mov  c,  BA8
  mov  acc.3,  c
  lcall  out1_byte

  mov  a,  r0  ;写入要读取数据的地址;
  lcall  out1_byte

  lcall  in1_byte   ;读数据;
  clr  sck
  setb  cs
  mov  @r1,  a
  ret 
;=================================================================
;  function:  write_n_byte  ;向X5045写n个字节数据 
;  input:      r1-----向X5045写一个字节数据的地址
;    r0-----从RAM需要写数据的地址
;    bA8----X5045上下部分
;    r2-----字节数    
;  output:    -------------
;               usage:     a,c,r0,r1,r7,r2
;=================================================================
write_n_byte: ;向X5045写n个字节数据
  setb  cs
  clr  sck
  clr  cs
  
  mov  a,  #WREN_INST ;打开写使能
  lcall  out1_byte
  
  setb  cs
  clr  sck
  clr  cs

  mov  a,  #WRITE_INST ;写数据指令;
  mov  c,  bA8  ;写入单元地址最高位(第三位代表单元地址最高位)
  mov  acc.3,  c
  lcall  out1_byte   ;写命令

  mov  a,  r1
  lcall  out1_byte   ;写入X5045要存放的地址
 
wne_loop: mov  a,  @r0  ;从缓冲区取数据
  lcall  out1_byte
  inc  r0
  djnz  r2,  wne_loop

  clr  sck
  setb  cs
  lcall  wait_writ_ok
  ret
;=================================================================
;  function:  read_n_byte  ;从X5045读n个字节数据 
;  input:     r1-----向RAM需要读数据的地址
;    r0-----从X5045读一个字节数据的地址
;    bA8----X5045上下部分
;    r2-----字节数
;  output:    -------------
;               usage:     a,c,r0,r1,r7,r2
;=================================================================
read_n_byte: ;向X5045读n个字节数据
  setb  cs
  clr  sck
  clr  cs
  mov  a,  #READ_INST ;写入读数据指令;
  mov  c,  BA8
  mov  acc.3,  c
  lcall  out1_byte

  mov  a,  r0  ;写入要读取数据的地址;
  lcall  out1_byte

rne_loop: lcall  in1_byte   ;读数据;

  mov  @r1,  a
  inc  r1
  djnz  r2,  rne_loop
  clr  sck
  setb  cs
  ret 

;=================================================================
;  function:  reset watchdog time
;  input:     -------------
;  output:    -------------
;               usage:     none
;=================================================================
;复位看门狗电路;
rst_dog: clr  cs
  nop
  setb  cs
  nop
  ret
;=================================================================
;  function:  initialize x5045  ;初始化X5045
;  input:     -----------------------
;  output:    -----------------------
;               usage:     none
;=================================================================
ini_x25045: ;初始化X5045
  setb  cs
  clr  sck
  clr  cs
  mov  a,  #WREN_INST ;写入允许写操作指令;
  lcall  out1_byte

  lcall  wrsr    ;写入写状态寄存器指令;
  lcall  rst_dog    ;复位看门狗电路;
 
  ret

关键词:单片机 MCS51 看门狗 X5045 汇编语言版 驱动程序

分享到:

上一篇: 单片机延时程序的设计思想

下一篇: X5045 C语言版驱动程序

评论 (0条) 发表评论

抢沙发,第一个发表评论
验证码