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

📄 2051 3208.asm

📁 这是一个点阵电子钟的资料
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
;<!-- saved from url=(0047)http://ctwxdc.512j.com/attachment.php?aid=19934 -->
;<HTML><HEAD>
;<META http-equiv=Content-Type content="text/html; charset=gb2312">
;<META content="MSHTML 6.00.2900.3059" name=GENERATOR></HEAD>
;<BODY><PRE>;***************************************************************************
;*                         32X8点阵显示的时钟                              *
;*                 AT89C2051/DS1302/74HC595/74LS138                        *
;*                   Builde By:Feigoo  2006.06.11                          *
;***************************************************************************
;
;*********************************修改日志**********************************
;*2006.06.12  完成主要程序的编写:读写1302和中断扫描显示
;*2006.06.16  向系统加入时间调整程序
;*2006.06.18  加入闪烁显示程序,在调整时间时相应位闪烁显示。
;*2006.06.18  基本完成
;**********************************伪定义***********************************
		SCLK_1302 EQU P3.2
		  IO_1302 EQU P3.3
		 RST_1302 EQU P3.4
		 
		    G_138 EQU P1.2
		  RCK_595 EQU p1.3	      

	      KEY_SETTIME EQU P3.5 
	      KEY_INC_ONE EQU P3.7
              
	      DS1302_ADDR DATA 21H
	      DS1302_DATA DATA 22H
	        HOUR_1302 DATA 23H
	      MINUTE_1302 DATA 24H
	      SECOND_1302 DATA 25H

               HOUR_FLASH DATA 28H
             MINUTE_FLASH DATA 29H
             INTT1_CONTER DATA 27H
                         
              HOUR_SHIWEI DATA 18H
               HOUR_GEWEI DATA 19H
            MINUTE_SHIWEI DATA 1AH
             MINUTE_GEWEI DATA 1BH
            SECOND_SHIWEI DATA 1CH
             SECOND_GEWEI DATA 1DH

;定义30H-4FH为显示更新缓存,50H-6FH为显示缓存	                   
;内存单元26H被T0中断(扫描显示)占用,不可再使用	
;内存单元20H的00H、01H被用作标志位                
;*********************************程序入口**********************************
		       ORG    0000H
		       LJMP   START
		       ORG    0003H
	           RETI
	           ORG    000BH
	           LJMP   INTT0
	           ORG    0013H
	           RETI
	           ORG    001BH
	           LJMP   INTT1
	           ORG    0023H
	           RETI
	           ORG    002BH
	           RETI  
;*********************************程序开始**********************************
START:     MOV    DS1302_ADDR,#8EH
           MOV    DS1302_DATA,#80H    ;禁止写1302 ,#00H,允许
           LCALL  WRITE_1302
           MOV    SP,#70H
		   MOV    A,#00H
		   MOV    R0,#30H
		   MOV    R1,#64
CLEARNMEMORY:	   MOV    @R0,A
		           INC    R0
		           DJNZ   R1,CLEARNMEMORY
		           MOV    SCON,#00H
		           MOV    TMOD,#11H
		           MOV    TH0,#0F8H
		           MOV    TL0,#30H
		           MOV    DS1302_ADDR,#8EH
                   MOV    DS1302_DATA,#00H    ;允许写1302 ,#80,禁止
                   LCALL  WRITE_1302
                   MOV    DS1302_ADDR,#90H
                   MOV    DS1302_DATA,#0A7H ;1302充电充电电流1.1MA;#A5:2.2MA,#A7:0.6MA
                   LCALL  WRITE_1302
                   MOV    DS1302_ADDR,#80H
                   MOV    DS1302_DATA,#00H ;1302晶振开始振荡;#80H,禁止
                   LCALL  WRITE_1302
		           SETB   PT0
		           SETB   ET0
                   SETB   ET1
                   SETB   EA
		           SETB   TR0
;**********************************主程序***********************************	
MAIN:		       MOV    DS1302_ADDR,#85H              ;读出小时
                   LCALL  READ_1302
                   MOV    HOUR_1302,DS1302_DATA
                   MOV    DS1302_ADDR,#83H              ;读出分钟
                   LCALL  READ_1302
                   MOV    MINUTE_1302,DS1302_DATA
                   MOV    DS1302_ADDR,#81H              ;读出秒
                   LCALL  READ_1302
                   MOV    SECOND_1302,DS1302_DATA      
		           LCALL  DISPLAY_RAM_WORK
		           JNB    KEY_SETTIME,KEY_QUDOU		   
		           LJMP   MAIN
KEY_QUDOU:	   LCALL  DELAY3MS
	           LCALL  DELAY3MS	           
	           JNB    KEY_SETTIME,SETTIME_START1
	           LJMP   MAIN
SETTIME_START1:LCALL  DELAY3MS
		       JNB    KEY_SETTIME,SETTIME_START1
               AJMP   SETTIME_START
;*******************************时间设置程序********************************
;*用于调整1302时间
;*用了按键消抖和等待释放,每按一下只能加一
;***************************************************************************
SETTIME_START:     MOV    INTT1_CONTER,#04H
                   SETB   TR1
		           CLR    01H 
		           MOV    DS1302_ADDR,#8EH
                   MOV    DS1302_DATA,#00H  ;允许写1302
                   LCALL  WRITE_1302
                   MOV    DS1302_ADDR,#80H
                   MOV    DS1302_DATA,#80H  ;1302停止振荡
                   LCALL  WRITE_1302
                   MOV    HOUR_FLASH,HOUR_1302
                   MOV    MINUTE_FLASH,MINUTE_1302
SETTIME:           JNB    KEY_INC_ONE,INC_HOUR_QUDOU
                   JNB    KEY_SETTIME,SET_MINUTE1                   
                   AJMP   SETTIME
INC_HOUR_QUDOU:    LCALL  DELAY3MS
		           LCALL  DELAY3MS
		           JNB    KEY_INC_ONE,INC_HOUR11     
                   AJMP   SETTIME
INC_HOUR11:        JNB    KEY_INC_ONE,INC_HOUR11                   
INC_HOUR:          MOV    R7,HOUR_FLASH
		           LCALL  SETTIME_ADD_1
		           CLR    C
		           MOV    R7,A
		           SUBB   A,#24H   ;                   这里要用24H而不是24,因为前面已经用了DAA
		           JC     INC_HOUR_RIGHT
                   MOV    R7,#00H
INC_HOUR_RIGHT:    MOV    HOUR_1302,R7
		           MOV    HOUR_FLASH,R7
		           MOV    DS1302_ADDR,#84H          ;小时值送人1302
                   MOV    DS1302_DATA,HOUR_1302
                   LCALL  WRITE_1302
		           LCALL  DISPLAY_RAM_WORK
		           AJMP   SETTIME
SET_MINUTE1:       LCALL  DELAY3MS
		           LCALL  DELAY3MS
	               JNB    KEY_SETTIME,SET_MINUTE2
	               AJMP   SETTIME
SET_MINUTE2:	   LCALL  DELAY3MS
		           JNB    KEY_SETTIME,SET_MINUTE2		           
SET_MINUTE:        SETB   01H
                   JNB    KEY_INC_ONE,INC_MINUTE_QUDOU
                   JNB    KEY_SETTIME,SET_RETURN
                   AJMP   SET_MINUTE
INC_MINUTE_QUDOU:  LCALL  DELAY3MS
		           LCALL  DELAY3MS
                   JNB    KEY_INC_ONE,INC_MINUTE11
                   AJMP   SET_MINUTE
INC_MINUTE11:      JNB    KEY_INC_ONE,INC_MINUTE11                   
INC_MINUTE:        MOV    R7,MINUTE_FLASH
		           LCALL  SETTIME_ADD_1 
		           MOV    R7,A
		           CLR    C
		           SUBB   A,#60H  ;这里要用60H而不是60,因为前面已经用了DAA
		           JC     INC_MINUTE_RIGHT
		           MOV    R7,#00H
INC_MINUTE_RIGHT:  MOV    MINUTE_1302,R7
		           MOV    MINUTE_FLASH,R7
		           MOV    DS1302_ADDR,#82H         ;分钟值送人1302
                   MOV    DS1302_DATA,MINUTE_1302
                   LCALL  WRITE_1302
		           LCALL  DISPLAY_RAM_WORK	
		           AJMP   SET_MINUTE
SET_RETURN:        LCALL  DELAY3MS
		           LCALL  DELAY3MS
		           JNB    KEY_SETTIME,SET_OK_RETURN
		           AJMP   SET_MINUTE
SET_OK_RETURN:     LCALL  DELAY3MS
		           JNB    KEY_SETTIME,SET_OK_RETURN		   	                 
		           CLR    TR1
		           MOV    DS1302_ADDR,#80H
                   MOV    DS1302_DATA,#00H       ;1302晶振开始振荡
                   LCALL  WRITE_1302
                   MOV    DS1302_ADDR,#8EH
                   MOV    DS1302_DATA,#80H       ;禁止写入1302
                   LCALL  WRITE_1302
		           LJMP   MAIN

;*****************************显示缓存更新程序******************************	
;*将DS1302读出数据分离,并且查表更新显示缓存。
;*由于实际字模为4*7点阵,某些缓存要显示1.5-2个字模数据,利用此程序来处理。
;*显示缓存地址30H-4FH,计32个数据
;*使用了寄存器R0-R6
;***************************************************************************
;以下将DS1302读出数据进行个位和十位分离,分别存放不同地址  
DISPLAY_RAM_WORK:  MOV    R1,SECOND_1302                ;秒钟分离
                   LCALL  DIVIDE_1302
                   MOV    SECOND_SHIWEI,R2
                   MOV    SECOND_GEWEI,R3
                   MOV    R1,MINUTE_1302                ;分钟分离
                   LCALL  DIVIDE_1302
                   MOV    MINUTE_SHIWEI,R2
                   MOV    MINUTE_GEWEI,R3
                   MOV    R1,HOUR_1302                  ;小时分离
                   LCALL  DIVIDE_1302
                   MOV    HOUR_SHIWEI,R2
                   MOV    HOUR_GEWEI,R3
;以下将DS1302读出数据查表存入显示更新缓存
;以下对小时十位处理                   
                   MOV    A,HOUR_SHIWEI
                   MOV    B,#08H
                   MUL    AB
                   MOV    R2,A
                   MOV    R1,#30H                ;显示更新缓存首地址
                   MOV    R3,#00H
                   MOV    R4,#08H
HOURSHI_GORAM:     MOV    A,R2
                   ADD    A,R3
                   MOV    DPTR,#TABLE1
                   MOVC   A,@A+DPTR
                   SWAP   A
                   MOV    @R1,A
                   INC    R1
                   INC    R3
                   DJNZ   R4,HOURSHI_GORAM
;以下对交叉数据缓存处理		   
		           MOV    A,#0FFH    ;将交叉数据缓存全部置FF,以备下次使用
		           MOV    R0,#10H
		           MOV    R1,#08H
CLEARNSHUJUJIAOC1: MOV    @R0,A
		           INC    R0
		          DJNZ   R1,CLEARNSHUJUJIAOC1                   
;以下对小时个位处理                   
                   MOV    A,HOUR_GEWEI
                   MOV    B,#08H
                   MUL    AB
                   MOV    R2,A
                   MOV    R3,#00H     
                   MOV    R1,#30H    ;显示更新缓存首地址  
                   MOV    R0,#10H    ;一些交叉数据的缓存首地址,从10H-17H
                   MOV    R4,#08H
HOURGE_GORAM:      MOV    A,R2                           
		   ADD    A,R3
		   MOV    DPTR,#TABLE1
		   MOVC   A,@A+DPTR
		   RRC    A          ;将查表得到数据右移一位,
		   MOV    R6,A
		   MOV    A,@R0
		   RRC    A          ;移出位存入交叉数据缓存
		   MOV    @R0,A 
		   MOV    A,R6
		   ANL    A,#0FH     ;屏蔽高四位
		   MOV    R6,A   
		   MOV    A,@R1      ;取出30H地址原来的数据,即小时的十位
		   ANL    A,#0F0H    ;屏蔽低四位
		   ORL    A,R6       ;将两个数据组合
		   MOV    @R1,A      ;送回显示更新缓存
		   INC    R0
		   INC    R1
		   INC    R3
		   DJNZ   R4,HOURGE_GORAM
;以下对小时和分钟之间的冒号处理		   
		   MOV    R3,#00H
		   MOV    R1,#38H   ;显示更新缓存地址
		   MOV    R0,#10H   ;一些交叉数据的缓存首地址,从10H-17H
		   MOV    R4,#08H
MAOHAO_GORAM:MOV    DPTR,#TABLE2
		   MOV    A,R3
		   MOVC   A,@A+DPTR
		   MOV    R6,A
		   MOV    A,@R0
		   ANL    A,R6
		   MOV    @R1,A
		   INC    R0
		   INC    R1
		   INC    R3
		   DJNZ   R4,MAOHAO_GORAM
;以下对交叉数据缓存处理			   
		   MOV    A,#0FFH    ;将交叉数据缓存全部置FF,以备下次使用
		   MOV    R0,#10H
		   MOV    R1,#08H
CLEARNSHUJUJIAOC:  MOV    @R0,A
		   INC    R0
		   DJNZ   R1,CLEARNSHUJUJIAOC
;以下对分钟十位处理		   
		   MOV    A,MINUTE_SHIWEI
		   MOV    B,#08H
		   MUL    AB
		   MOV    R2,A
		   MOV    R3,#00H
		   MOV    R0,#10H
		   MOV    R1,#38H
		   MOV    R4,#08H
MINUTESHI_GORAM:   MOV    A,R2
		   ADD    A,R3
		   MOV    DPTR,#TABLE1
		   MOVC   A,@A+DPTR
		   RRC    A
		   MOV    R6,A
		   MOV    A,@R0
		   RRC    A
		   MOV    @R0,A
		   MOV    A,R6
		   RRC    A
		   MOV    R6,A

⌨️ 快捷键说明

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