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

📄 ckock2.asm

📁 基于89s51的一通用平台
💻 ASM
字号:
;第七部分: DS12C887      闹钟实验
;文件名称: CLOCK2.ASM    时间读,写实验

NAME CLOCK2
$NOLIST
$INCLUDE(LJD_2008.INC)
$INCLUDE(LCD.INC)
$LIST
;-------------------------------------------------------
SECOND_BUFFER	EQU	51H	;秒缓冲区
MINUTE_BUFFER	EQU	52H	;分缓冲区
HOUR_BUFFER		EQU	53H	;时秒缓冲区
WEEK_BUFFER		EQU	50H	;星期缓冲区
DATE_BUFFER		EQU	54H	;日缓冲区
MONTH_BUFFER	EQU	55H	;月缓冲区
YEAR_BUFFER		EQU	56H	;年缓冲区
CENTURY_BUFFER    EQU   57H   ;世纪缓冲区
;=======================================================

	 	ORG 	0000H
	 	AJMP	 START
	      ORG 0013H
		AJMP ALARM_INT
	 	ORG 	0030H
START:	MOV 	SP,#60H
		MOV 	R0,#57H
		MOV   IE,#84H
		CALL INITIAL_GLCD     ;调用LCD初始化
		CALL WRITETIME
	      MOV DPTR,#SECOND_ALARM	;设定闹钟在10秒
		MOV A,#10H
		MOVX @DPTR,A
		MOV DPTR,#MINUTE_ALARM	;设定闹钟为随意码
		MOV A,#0C0H
		MOVX @DPTR,A

LOOP:		CALL READTIME
		CALL RTC_LCD
		CALL	DELAY500
		AJMP 	LOOP
;========================================================
WRITETIME:	PUSH  DPH			;
		PUSH  DPL
		PUSH  ACC
		MOV 	DPTR,#REG_A		;开启振荡器和允许计时
		MOV 	A,#00100000B
		MOVX 	@DPTR,A
		MOV 	DPTR,#REG_B		;设定SET=1,禁止更新数据
		MOV 	A,#10000000B
		MOVX	@DPTR,A
		MOV 	DPTR,#SECOND	;设定秒
		MOV 	A,SECOND_BUFFER
		MOVX 	@DPTR,A
		MOV 	DPTR,#MINUTE	;设定分
		MOV 	A,MINUTE_BUFFER
		MOVX 	@DPTR,A
		MOV 	DPTR,#HOUR	;设定时
		MOV 	A,HOUR_BUFFER
		MOVX 	@DPTR,A
		MOV 	DPTR,#WEEK	;设定星期
		MOV 	A,WEEK_BUFFER
		MOVX 	@DPTR,A
		MOV 	DPTR,#DATE	;设定日
		MOV 	A,DATE_BUFFER	
		MOVX 	@DPTR,A
		MOV 	DPTR,#MONTH	;设定月
		MOV 	A,MONTH_BUFFER
		MOVX 	@DPTR,A
		MOV 	DPTR,#YEAR	;设定年
		MOV 	A,YEAR_BUFFER	
		MOVX 	@DPTR,A
		MOV 	DPTR,#CENTURY	;设定世纪
		MOV 	A,CENTURY_BUFFER
		MOVX 	@DPTR,A
	
		MOV 	DPTR,#REG_B	;设定SET=0,BCD模式,24小时制
		MOV 	A,#00100010B
		MOVX 	@DPTR,A
		POP	ACC
		POP   DPL
		POP	DPH
		RET

READTIME:	PUSH  DPL
		PUSH	DPH
		PUSH	ACC
		MOV 	DPTR,#REG_A		;读取寄存器 A
RTCBUSY:	MOVX 	A,@DPTR
		JB 	ACC.7,RTCBUSY		;测试UIP位,如果UIP=0;则执行以下程序
		MOV 	DPTR,#SECOND		;读取秒数据
		MOVX 	A,@DPTR
		MOV 	SECOND_BUFFER,A
		MOV 	DPTR,#MINUTE		;读取分数据
		MOVX 	A,@DPTR
		MOV 	MINUTE_BUFFER,A
		MOV 	DPTR,#HOUR		;读取时数据
		MOVX 	A,@DPTR
		MOV 	HOUR_BUFFER,A
		MOV 	DPTR,#WEEK		;读取星期数据
		MOVX 	A,@DPTR
		MOV 	WEEK_BUFFER,A
		MOV 	DPTR,#DATE		;读取日数据
		MOVX 	A,@DPTR
		MOV	DATE_BUFFER,A
		MOV 	DPTR,#MONTH		;读取月数据
		MOVX 	A,@DPTR
		MOV 	MONTH_BUFFER,A
		MOV 	DPTR,#YEAR		;读取年数据
		MOVX 	A,@DPTR
		MOV 	YEAR_BUFFER,A
		MOV 	DPTR,#CENTURY		;读取世纪数据
		MOVX 	A,@DPTR
		MOV 	CENTURY_BUFFER,A
		POP	ACC
		POP	DPH
		POP	DPL
		RET
	 ;
;
;       
RTC_LCD:
	    MOV 	ADDR1,#00H	;第一行显示
          MOV 	N1,#08H
	    MOV 	DPTR,#DHZTAB0
	    CALL 	DHZ
	    MOV 	ADDR1,#10H	;第二行显示
          MOV 	N1,#08H
	    MOV 	DPTR,#DHZTAB1
	    CALL 	DHZ
	    MOV 	DPTR,#DHZTAB2 	;第三行显示
 	    MOV 	ADDR1,#08H
          MOV 	N1,#08
          CALL 	DHZ
	    MOV 	DPTR,#DHZTAB3 	;第四行显示
 	    MOV 	ADDR1,#18H
          MOV 	N1,#08
          CALL 	DHZ
LP2:	    MOV 	R4,#07H	
	    MOV 	DPTR,#TAB
	    PUSH 	DPL
	    PUSH 	DPH
LP1:	    POP  	DPH
	    POP  	DPL		
	    MOV 	A,#00H
	    MOVC 	A,@A+DPTR
	    INC 	DPTR
	    PUSH 	DPL
	    PUSH 	DPH	 
	    MOV 	ADDR1,A
	    MOV 	N1,#02H
	    MOV 	A,@R0
	    MOV 	3DH,A   	
	    CALL 	LDHZ
	    DEC 	R0
	    DJNZ 	R4,LP1
	    POP  	DPH
	    POP  	DPL 	
	    MOV 	R0,#57H
	    RET
TAB:	     DB  10H,11H,13H,15H,09H,0BH,0DH,1EH
DHZTAB0:   DB "  现  在  时  间"      	
DHZTAB1:   DB "    年  月  日  "
DHZTAB2:   DB "    时  分  秒  "
DHZTAB3:   DB "  星  期  五    "
	 
;--------------------------------------------------------------------
;显示汉字16X16点阵

DHZ:      MOV   	ADDR,ADDR1	 ;  开始行位置
          MOV  	B,N1		 ;  显示数量
DHZ1:     MOV   	A,ADDR;     
          ORL   	A,#80H  	 ;  送显示地址
          LCALL 	COMMAND_GLCD ;调写命令子程序 
DHZ2:     CLR  	A
          MOVC  	A,@A+DPTR     ;  查找汉字的高位码
          INC   	DPTR
	    LCALL 	WRITE_GLCD	;  送显示
          CLR  	A
          MOVC  	A,@A+DPTR	;  查找汉字的低位码  
          INC   	DPTR
          LCALL 	WRITE_GLCD    ;  送显示
          DJNZ  	B,DHZ2
          RET

				
LDHZ:     MOV   ADDR,ADDR1	;  开始行位置
          ;MOV   B,N1		;  显示数量
LDHZ1:    MOV   A,ADDR;     
          ORL   A,#80H  	;  送显示地址
	    LCALL COMMAND_GLCD  
LDHZ3:    MOV  A,3DH
LDHZ2:    LCALL HEX_LCD
	    ;DJNZ  B,LDHZ3
          RET
;===================================================
ALARM_INT:	PUSH ACC			;闹钟中断服务程序
		PUSH DPL
		PUSH DPH
		MOV  DPTR,#REG_C
		MOVX A,@DPTR		;读取寄存器C,清除寄存器C的所有位
		MOV R5,#10
BEEP:		CPL P1.1		   ; 蜂鸣器响一声(10次)	
		LCALL DELAY100
		DJNZ R5,BEEP
	      POP DPH
		POP DPL
		POP ACC
		RETI


        
;--------------------------------------------------------------------
 ;---------------------------------------------------------
;点阵式 LCD(128X64)模块显示实验
;以下是公共的程序:
;----------------------------------------------------------
;执行 LCD 初始化工作
INITIAL_GLCD:
        PUSH    ACC
        MOV     A,#30H          ;功能设定
        CALL    COMMAND_GLCD
        MOV     A,#30H          ;功能设定
        CALL    COMMAND_GLCD
        MOV     A,#30H          ;功能设定
        CALL    COMMAND_GLCD
        MOV     A,#06H          ;显示器控制:游标不显示;但是字会闪烁
        CALL    COMMAND_GLCD     
        MOV     A,#01H          ;清除显示器
        CALL    COMMAND_GLCD
        MOV     A,#0CH          ;进入模式设定
        CALL    COMMAND_GLCD
        POP     ACC
        RET
       
;---------------------------------------------------------------
;检查LCD 忙碌标志
CHKBUSY_GLCD:
        PUSH    DPH
	  PUSH    DPL
        PUSH    ACC
        MOV     DPTR,#R_B_GLCD
CHK$:   MOVX    A,@DPTR
        JB      ACC.7,CHK$	  ;判别是不是忙?
        POP     ACC
        POP     DPL 
	  POP     DPH
        RET
       
;---------------------------------------------------------------
;写命令到 GLCD
COMMAND_GLCD:
        PUSH    DPH 
	  PUSH    DPL
        CALL    CHKBUSY_GLCD   ;判别是不是忙?
        MOV     DPTR,#W_C_GLCD
        MOVX    @DPTR,A		 ;写入命令 	
        POP     DPL 
	  POP     DPH
        RET
        
;---------------------------------------------------------------
;写资料到 GLCD
WRITE_GLCD:
        PUSH    DPH
	  PUSH    DPL
        CALL    CHKBUSY_GLCD   ;判别是不是忙?
        MOV     DPTR,#W_D_GLCD ;写入数据
        MOVX    @DPTR,A
        POP     DPL 
	  POP     DPH
        RET
;--------------------------------------------------------------------
;清除 LCD 的显示幕
CLEAR_GLCD:
        PUSH    ACC
        MOV     A,#01H          ;清除显示器
        CALL    COMMAND_GLCD
        POP     ACC
        RET
;--------------------------------------------------------------------
;将 ACC 内容,以十六进制值显示
HEX_LCD:
        PUSH    DPH
        PUSH    DPL
        PUSH    ACC
	  PUSH    ACC
        SWAP    A               ;高低四位元交换
        ANL     A,#0FH          ;留下低四位元
        MOV     DPTR,#ASCII_CODE ;DPTR 指到 ASCII_CODE
        MOVC    A,@A+DPTR       ;取得 ASCII 码
        CALL    WRITE_GLCD     ;写到 LCD
        POP     ACC
        ANL     A,#0FH          ;留下低四位元
        MOVC    A,@A+DPTR       ;取得 ASCII 码
        CALL    WRITE_GLCD     ;写到 LCD
        POP     ACC
        POP     DPL
        POP     DPH 
        RET
ASCII_CODE:     DB     '0123456789ABCDEF'
;--------------------------------------------
;延时子程序
DELAY:      	PUSH  TIMER1;         延时TIMER1*1 ms for 12MHz
	  		PUSH  TIMER0
DELAY1:     	MOV   TIMER0,#250    ;循环一次需要4个机器周期,时间为4*1μS
DELAY2:     	NOP			;		 1个周期
            	NOP			;		 1个周期	
            	DJNZ  TIMER0,DELAY2  ;2个周期
	 		DJNZ  TIMER1,DELAY1
	      	POP   TIMER0
	        	POP   TIMER1
            	RET
            	NOP;--------------------
DELAY01:    	NOP;                  延时 1 ms
            	PUSH  TIMER1
           		MOV   TIMER1,#01H
            	LCALL DELAY
            	POP   TIMER1
            	RET
            	NOP;--------------------
DELAY10:    	NOP;                 延时 10 ms
            	PUSH  TIMER1
           		MOV   TIMER1,#10
            	LCALL DELAY
            	POP   TIMER1
            	RET
           		NOP;---------------------
DELAY100:   	NOP;                 延时100 ms
            	PUSH  TIMER1
           		MOV   TIMER1,#100
           		LCALL DELAY
           		POP   TIMER1
           		RET
           		NOP;---------------------
DELAY250:  		NOP;		        延时 250 ms
	 		PUSH  TIMER1
	 		MOV	TIMER1,#250
	 		LCALL DELAY
			POP   TIMER1
	  		RET
	 		NOP;---------------------
DELAY500: 		NOP;		       延时 500 ms
	  		PUSH  TIMER1
	  		MOV	TIMER1,#250
	  		LCALL	DELAY
	  		LCALL DELAY
	  		POP   TIMER1
	  		RET
	  		NOP;---------------------
DELAY1S:    	NOP;	      	延时 1 sec
	 		PUSH  TIMER1
	  		MOV	TIMER1,#250
	  		LCALL	DELAY
	 		LCALL	DELAY
	  		LCALL DELAY
	 		LCALL DELAY
	  		POP   TIMER1
	  		RET
	  		NOP;---------------------



END
      

END

⌨️ 快捷键说明

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