好东西!!!!!看门狗,SPI接口的EEPROM,电压监测.....5045 源程序
;===================================================
;函数名称:INIT_X5045
;功能: 初始化X5045 (实现看门狗、512*8 EPROM、电压监测)
;入口参数:
;出口参数:
;影响资源:
;其他: X5045控制子程序清单
; WD_RST 看门狗复位子程序
; WD_SET 看门狗定时时间设置子程序
; RD_SR 读状态寄存器子程序
; WR_SR 写状态寄存器子程序
; RD_B 读一个字节数据子程序
; WR_B 写一个字节数据子程序
; 指令名称 指令格式 完成的操作
; WREN 0000 0110 写允许
; WRDI 0000 0100 写禁止
; RSDR 0000 0101 读状态寄存器
; WRSR 0000 0001 写状态寄存器 看门狗和块锁定
; READ 0000 A8 011 从选定的地址单元中读数据
; WRITE 0000 A8 011 向选定的开始地址单元写入数据 1-16字节
;===================================================
ORG 0000H
X5045_CS EQU P1.0
X5045_SDI EQU P1.1
X5045_SCLK EQU P1.2
X5045_SDO EQU P1.3
;===================================================
;函数名称:WD_RST
;功能: 看门狗复位子程序
;入口参数:
;出口参数:
;影响资源:
;其他:
;===================================================
WD_RST: CLR X5045_CS ;在上电后任何操作之前,CS必须要有一个从高到低的过程
SETB X5045_CS ;此后该引脚用作喂狗WDI端
RET
;===================================================
;函数名称:WD_SET
;功能: 看门狗定时时间设置成600ms
;入口参数:
;出口参数:
;影响资源:
;其他: 看门狗定时溢出时间 00H-1.4S 10H-600MS 20H-200MS 30H-FORBIDDEN
;===================================================
WD_SET: MOV R0,#10H
LCALL WR_SR
;!!!!!!!!!!!!到时候还要判断写入成功与失败的标志位F0,失败后还要重写呀!
RET
;===================================================
;函数名称:RD_SR
;功能: 读状态寄存器子程序,读出的X5045的状态存在A累加器中
;入口参数:
;出口参数:A
;影响资源:
;其他:
;===================================================
RD_SR: MOV A,#05H ;将RDSR命令送A累加器
CLR X5045_CS
LCALL WRITE
LCALL READ
SETB X5045_CS
RET
;===================================================
;函数名称:WR_SR
;功能: 写状态寄存器子程序。F0为写成功与否标志,F0=0,写成功;F0=1,写失败
;入口参数:
;出口参数:
;影响资源:
;其他:
;===================================================
WR_SR: LCALL RD_SR ;检查WIP位,确定X5045是否正在进行写操作
CLR F0
JNB ACC.0,WR_SR1 ;WIP=0,转写状态寄存器
SETB F0 ;WIP=1,表示正在写操作,F0置1后返回
RET
WR_SR1: CLR X5045_CS
MOV A,#06H ;置位写使能寄存器
LCALL WRITE
SETB X5045_CS ;在上电后任何操作之前,CS必须要有一个从高到低的过程
CLR X5045_CS
MOV A,#01H ;送写状态寄存器命令
LCALL WRITE
;????????????????????????????????????????????????????????????????????????????
MOV A,#18H ;设看门狗定时时间为600ms,块地址为100H~1FFH
LCALL WRITE
CLR X5045_CS
SETB X5045_CS
RET
;===================================================
;函数名称:READ
;功能: 读8位数据
;入口参数:
;出口参数:
;影响资源:
;其他:
;===================================================
READ: MOV R0,#08H ;读8位数据
READ1: SETB X5045_SCLK ;在SCLK下降沿时读出
CLR X5045_SCLK
MOV C,X5045_SDO
RLC A
DJNZ R0,READ1
RET
;===================================================
;函数名称:WRITE
;功能: 写8位数据
;入口参数:
;出口参数:
;影响资源:
;其他:
;===================================================
WRITE: MOV R0,#08H ;写8位数据
WRITE1: RLC A ;MSB 在前
MOV X5045_SDI,C
CLR X5045_SCLK ;在SCLK上升沿时写入
SETB X5045_SCLK
DJNZ R0,WRITE1
RET
;===================================================
;函数名称:RD_B
;功能: 读一个字节数据子程序,待读出数据地址在R3中,读出后的数据存R4
;入口参数:
;出口参数:
;影响资源:
;其他: ;读一个数时遵循先送指令,再送地址,然后读取数据的原则
;===================================================
RD_B: LCALL RD_SR
JB ACC.0,RD_B ;正在忙时继续查询
CLR X5045_CS
MOV A,#03H ;送读E2PROM命令,地址在00H~FFH间
LCALL WRITE
MOV A,R3 ;送地址
LCALL WRITE
LCALL READ ;读数据并送R4
MOV R4,A
SETB X5045_CS
RET
;===================================================
;函数名称:WR_B
;功能: 写一个字节数据子程序,写入地址在R3中,数据在R4中
;入口参数:
;出口参数:
;影响资源:
;其他:
;===================================================
WR_B: LCALL RD_SR
JB ACC.0,WR_B
CLR X5045_CS
MOV A,#06H ;置位写使能寄存器
LCALL WRITE
SETB X5045_CS
CLR X5045_CS
MOV A,#02H ;送写E2PROM命令,地址在00H~FFH间
LCALL WRITE
MOV A,R3 ;送地址
LCALL WRITE
MOV A,R4 ;送待写数据
LCALL WRITE
CLR X5045_CS
SETB X5045_CS
RET
发表时间:2003年6月3日11:54:01