T_RST BIT P3.4 ;实时时钟复位线引脚T_CLK BIT P3.5 ;实时时钟时钟线引脚T_IO BIT P3.6 ;实时时钟数据线引脚E BIT P2.2RW BIT P2.1RS BIT P2.0SL_BIT EQU 26H ;秒低位SH_BIT EQU 27H ;秒高位ML_BIT EQU 28H ;分低位MH_BIT EQU 29H ;分高位HL_BIT EQU 2AH ;时低位HH_BIT EQU 2BH ;时高位SEC EQU 30HMIN EQU 31HHOUR EQU 32HDS1302_ADDR EQU 5EHDS1302_DATA EQU 5FHORG 0000HLJMP MAINORG 0003HLJMP INT_INT0ORG 0013HLJMP INT_INT1ORG 0100HMAIN:MOV SP,#60HMOV HOUR,#12HMOV MIN,#0MOV SEC,#0Setb px1SETB IT0SETB EX0SETB IT1SETB EX1SETB TR1MOV TMOD,#10HSETB EALCALL START ;对LCD初始化SETB F0 ;F0为1时时钟,为0时秒表LCALL WR1302;LCALL RD1302AGAIN1: LCALL DISP;调显示LCALL RD1302;LCALL DISP;调显示LJMP AGAIN1INT_INT0: MOV R1,#0MOV R2,#0MOV R3,#0CLR F0LCALL DISP1;调显示MS1: JB P3.2 ,MSOVER;判断切换MOV TH1, #0D8HMOV TL1, #0F0HAGAIN: JNB TF1, AGAININC R1CLR TF1LCALL DISP1;调显示CJNE R1,#99,MS1;毫秒计数MOV R1,#0INC R2CJNE R2,#59,MS1;秒计数MOV R2,#0INC R3CJNE R3,#99,MS1;分计数MOV R2, #00 ;秒MOV R1, #00 ; 毫秒MOV R3, #00;分LCALL DISP1SJMP MS1MSOVER: SETB F0RETIDISP1: ;写冒号子程序MOV A,#8AH ;冒号在1602中显示的地址LCALL WR_CMDMOV A,#3AH ;冒号?LCALL WR_DA TAMOV A,#8DH ;冒号在1602中显示的地址LCALL WR_CMDMOV A,#3AH ;冒号?LCALL WR_DA TA;写秒显示子程序MOV A,R1MOV B,#10DIV ABmov r4,a ;十位在A,个位在BMOV A,#8EH ;秒显示的位置LCALL WR_CMDmov a,r4MOV DPTR,#TABMOVC A,@A+DPTRLCALL WR_DA TAMOV A,#8FH ;秒显示的位置LCALL WR_CMDMOV A,BMOVC A,@A+DPTR;MOV P0,ALCALL WR_DA TA;写分显示子程序MOV A,R2MOV B,#10DIV ABmov r4,a ;十位在A,个位在BMOV A,#8BH ;秒显示的位置LCALL WR_CMDmov a,r4MOV DPTR,#TABMOVC A,@A+DPTR;MOV P0,ALCALL WR_DA TAMOV A,#8CH ;秒显示的位置LCALL WR_CMDMOV A,BMOVC A,@A+DPTR;MOV P0,ALCALL WR_DA TA;写时显示子程序MOV A,R3MOV B,#10DIV ABmov r4,a ;十位在A,个位在BMOV A,#88H ;秒显示的位置LCALL WR_CMDmov a,r4MOV DPTR,#TABMOVC A,@A+DPTR;MOV P0,ALCALL WR_DA TAMOV A,#89H ;秒显示的位置LCALL WR_CMDMOV A,BMOVC A,@A+DPTR;MOV P0,ALCALL WR_DA TARET;调整中断程序INT_INT1: JNB F0,AMS;对秒表操作CLR EX1LOOP0: JNB P3.1,LOOP1;调时LCALL DELAY10MS;消抖JNB P3.1,LOOP1MOV DS1302_ADDR,#80HMOVDS1302_DATA,#80H ;1302停止振荡LCALL WRITEloop10: INC HOURLCALL DELAYLCALL WR13022LCALL RD1302LCALL DISP2;调显示jNb p3.1,loop1MOV R5,HOURCJNE R5,#35,LOOP10MOV HOUR,#0; LJMP AGAIN1jb p3.1,loop10;MOV DS1302_ADDR,#80H ;开始振荡;MOV DS1302_DATA,#00H;LCALL WRITELOOP1: JNB P3.0,LOOP2 ;调分LCALL DELAY10MS;消抖JNB P3.0,LOOP2; MOV DS1302_ADDR,#80H;MOV DS1302_DATA,#80H ;1302停止振荡; LCALL WRITEloop20: INC MINLCALL DELAYLCALL WR13022LCALL RD1302LCALL DISP2;调显示jNb p3.0,loop2MOV R5,MINCJNE R5,#59,LOOP20MOV MIN,#00HMOV DS1302_ADDR,#80H ;开始振荡MOV DS1302_DATA,#00HLCALL WRITELOOP2: JB P3.3,NEXT0SJMP LOOP0NEXT0: SETB EX1RETIAMS: JNB P3.0,LOOP11MOV R1, #00 ; 秒MOV R2, #00 ;分MOV R3, #00 ;时LCALL DISP1LOOP11: JNB P3.1,LOOP22;暂停键CLR TR0JB P3.1,LOOP11SETB TR0LOOP22: JB P3.3 ,NEXT01SJMP AMSNEXT01: RETIDISP:MOV A,HOURMOV B,#10HDIV ABMOV HL_BIT,BMOV HH_BIT,AMOV A,MINMOV B,#10HDIV ABMOV ML_BIT,BMOV MH_BIT,AMOV A,SECMOV B,#10HDIV ABMOV SL_BIT,BMOV SH_BIT,AMOV A,#30H ;16进制转ASCIIORL HH_BIT, AORL HL_BIT, AORL MH_BIT, AORL ML_BIT, AORL SH_BIT, AORL SL_BIT, AMOV A, #10001000B ; LINE2LCALL WR_CMDMOV A,HH_BITLCALL WR_DA TAMOV A,HL_BITLCALL WR_DATAMOV A,#":"LCALL WR_DATAMOV A,MH_BITLCALL WR_DATAMOV A,ML_BITLCALL WR_DATAMOV A,#":"LCALL WR_DATAMOV A,SH_BITLCALL WR_DATAMOV A,SL_BITLCALL WR_DATARETDISP2: MOV A,HOURADD A,#00HDA AMOV HOUR,AMOV A,MINADD A,#00HDA AMOV MIN,AMOV A,SECADD A,#00HDA AMOV SEC,A;写冒号子程序MOV A,#8AH ;冒号在1602中显示的地址LCALL WR_CMDMOV A,#3AH ;冒号?LCALL WR_DA TAMOV A,#8DH ;冒号在1602中显示的地址LCALL WR_CMDMOV A,#3AH ;冒号?LCALL WR_DA TA;写秒显示子程序MOV A,SECMOV B,#10HDIV ABmov r4,a ;十位在A,个位在BMOV A,#8EH ;秒显示的位置LCALL WR_CMDmov a,r4MOV DPTR,#TABMOVC A,@A+DPTRLCALL WR_DA TAMOV A,#8FH ;秒显示的位置LCALL WR_CMDMOV A,BMOVC A,@A+DPTR;MOV P0,ALCALL WR_DA TA;写分显示子程序MOV A,MINMOV B,#10HDIV ABmov r4,a ;十位在A,个位在BMOV A,#8BH ;秒显示的位置LCALL WR_CMDmov a,r4MOV DPTR,#TABMOVC A,@A+DPTR;MOV P0,ALCALL WR_DA TAMOV A,#8CH ;秒显示的位置LCALL WR_CMDMOV A,BMOVC A,@A+DPTR;MOV P0,ALCALL WR_DA TA;写时显示子程序MOV A,HOURMOV B,#10HDIV ABmov r4,a ;十位在A,个位在BMOV A,#88H ;秒显示的位置LCALL WR_CMDmov a,r4MOV DPTR,#TABMOVC A,@A+DPTR;MOV P0,ALCALL WR_DA TAMOV A,#89H ;秒显示的位置LCALL WR_CMDMOV A,BMOVC A,@A+DPTR;MOV P0,ALCALL WR_DA TARETWR1302:MOV DS1302_ADDR,#8EHMOV DS1302_DATA,#00H ;允许写1302LCALL WRITEMOV DS1302_ADDR,#80HMOV DS1302_DA TA,#80H ;1302停止振荡LCALL WRITEMOV DS1302_ADDR,#84H ;时写入1302MOV DS1302_DATA,HOURLCALL WRITEMOV DS1302_ADDR,#82H ;分写入1302MOV DS1302_DATA,MINLCALL WRITEMOV DS1302_ADDR,#80H ;秒写入1302MOV DS1302_DATA,SECLCALL WRITEANL A,#7FH ;开启晶振MOV DS1302_ADDR,#80HMOV DS1302_DATA,ALCALL WRITERETWR13022: MOV DS1302_ADDR,#8EHMOV DS1302_DATA,#00H ;允许写1302LCALL WRITE;MOV DS1302_ADDR,#80H;MOV DS1302_DATA,#80H ;1302停止振荡; LCALL WRITEMOV DS1302_ADDR,#84H ;时写入1302MOV DS1302_DATA,HOURLCALL WRITEMOV DS1302_ADDR,#82H ;分写入1302MOV DS1302_DATA,MINLCALL WRITEMOV DS1302_ADDR,#80H ;秒写入1302MOV DS1302_DATA,SECLCALL WRITERETWRITE:CLR T_CLKNOPSETB T_RSTNOPMOV A,DS1302_ADDRMOV R4,#8WRITE1:RRC ANOPNOPCLR T_CLKNOPNOPNOPMOV T_IO,CNOPNOPNOPSETB T_CLKNOPNOPDJNZ R4,WRITE1CLR T_CLKNOPMOV A,DS1302_DA TAMOV R4,#8WRITE2:RRC ANOPCLR T_CLKNOPNOPMOV T_IO,CNOPNOPNOPSETB T_CLKNOPNOPDJNZ R4,WRITE2CLR T_RSTRETRD1302:MOV DS1302_ADDR,#85H ;时读出LCALL READMOV HOUR,DS1302_DATAMOV DS1302_ADDR,#83H ;分读出LCALL READMOV MIN,DS1302_DATAMOV DS1302_ADDR,#81H ;秒读出LCALL READMOV SEC,DS1302_DA TARETREAD:CLR T_CLKNOPNOPSETB T_RSTNOPMOV A,DS1302_ADDRMOV R4,#8READ1:RRC AMOV T_IO,CNOPNOPNOPSETB T_CLKNOPNOPNOPCLR T_CLKNOPNOPDJNZ R4,READ1MOV R4,#8READ2:CLR T_CLKNOPNOPNOPMOV C,T_IONOPNOPNOPNOPNOPRRC ANOPNOPNOPNOPSETB T_CLKNOPDJNZ R4,READ2MOV DS1302_DATA,ACLR T_RSTRETSTART:MOV A, #01HLCALL WR_CMD ;清屏MOV A, #38HLCALL WR_CMD ;8位数据,16X2,5X7点阵MOV A, #0CHLCALL WR_CMD ;开显示,关光标,不闪烁MOV A, #06HLCALL WR_CMD ;读写字符时地址+1,整屏不移动RETWR_CMD:MOV P0, ACLR RS ;写入控制命令CLR RWCLR ELCALL BUSYSETB ELCALL DL_40URETWR_DATA:MOV P0, ASETB RS ;写入数据CLR RWCLR ELCALL BUSY ;判断液晶模块是否忙?SETB ELCALL DL_40URETBUSY: ;查看LCD是否忙MOV P0,#0FFHCLR RSSETB RWCLR ENOPSETB EJB P0.7,BUSY ;如果P0.7为高电平表示忙就循环等待DL_40U: MOV R5, #20 ;延时40USDJNZ R5, $MOV R5,#20RETDELAY: mov r7,#100aa2: MOV R0, #20AA1: MOV R6, #250DJNZ R6, $DJNZ R0, AA1djnz r7,aa2MOV R6,#250MOV R0,#20RETDELAY10MS: MOV R0, #20AA: MOV R6, #250DJNZ R6, $DJNZ R0, AAMOV R6,#250MOV R0,#20RETTAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H ;0~9液晶显示END。