;位地址
XWP EQU 0B5H ;P3.5(5045管脚连接,根据实际情况修改)
XCS EQU 0B2H ;P3.2
XSCK EQU 0B6H ;P3.6
XSI EQU 0B7H ;P3.7
XSO EQU 0B3H ;P3.3
;启动入口
ORG 0000H ;启动
LJMP START ;
;主控程序
START: MOV IE,#00H ;关闭所有中断
SETB XWP ;解除硬件写保护
MOV A,#00H ;看门狗周期1.4秒
LCALL WRSR ;
LCALL WROFF ;设置存储器写保护
CLR XWP ;启动硬件写保护
;工作程序
WORK:
;这里加入你的程序,为使用看门狗功能,程序应循环且只有一处喂狗
CLR XCS ;喂看门狗
SETB XCS ;撤消触发
LJMP WORK ;大循环
;串行EEPROM(X5045)写使能子程序==========================================================;
WRON: CLR XCS ;片选
MOV A,#06H ;使能写操作
LCALL OUTBYTE ;
SETB XCS ;片选
RET ;
;串行EEPROM(X5045)禁止写使能子程序======================================================;
WROFF: CLR XCS ;片选
MOV A,#04H ;禁止使能写操作
LCALL OUTBYTE ;
SETB XCS ;片选
;
MOV A,#0CH ;写保护
LCALL WRSR ;全块锁
RET ;
;串行EEPROM(X5045)写状态寄存器子程序====================================================;
WRSR: PUSH ACC ;状态字压栈
LCALL WRON ;使能写操作
CLR XCS ;片选
;
MOV A,#01H ;写状态寄存器
LCALL OUTBYTE ;
;
POP ACC ;设置状态寄存器
LCALL OUTBYTE ;
;
SETB XCS ;片选
MOV B,#01H ;
LCALL YSCX ;延时
RET ;
;串行EEPROM(X5045)字节写子程序==========================================================;
OUTBYTE:MOV B,#08H ;写出八位
OUTBYT: CLR XSCK ;
RLC A ;CY←D7←...←D0←CY,移出一位到CY
MOV XSI,C ;
SETB XSCK ;写一位
DJNZ B,OUTBYT ;
RET ;返回
;串行EEPROM(X5045)字节读子程序==========================================================;
INBYTE: MOV B,#08H ;读出八位
INBYT: SETB XSCK ;
CLR XSCK ;取得一位
MOV C,XSO ;
RLC A ;CY←D7←...←D0←CY,CY移入A
DJNZ B,INBYT ;
RET ;返回
END ;
追问你好,我只需要看门狗和复位的功能,也需要写串行EEPROM的读写子程序吗?还有,如果主程序中有多个调用子程序的而且时间超过看门狗溢出的时间该怎么办?谢谢
追答只需要看门狗和复位的功能,串行EEPROM的读写子程序都可以删掉。如果主程序中有多个调用子程序,只要不在子程序中等待,基本不会超时,万一超时,你只好优化你的程序,因为X5045最长延时时间就是1.4秒。或者,可以临时关闭看门狗,但这样万一程序跑飞到这里,就失去看门狗的意义了。
追问那只要看门狗和复位的功能的程序是不是这样就可以:
XWP EQU 0B5H ;P3.5(5045管脚连接,根据实际情况修改)
XCS EQU 0B2H ;P3.2
XSCK EQU 0B6H ;P3.6
XSI EQU 0B7H ;P3.7
XSO EQU 0B3H ;P3.3
;启动入口
ORG 0000H ;启动
LJMP START ;
;主控程序
START: MOV IE,#00H ;关闭所有中断
.
.
.
LJMP WORK ;大循环
追答除了串行EEPROM的读写子程序可以删掉,其他不要动。
追问5045的so,si ,sck管脚不接行不行?(只用看门狗和复位的功能),非常感谢!