⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302ok.asm

📁 wo de ying wen bu hao jiu bu jie shao le da jia ziji kan ba bu haoyisi
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;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 + -