📄 rtcv10.inc
字号:
;***********************************************************
;程序名称: RTC访问子程序
;程序开发: 前锋集团技术中心 江海波
;编写时间: 2004年7月7日
;软件环境: 供QF561型税控器的上层C语言使用
;硬件环境: QF561型税控器,硬件环境V1.0
; RTC芯片为DALLAS公司DS12C887
;MCU: TOSHIBA TMP93CS41@max 16M/1
;程序版本: V1.00
;最后修订时间: 2004年12月17日
;修订部分说明:
;----------------------------------------------------------
;**********************************************************
;定义伪指令,当软,硬件结构改变时修改本位置上的指令即可完成程序修改
;----------------------------------------------------------
;为了提高系统可靠性,我们对RTC采用了复选通模式,这个复选通端口被定义在
;端口rtc_sel_port的rtc_sel_bit位上
rtc_sel_port equ P3
rtc_sel_bit equ 2
;----------------------------------------------------------
;上层C语言和本程序之间由一个名叫"rtc_buffer"的缓冲区传递时间参数
;这个缓冲区的首地址被定义在:
rtc_buffer equ 0x101
;这个缓冲区中的数据分别为:rtc_buffer年,rtc_buffer+1月,rtc_buffer+2日
;rtc_buffer+3时,rtc_buffer+4分,rtc_buffer+5秒,rtc_buffer+6周
;----------------------------------------------------------
;为了方便程序调试和硬件Debug模式下的调试工作,程序安排了一个错误标志
;这个标志被定义在地址:
t_error_flag equ 0x144
;----------------------------------------------------------
;DS12C887被挂在系统数据总线上,其首地址为:
rtc_addr equ 0X300000
;**********************************************************
;--------------------全局函数声明---------------------------
PUBLIC __get_time ;---RTC时间读取函数
PUBLIC __set_time ;---RTC时间设置函数
PUBLIC __init_rtc ;---RTC初始化函数
;**********************************************************
;********************RTC时间读取函数***********************
__get_time: ;Get Time From The DS12887 RTC
di ;关中断
res rtc_sel_bit,(rtc_sel_port) ;开复选通
ld (t_error_flag),0x05 ;预制错误标志
ld bc,0x64 ;时间保护计数器,保护时间为100uS
uip_test:
ld w,(rtc_addr+10) ;读入A寄存器
ldcf 7,w ;取UIP标志位
jp nc,read_time
djnz bc,uip_test
read_time:
ld (rtc_buffer),(rtc_addr+9) ;年信息
ld (rtc_buffer+1),(rtc_addr+8) ;月信息
ld (rtc_buffer+2),(rtc_addr+7) ;日信息
ld (rtc_buffer+3),(rtc_addr+4) ;时信息
ld (rtc_buffer+4),(rtc_addr+2) ;分信息
ld (rtc_buffer+5),(rtc_addr) ;秒信息
ld (rtc_buffer+6),(rtc_addr+6) ;星期信息
ld (t_error_flag),0x03 ;读时间成功
set rtc_sel_bit,(rtc_sel_port) ;关复选通
ei 0x00 ;开中断
ret
;*********************RTC时间设置函数***********************
__set_time:
di ;关中断
res rtc_sel_bit,(rtc_sel_port) ;开复选通
ld (rtc_addr+11),0x82 ;设置更改时间标志
ld (rtc_addr+9),(rtc_buffer) ;年信息
ld (rtc_addr+8),(rtc_buffer+1) ;月信息
ld (rtc_addr+7),(rtc_buffer+2) ;日信息
ld (rtc_addr+4),(rtc_buffer+3) ;时信息
ld (rtc_addr+2),(rtc_buffer+4) ;分信息
ld (rtc_addr),(rtc_buffer+5) ;秒信息
ld (rtc_addr+6),(rtc_buffer+6) ;星期信息
ld (rtc_addr+11),0x02 ;更改完毕,时间格式为24H,BCD
set rtc_sel_bit,(rtc_sel_port) ;关复选通
ei 0x00 ;开中断
ret
;******************RTC时间初始化函数***********************
__init_rtc: ;---INITialization RTC
di ;关中断
res rtc_sel_bit,(rtc_sel_port) ;开复选通
ld w,(rtc_addr+13) ;RTC掉电标志判断
ldcf 7,w
jp c,ini_rtc_fini
ld (t_error_flag),0x01 ;错误,电池耗尽
ini_rtc_fini: ;---INITialization RTC FINIsh
ld (rtc_addr+11),0x02 ;初始化完毕,时间格式为24H,BCD
ld (rtc_addr+10),0x20 ;开震荡
set rtc_sel_bit,(rtc_sel_port) ;关复选通
ei 0x00 ;开中断
ret
;**********************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -