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

📄 ex10-3.asm

📁 《单片机原理实用教程——基于Proteus虚拟仿真》一书的配套光盘
💻 ASM
字号:
;*********************************************************************/

T_RST Bit P1.5 ;实时时钟复位线引脚
T_CLK Bit P1.6 ;实时时钟时钟线引脚
T_IO Bit P1.7 ;实时时钟数据线引脚

SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
DAY EQU 33H
MONTH EQU 34H
WEEK EQU 35H
YEARL EQU 36H

;*********************************************************************/
        ORG 0000H
START:  LJMP MAIN
        ORG 0060H
MAIN:   MOV SP,#60H                 ;修改堆栈
;*********************************************************************
        MOV SECOND,#55H             ;初始时间设为23:59:55
        MOV MINUTE,#59H
        MOV HOUR,#23H
        MOV DAY,#31H                ;初始日期设为07年12月31日第一周
        MOV MONTH,#12H
        MOV WEEK,#01H
        MOV YEARL,#07H
        LCALL SETDS1302
		LCALL LCD_INIT	    ;调用液晶模块初始化子程序
        MOV R3,#20
        MOV TMOD,#01H
        MOV TH0,#3CH 		    ;置定时器初值(定时50ms)
        MOV TL0,#0B0H
        SETB TR0   		    ;启动定时器0
LP1:    JBC TF0,LP2   		    ;查询计数溢出
        SJMP LP1   		    ;未到50 ms继续计数
LP2:    MOV TH0,#3CH  		    ;重新置定时器初值
        MOV TL0,#0B0H
	MOV   R2,#81H       	    ;从第1行第2位开始,设置DDRAM地址
	LCALL WRTC 
	MOV   DPTR,#ZIFU1    	    ;指向显示字符代码首地址
	MOV   R4,#06H
	LCALL WP1            	    ;第1行字符代码写入DDRAM
        LCALL DISPYMD               ;显示年月日
	MOV   R2,#0C1H      	    ;设置第2行DDRAM地址
	LCALL WRTC
	MOV   DPTR,#ZIFU2    	    ;指向显示字符代码首地址
	MOV   R4,#06H
	LCALL WP1            	    ;第1行字符代码写入DDRAM
        LCALL DISPHMS               ;显示时分秒
        DJNZ R3,LP1                 ;未到1s继续循环
        LCALL GET1302               ;每到1s从DS1302读取一次时间
        mov     r3,#20
        SJMP lp1
ZIFU1:  DB "Date: "
ZIFU2:  DB "Time: "

;*******************************************
DISPHMS:MOV     A,HOUR 			;时分秒显示子程序
        SWAP    A
        ANL     A,#03H
		ADD 	A,#30H
		MOV 	R2,A
		LCALL 	WRTD
        MOV     A,HOUR
        ANL     A,#0FH
		ADD 	A,#30H
		MOV		R2,A
		LCALL 	WRTD
		MOV 	R2,#2DH
		LCALL 	WRTD
        MOV     A,MINUTE 		;显示分
        SWAP    A
        ANL     A,#07H
		ADD A,#30H
		MOV R2,A
		LCALL WRTD
        MOV     A,MINUTE
        ANL     A,#0FH
		ADD A,#30H
		MOV R2,A
		LCALL WRTD
		MOV R2,#2DH
		LCALL WRTD
        MOV     A,SECOND 		;显示秒
        SWAP    A
        ANL     A,#07H
		ADD A,#30H
		MOV R2,A
		LCALL WRTD
        MOV     A,SECOND
        ANL     A,#0FH
		ADD A,#30H
		MOV R2,A
		LCALL WRTD
        RET
;*****************************************
DISPYMD:MOV     A,YEARL       	;年月日显示子程序
        SWAP    A
        ANL     A,#03H
		ADD 	A,#30H
		MOV 	R2,A
		LCALL 	WRTD
        MOV     A,YEARL
        ANL     A,#0FH
		ADD		A,#30H
		MOV		R2,A
		LCALL 	WRTD
		MOV 	R2,#2DH
		LCALL 	WRTD

        MOV     A,MONTH			 ;显示月
        SWAP    A
        ANL     A,#07H
		ADD 	A,#30H
		MOV 	R2,A
		LCALL	WRTD
        MOV     A,MONTH
        ANL     A,#0FH
		ADD 	A,#30H
		MOV 	R2,A
		LCALL 	WRTD
		MOV 	R2,#2DH
		LCALL 	WRTD
        MOV     A,DAY			 ;显示日
        SWAP    A
        ANL     A,#07H
		ADD 	A,#30H
		MOV 	R2,A
		LCALL 	WRTD
        MOV     A,DAY
        ANL     A,#0FH
		ADD 	A,#30H
		MOV		R2,A
		LCALL 	WRTD
        RET														  
;*****************************************************************
SETDS1302: CLR     T_RST	;设置DS1302初始时间,并启动计时
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,#8EH          ;写控制命令字
        LCALL   INPUTBYTE       
        MOV     B,#00H          ;写保护关闭
        LCALL   INPUTBYTE
        SETB    T_CLK
        nop
        CLR     T_RST
        MOV     R0,#SECOND      ;内存中的时间首地址
        MOV     R1,#80H         ;DS1302中的时间首地址
        MOV     R7,#7           ;字节数
SETLOOP:CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,R1            ;写命令字
        LCALL   INPUTBYTE
        MOV     A,@R0           ;设置时间
        MOV     B,A
        LCALL   INPUTBYTE       
        INC     R0
        INC     R1
        INC     R1
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        DJNZ    R7,SETLOOP
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,#8EH
        LCALL   INPUTBYTE
        MOV     B,#80H          ;开写保护
        LCALL   INPUTBYTE
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        RET
;*****************************************************************
GET1302:		       ;从DS1302读取时间
        MOV     R0,#SECOND     
        MOV     R1,#81H        ;DS1302中读时间的首地址
        MOV     R7,#7
GETLOOP:CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,R1
        LCALL   INPUTBYTE       ;写命令字
        LCALL   OUTPUTBYTE      ;读时间
        MOV     @R0,A           ;将从DS1302中读取的时间从内存中保存
        INC     R0              ;修改地址指针
        INC     R1
        INC     R1
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        DJNZ    R7,GETLOOP
        RET

;*****************************************************************
INPUTBYTE:MOV     R4,#8		;向DS1302写一个字节
INPUTLOOP:MOV     A,B
        RRC     A
        MOV     B,A
        MOV     T_IO,C
        SETB    T_CLK
        NOP
        CLR     T_CLK
        DJNZ    R4,INPUTLOOP
        RET
;*****************************************************************

OUTPUTBYTE:clr     a		 ;从DS1302读一个字节
        clr     c
        MOV     R4,#8
OUTPUTLOOP:NOP
        MOV     C,T_IO
        RRC     A
        SETB    T_CLK
        NOP
        CLR     T_CLK
        DJNZ    R4,OUTPUTLOOP
        RET

;*****************************************************************
LCD_INIT:	LCALL TIM1   ;LCD初始化子程序
	MOV   R2,#38H        ;功能设置命令,设定8位字长,2行,5*7点阵
	LCALL WRTC           ;写入
	LCALL TIM3           ;延时100us
	MOV   R2,#38H	     
	LCALL WRTC           ;写入
	LCALL TIM3           ;延时100us
	MOV   R2,#38H
	LCALL WRTC           ;写入
	LCALL TIM3           ;延时100us
	MOV   R2,#01H        ;清屏命令
	LCALL WRTC           ;写入
	MOV   R2,#06H        ;输入方式命令
	LCALL WRTC           ;写入
	MOV   R2,#0EH        ;开显示、光标不闪命令
	LCALL WRTC           ;写入
	RET
;*****************************************************************
WAIT:	MOV  P2,#7FH	 ;忙标志判断子程序
	MOV  R0,#0F1H    ;读忙标志地址
	MOVX A,@R0
	JB   ACC.7,WAIT
	RET

;*****************************************************************
WRTC:	LCALL WAIT	    ;写指令代码子程序
	MOV   A,R2
	MOV   R0,#0F0H      ;写指令地址
	MOVX  @R0,A
	RET

;*****************************************************************
WRTD:	LCALL WAIT	    ;写数据子程序
	MOV   R0,#0F2H      ;写数据地址
	MOV   A,R2
	MOVX  @R0,A
	RET
;*****************************************************************
WP1:    CLR   A
	MOVC  A,@A+DPTR
	MOV   R2,A
	LCALL WRTD           ;写入1字节字模数据
	INC   DPTR
	DJNZ  R4,WP1
	RET

;*****************************************************************
TIM1:	MOV   R5,#03H	  ;延时15ms子程序
TT1:	LCALL TIM2
	DJNZ  R5,TT1
	RET
;*****************************************************************
TIM2:	MOV   R4,#50	  ;延时5ms子程序
TT2:	LCALL TIM3
	DJNZ  R4,TT2
	RET
;*****************************************************************
TIM3:	MOV   R3,#50	  ;延时100us子程序
TT3:	DJNZ  R3,TT3
	RET

end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -