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

📄 wds12887.asm

📁 C8051F.rar
💻 ASM
字号:
;参考程序A.汇编程序WDS12887.ASM. 程序功能:读取时钟值,并将时,分,秒显示在
;数码管上. 可以实现时钟初始化(授时)操作.
;运行初始化程序DS12INIT之前,要先用当前时间值(年、月、日、时、分、秒)改
;写DS12887的时间寄存器(0000H~0009H)内的数据,见表XX。要先修改程序中的
;初始化子程序DS12INIT中的当前时间值,并在主程序WDS12887.ASM中将< ; Lcall  
 ;DS12INIT>语句的<;>取消(即运行初始化子程序DS12INIT),主程序即被修改成为时
;钟初始化程序.完成初始化后,再将< ; Lcall   DS12INIT>语句的<;>加上(即注销初
;始化子程序),即可恢复主程序WDS12887.ASM.再次运行主程序,就可以实现实时时钟
;在六位数码管上显示.  

;WDS12887.ASM.
$INCLUDE (C8051F020.inc)
 CS12887      	EQU	8300H    ;时钟DS12887的端口地址
 CS12887A     	EQU	830AH    ;
 CS12887B     	EQU	830BH
CS12887C       EQU  830CH
 PPA 	          EQU 	8000H    ;8255的端口地址
 PPB 	          EQU 	8001H
 PPC 	         EQU 	8002H
 CWR             EQU   8003H 
             ORG    0 
STAR: MOV   WDTCN,#0DEH   ;关闭看门狗
	  MOV   WDTCN,#0ADH
MOV   0E3H,#40H; /*使能交叉开关,弱上拉*/
      MOV   0B5H,#0C0H  ;/*设置P7为推拉模式,P4,P5,P6为漏极开路
      MOV   0A3H,#2CH ;/*EMIF工作在地址/数据复用方式,只用外部存储器,
;ALE高/低脉宽占1个SYSCLK周期*/
      MOV   0A1H,#6DH    ;/*地址建立/保持时间占1个SYSCLK周期,
;/WR和/RD占12个SYSCLK周期*/
       ACALL   C8255   ;8255初始化
     ; Lcall   DS12INIT   ; DS12887初始化,授时:设定初始值:年,月,日,时,分,秒
MAIN: Lcall   DS12T    ;从DS12887读出当前时钟值:年,月,日,时,分,秒
	  LCALL   EXCHANG   ;变换数据存放格式
       LCALL   DISPLED   ;用六位数码管显示时,分,秒
      AJMP    MAIN
			DS12INIT: MOV   DPTR,#CS12887B
          MOV    A, #080H          ;设置 SET=1,禁止时间更新       
          MOVX    @DPTR,A         
          MOV    DPTR,#CS12887    ;CS12887=8F00H
          MOV    A,#00H           ;写入当前秒值:"00"
          MOVX   @DPTR,A      
          INC    DPTR
          MOV    A,#0FFH          ;NONE ALARM秒不报警(不闹秒)
          MOVX   @DPTR,A
          INC    DPTR
          MOV    A,#30H
          MOVX   @DPTR,A          ; 写入当前分值:"30"分
          INC    DPTR  
          MOV    A,#0FFH
          MOVX   @DPTR,A          ;NONE  ALARM 分不报警(不闹分)
          INC    DPTR
          MOV    A,#11H
          MOVX   @DPTR,A          ; 写入当前时值:"11"时 ;HOURS
          INC   DPTR
          MOV   A,#0FFH           ;NONE  HOUR ALARM时不报警(不闹时)
          MOVX  @DPTR,A
          INC   DPTR
          MOV   A,#5H             ;DAY OF THE WEEK写入当前周日:"6"
          MOVX  @DPTR,A
          INC   DPTR
          MOV   A,#24H
          MOVX  @DPTR,A          ;DATA OF THE MONTH写入当前日期:"24"
          INC   DPTR
          MOV   A,#08H
          MOVX  @DPTR,A          ;MONTH    写入当前月份:"09"月
          INC   DPTR
          MOV   A,#05            ;YEAR  写入当前年份:"  05 "年 
          MOVX  @DPTR,A
          MOV   DPTR,#CS12887C   ;CS12887C=830CH
          MOVX  A,@DPTR          ;CLEAR   C
          INC   DPTR
          MOVX  A,@DPTR          ;CLEAR  D
          MOV   DPTR,#CS12887B  ;更新周期正常运行,禁止中断,BCD码格式,24小时制
          MOV   A,#02H          ;不用夏时制
          MOVX  @DPTR,A
          RET

;读出年、月、日、时、分、秒及周日的子程序DS12T:
DS12T:	ACALL	TDU ;读出DS12887时钟数据,存放在外部SRAM(62256)的00-09H单元中.  
	RET
RD0:	MOV 	DPTR,#CS12887A  ;从DS12887读出数据,先判更新周期结束否?查询UIP位
	MOVX	A,@DPTR          ; UIP=0,时钟更新周期已结束.
	JBC	ACC.7,RD0        ; UIP=1,时钟更新周期未结束.
	RET
TDU:	ACALL	RD0
	MOV	R0,#0H            
	MOV	DPTR,#CS12887
RR0:	MOVX	A,@DPTR
	MOV	P6,#0           ;从DS12887读出数据:年,月,日,时,分,秒,存如片外RAM(62256),
	MOVX	@R0,A            ;的00H--09H单元中去
	INC 	DPTR
	INC	R0
	CJNE	R0,#9,RR0
	MOV	DPTR,#CS12887A
	MOV	A,#20H
	MOVX	@DPTR,A
	INC	DPTR
	INC	DPTR
	MOVX	A,@DPTR
	INC	DPTR
	MOVX	A,@DPTR
	MOV	DPTR,#CS12887B
	MOV	A,#02H        ;设定24小时制,禁止中断,禁止报警
	MOVX	@DPTR,A
	RET

;数据转换子程序
EXCHANG: MOV   DPTR,#0009H  ;外部SRAM的09单元中.存放年(YEAR)的压缩BCD码;
	     MOV      R0,#7DH          ;(00  05);7CH-7DH 中存十年、年(BCD码)
	     LCALL    YMD 
	    MOV    DPTR,#0008H ;外部SRAM的08单元中.存放月(MONTH)的压缩BCD码;
	    MOV      R0,#7BH          ;7BH-7AH存月份(BCD码)
	    LCALL    YMD 
	    MOV      DPTR,#0007H ;外部SRAM的07单元中存放日(DATE)的压缩BCD码
	    MOV      R0,#79H           ;79H-78H存日期(BCD码)
	    LCALL    YMD 
	   MOV     DPTR,#0006H       ;外部SRAM的06单元中存放周日的压缩BCD码
	   MOVX    A,@DPTR            ;77H存周日(BCD码)
       MOV     77H,A
	   MOV	 DPTR,#0004H;将外扩SRAM 04H单元内存放时的压缩BCD码的值传给
	   MOV     R0,#72h          ;72H~71H存时值(BCD码)
	   LCALL   YMD
	   MOV     DPTR, #0002 ;外部SRAM的02单元中存放分(MINUTE)的压缩BCD码
	   MOV     R0, #74H         ;74H~73H存分值(BCD码)
	   LCALL   YMD
	   MOV     DPTR, #0000H;外部SRAM的00单元中存放秒(SECOND)的压缩BCD码
	   MOV	 R0, #76H         ;76H-75H存秒值(BCD码)
	   LCALL   YMD
	   RET	
YMD: MOVX A,@DPTR 
;YMD将压缩BCD码(一字节存两位数)转化为BCD码(一字节存一位数)
	 MOV     B,A
	 ANL	 A, #0FH
	 MOV	 @R0, A
	 DEC     R0
	 MOV     A ,B
	 SWAP    A
	 ANL	 A, #0FH
	 MOV     @R0,A
	 RET 
;显示功能子程序,要显示的数据在内部RAM的71H--76H 中(BCD码)
DISPLED:  ACALL   C8255
          MOV	R2,#01H
          MOV	R5,#6
	      MOV	R0,#71H
DSP1:	  MOV	DPTR,#PPB
	      MOV	A,R2
	      MOVX	@DPTR,A
	      MOV	A,@R0
          ANL  A,#0FH
DSP2:	  MOV	DPTR,#BCD
     	  MOVC	A,@A+DPTR
          MOV   B,A
          MOV	DPTR,#PPC
          MOV   A,R5
          ANL   A,#1
          CJNE A,#1,SS0
          MOV  A,B
          ADD   A,#80H
          AJMP   SS1
 SS0:     MOV   A,B
 SS1:     MOVX	@DPTR,A
	      ACALL   DEL0
	      MOV	A,R2
    	  RL	A
	      MOV	R2,A
	    INC	R0
	    DJNZ	R5,DSP1
	    RET
BCD:    DB      3FH,06H,5BH,4FH ;显示数值,0,1,2,3
        DB      66H,6DH,7DH,07H           ;4,5,6,7
	DB 	7FH,6FH,77H,7CH           ;8,9,A,B
	DB 	39H,5EH,79H,71H           ;C,D,E,F
	DB 	73H,3EH,31H,6EH           ;P,U,Z,Y
	DB      0FFH,00H                  ;8,灭     
DEL0:MOV 08H,#0FH    ;延时子程序
TM:  MOV 07H,#20H
     DJNZ 07H,$
     DJNZ 08H,TM
     RET
;初始化8255
C8255:MOV A,#80H      ; 设置PC口,PB口为输出,PA口为输入
MOV DPTR,#8003H     ;#8003H为8255的控制寄存器地址
MOVX  @DPTR,A
RET
      end

⌨️ 快捷键说明

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