📄 ds1302ok.asm
字号:
;DS1302的数字钟,在128x64的点阵上显示年月日时间等信息
;==========程序设计spillar,2007-08-18=============
;**********************************************************
;* 基于DS1302的时钟电路设计 *
;**********************************************************
KEY1 BIT P1.0
KEY2 BIT P1.1
KEY3 BIT P1.2
SPK BIT P2.1
T_CLK EQU P1.5 ; 时钟线引脚
T_IO EQU P1.6 ; 数据线引脚
T_RST EQU P1.7 ; 复位线引脚
RS EQU P2.5 ;定义数据与指令线
RW EQU P2.4 ;定义读写线
E EQU P2.3 ;定义使能控制线
PSB EQU P3.4 ;定义串并口选择线
RESET EQU P3.6 ;定义复位线
;P0口数据输出================================================
XPOS EQU 20H ;定义列地址
YPOS EQU 21H ;定义行地址
FIRST_COL EQU 30H ;定义字符/汉字显示起始行
FIRST_ROW EQU 31H ;定义字符/汉字显示起始列
HZK_WID EQU 32H ;定义字符/汉字显示长度
HZK_LIN EQU 33H ;定义字符/汉字显示行数
FIRST_ADD EQU 34H ;定义字符/汉字显示起始位置
START_ADD EQU 35H ;起始位置缓存单元
FIRST_LIN EQU 36H ;起始行位置缓存单元
G_COLUMN EQU 37H ;定义图形显示起始行
G_ROW EQU 38H ;定义图形显示起始列
G_WID EQU 39H ;定义图形显示宽度
KEY1_SBUF EQU 3AH
SEC_LCD1 EQU 40H
SEC_LCD2 EQU 41H
MIN_LCD3 EQU 42H
MIN_LCD4 EQU 43H
HOR_LCD5 EQU 44H
HOR_LCD6 EQU 45H
DAT_LCD7 EQU 46H
DAT_LCD8 EQU 47H
MON_LCD9 EQU 48H
MON_LCD10 EQU 49H
WEEK_LCD11 EQU 4AH
WEEK_LCD12 EQU 4BH
YEAR_LCD13 EQU 4CH
YEAR_LCD14 EQU 4DH ;定义显示缓存
SECOND EQU 50H ;秒数据存储单元
CMIN EQU 51H ;分数据
CHR EQU 52H ;小时数据
CDATE EQU 53H ;日数据
CMONTH EQU 54H ;月数据
CDAY EQU 55H ;星期数据
CYEAR EQU 56H ;年数据低2位
MAX_DATA EQU 57H
MIN_DATA EQU 58H
ORG 0000H ;程序执行开始地址
AJMP START ;跳至START执行
ORG 0003H ;外中断0中断入口地址
RETI ;中断返回(不开中断)
ORG 000BH ;定时器T0中断入口地址
RETI ;中断返回(不开中断)
ORG 0013H ;外中断1中断入口地址
RETI ;中断返回(不开中断)
ORG 001BH ;定时器T1中断入口地址
;LJMP INTT1 ;进入定时器中断程序
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
ORG 002BH ;定时器T2中断入口地址
RETI ;中断返回(不开中断)
ORG 0100H
;**********************************************************
; 主程序 *
;**********************************************************
START: CLR 13H ;分钟、小时闪动标志位初始化
CLR 14H
;MOV SECOND,#00H
;MOV CMIN ,#59H
;MOV CHR ,#02H
;MOV CDATE ,#18H
;MOV CMONTH,#08H
;MOV CDAY ,#06H
;MOV CYEAR ,#07H
MOV SP,#60h
MOV A,#00H
MOV KEY1_SBUF,A
CLR RESET
NOP
SETB RESET
SETB PSB ;PSB=1 并口
CLR RW
ACALL LCDRESET ;调用系统初始化程序
ACALL HZKLIB ;汉字显示,作为背景
ACALL INIT1302
START1: ;ACALL set1302 ;调用DS1302初始化之程序
NOP
START2: MOV MAX_DATA,#60H
MOV MIN_DATA,#59H
ACALL get1302 ;调用DS1302读时间程序
ACALL CHANGE
ACALL TIME_DISPLAY ;调用时间显示子程序
K1: JB KEY1,N1 ;判断FUNCTION键是否按下?
ACALL DELAY01
JB KEY1,N1
JNB KEY1,$
ACALL SPKER
TOP: INC KEY1_SBUF ;使功能键缓冲区加一
MOV A,KEY1_SBUF
CJNE A,#01H,N2 ;缓冲区数值1跳入秒钟调整程序
AJMP SECOND1
N2: CJNE A,#02H,N3 ;缓冲区数值2跳入分钟调整程序
AJMP MINUTE
N3: CJNE A,#03H,N4 ;缓冲区数值3跳入时钟调整程序
AJMP HOUR1
N4: CJNE A,#04H,N5
AJMP WEEK
N5: CJNE A,#05H,N6
AJMP DAY
N6: CJNE A,#06H,N7
AJMP MONTH
N7: CJNE A,#07H,N8
AJMP YEAR
N8: CJNE A,#08H,N1
MOV KEY1_SBUF,#0 ;清零缓冲区
N1: ;如果没有键按下跳回start2
SJMP START2
;----------------------------------------------------------------------
;******************使LCD闪烁表示进入调整状态***************************
SECOND1: ACALL get1302 ;调用DS1302读时间程序
ACALL CHANGE ;使秒位闪烁
ACALL TIME_DISPLAY
ACALL DELAY02
MOV SEC_LCD1,#' ' ;关闭显示器
MOV SEC_LCD2,#' '
ACALL TIME_DISPLAY
ACALL DELAY02
MOV R0,#SECOND
ACALL ADJUST
AJMP SECOND1
MINUTE: ACALL get1302
ACALL CHANGE ;使分位闪烁
ACALL TIME_DISPLAY
ACALL DELAY02
MOV MIN_LCD3,#' '
MOV MIN_LCD4,#' '
ACALL TIME_DISPLAY
ACALL DELAY02
MOV R0,#CMIN
ACALL ADJUST
AJMP MINUTE
HOUR1: ACALL get1302
ACALL CHANGE ;使时位闪烁
ACALL TIME_DISPLAY
ACALL DELAY02
MOV HOR_LCD5,#' '
MOV HOR_LCD6,#' '
ACALL TIME_DISPLAY
ACALL DELAY02
MOV R0,#CHR
MOV MAX_DATA,#24H
MOV MIN_DATA,#23H
ACALL ADJUST
AJMP HOUR1
WEEK: LCALL get1302
ACALL CHANGE
ACALL TIME_DISPLAY
ACALL DELAY02
MOV WEEK_LCD11,#38H
ACALL TIME_DISPLAY
ACALL DELAY02
MOV R0,#CDAY
MOV MAX_DATA,#07H
MOV MIN_DATA,#07H
ACALL ADJUST
AJMP WEEK
DAY: LCALL get1302
ACALL CHANGE
ACALL TIME_DISPLAY
ACALL DELAY02
MOV DAT_LCD7,#' '
MOV DAT_LCD8,#' '
ACALL TIME_DISPLAY
ACALL DELAY02
MOV R0,#CDATE
MOV MAX_DATA,#31H
MOV MIN_DATA,#30H
ACALL ADJUST
AJMP DAY
MONTH: LCALL get1302
ACALL CHANGE
ACALL TIME_DISPLAY
ACALL DELAY02
MOV MON_LCD9,#' '
MOV MON_LCD10,#' '
ACALL TIME_DISPLAY
ACALL DELAY02
MOV R0,#CMONTH
MOV MAX_DATA,#12H
MOV MIN_DATA,#12H
ACALL ADJUST
AJMP MONTH
YEAR: LCALL get1302
ACALL CHANGE
ACALL TIME_DISPLAY
ACALL DELAY02
MOV YEAR_LCD13,#' '
MOV YEAR_LCD14,#' '
ACALL TIME_DISPLAY
ACALL DELAY02
MOV R0,#CYEAR
MOV MAX_DATA,#99H
MOV MIN_DATA,#98H
ACALL ADJUST
AJMP YEAR
;****************************时钟调整子程序************************
ADJUST: JB KEY2,A2 ;加一键按下了吗?
ACALL DELAY01
JB KEY2,A2
;JNB KEY3,$
ACALL SPKER
INC @R0
ACALL set1302
MOV A,@R0
CJNE A,MAX_DATA,A2
MOV @R0,#00H
A2: JB KEY3,A3 ;减一键按下了吗?
ACALL DELAY01
JB KEY3,A3
;JNB KEY4,$
ACALL SPKER
DEC @R0
ACALL set1302
MOV A,@R0
CJNE A,#0FFH,A3
MOV @R0,MIN_DATA
A3: JB KEY1, A4 ;功能键按下了吗?
ACALL DELAY01
JB KEY1, A4
JNB KEY1,$
ACALL SPKER
AJMP TOP
A4: RET
;================以下程序用来读或写DS1302==============================
;================DS1302初始化,准备写入数据============================
INIT1302: CLR T_RST ;充电方式设置
CLR T_CLK
SETB T_RST
MOV B,#90H
ACALL RTInputByte
MOV B,#0A5H
ACALL RTInputByte
CLR T_CLK
CLR T_RST
RET
set1302: CLR T_RST ;DS1302写数据程序 ,将分钟,小时等数据送入到DS1302中
CLR T_CLK
SETB T_RST
MOV B,#8EH ;控制寄存器
ACALL RTInputByte
MOV B,#00H ;写操作前WP置零
ACALL RTInputByte
SETB T_CLK
CLR T_RST
MOV R0,#Second
MOV R7,#7 ;秒、分、时、日、月、星期、年共7个数据
MOV R1,#80H ;秒写地址
set13021: CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,R1 ;写秒、分、时、日、月、星期、年地址
ACALL RTInputByte
MOV A,@R0 ;写秒数据
MOV B,A
ACALL RTinputByte
INC R0
INC R1
INC R1
SETB T_CLK
CLR T_RST
DJNZ R7,Set13021
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,#8EH ;控制寄存器
ACALL RTInputByte
MOV B,#80H ;控制WP为1,进入写保护状态
ACALL RTInputByte
SETB T_CLK
CLR T_RST
RET
get1302: MOV R0,#Second ;DS1302读时间程序
MOV R7,#7
MOV R1,#81H ;秒地址
get13021: CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,R1 ;秒、分、时、日、月、星期、年地址
ACALL RTInpuTByte
ACALL RT0utputByte
MOV @R0,A ;
INC R0
INC R1
INC R1
SETB T_CLK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -