T_CLK BIT P3.5 ;实时时钟时钟线引脚 T_IO BIT P3.6 ;实时时钟数据线引脚 E BIT P2.2 RW BIT P2.1
RS BIT P2.0
SL_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 30H MIN EQU 31H
HOUR EQU 32H
DS1302_ADDR EQU 5EH DS1302_DATA EQU 5FH ORG 0000H LJMP MAIN
ORG 0003H
LJMP INT_INT0
ORG 0013H
LJMP INT_INT1 ORG 0100H MAIN:
MOV SP,#60H MOV HOUR,#12H MOV MIN,#0 MOV SEC,#0 Setb px1
SETB IT0 SETB EX0
SETB IT1 SETB EX1
SETB TR1
MOV TMOD,#10H
SETB EA
LCALL START ;对LCD初始化
SETB F0 ;F0为1时时钟,为0时秒表 LCALL WR1302 ;LCALL RD1302 AGAIN1: LCALL DISP;调显示 LCALL RD1302 ;LCALL DISP;调显示
LJMP AGAIN1 INT_INT0: MOV R1,#0 MOV R2,#0 MOV R3,#0
CLR F0
LCALL DISP1;调显示 MS1: JB P3.2 ,MSOVER;判断切换
显示的地址
显示的地址
AGAIN:
MSOVER: DISP1: MOV TH1, #0D8H MOV TL1, #0F0H JNB TF1, AGAIN INC R1 CLR TF1
LCALL DISP1;调显示 CJNE R1,#99,MS1;毫秒计数 MOV R1,#0 INC R2 CJNE R2,#59,MS1;秒计数 MOV R2,#0
INC R3
CJNE R3,#99,MS1;分计数 MOV R2, #00 ;秒 MOV R1, #00 ; 毫秒 MOV R3, #00;分
LCALL DISP1 SJMP MS1
SETB F0 RETI ;写冒号子程序 MOV A,#8AH ;冒号在1602中 LCALL WR_CMD
MOV A,#3AH ;冒号? LCALL WR_DATA
MOV A,#8DH ;冒号在1602中 LCALL WR_CMD
MOV A,#3AH ;冒号? LCALL WR_DATA;写秒显示子程序 MOV A,R1
MOV B,#10 DIV AB mov r4,a ;十位在A,个位在
B
MOV A,#8EH ;秒显示的位置 LCALL WR_CMD mov a,r4
MOV DPTR,#TAB MOVC A,@A+DPTR
LCALL WR_DATA MOV A,#8FH ;秒显示的位置 B
B
LCALL WR_CMD MOV A,B
MOVC A,@A+DPTR ;MOV P0,A LCALL WR_DATA ;写分显示子程序 MOV A,R2
MOV B,#10 DIV AB mov r4,a MOV A,#8BH LCALL WR_CMD mov a,r4
MOV DPTR,#TAB
MOVC A,@A+DPTR
;MOV P0,A LCALL WR_DATA MOV A,#8CH LCALL WR_CMD MOV A,B
MOVC A,@A+DPTR ;MOV P0,A LCALL WR_DATA ;写时显示子程序 MOV A,R3 MOV B,#10
DIV AB mov r4,a MOV A,#88H LCALL WR_CMD mov a,r4
MOV DPTR,#TAB MOVC A,@A+DPTR
;十位在A,个位在 ;秒显示的位置 ;秒显示的位置 ;十位在A,个位在 ;秒显示的位置 ;MOV P0,A
LCALL WR_DATA MOV A,#89H ;秒显示的位置 LCALL WR_CMD MOV A,B
MOVC A,@A+DPTR ;MOV P0,A LCALL WR_DATA
DS1302_DATA,#80H
jb p3.1,loop10
停止振荡
RET
;调整中断程序
INT_INT1: JNB F0,AMS;对秒表操作 CLR EX1 LOOP0: JNB P3.1,LOOP1;调时 LCALL DELAY10MS;消抖
JNB P3.1,LOOP1
MOV DS1302_ADDR,#80H
MOV 停止振荡 LCALL WRITE
loop10: INC HOUR
LCALL DELAY LCALL WR13022 LCALL RD1302
LCALL DISP2;调显示 jNb p3.1,loop1
MOV R5,HOUR
CJNE R5,#35,LOOP10
MOV HOUR,#0
; LJMP AGAIN1
;MOV DS1302_ADDR,#80H ;开始振荡
;MOV DS1302_DATA,#00H ;LCALL WRITE LOOP1: JNB P3.0,LOOP2 ;调分 LCALL DELAY10MS;消抖
JNB P3.0,LOOP2
; MOV DS1302_ADDR,#80H
;MOV DS1302_DATA,#80H ;1302 ; LCALL WRITE
;1302 loop20: INC MIN
LCALL DELAY
LCALL WR13022 LCALL RD1302
LCALL DISP2;调显示
荡
jNb p3.0,loop2 MOV R5,MIN
CJNE R5,#59,LOOP20
MOV MIN,#00H
MOV DS1302_ADDR,#80H ;开始振
MOV DS1302_DATA,#00H LCALL WRITE LOOP2: JB P3.3,NEXT0
SJMP LOOP0
NEXT0: SETB EX1 RETI
AMS: JNB P3.0,LOOP11 MOV R1, #00 ; 秒 MOV R2, #00 ;分
MOV R3, #00 ;时
LCALL DISP1
LOOP11: JNB P3.1,LOOP22;暂停键 CLR TR0 JB P3.1,LOOP11
SETB TR0
LOOP22: JB P3.3 ,NEXT01 SJMP AMS NEXT01: RETI
DISP:
MOV A,HOUR MOV B,#10H DIV AB
MOV HL_BIT,B MOV HH_BIT,A
MOV A,MIN MOV B,#10H DIV AB MOV ML_BIT,B MOV MH_BIT,A
MOV A,SEC
MOV B,#10H DIV AB
MOV SL_BIT,B MOV SH_BIT,A
MOV A,#30H ;16进制转ASCII
ORL HH_BIT, A ORL HL_BIT, A ORL MH_BIT, A ORL ML_BIT, A ORL SH_BIT, A ORL SL_BIT, A
MOV A, #10001000B LCALL WR_CMD MOV A,HH_BIT LCALL WR_DATA MOV A,HL_BIT LCALL WR_DATA MOV A,#\":\"
LCALL WR_DATA MOV A,MH_BIT LCALL WR_DATA MOV A,ML_BIT LCALL WR_DATA
MOV A,#\":\"
LCALL WR_DATA MOV A,SH_BIT LCALL WR_DATA MOV A,SL_BIT LCALL WR_DATA RET DISP2: MOV A,HOUR ADD A,#00H DA A MOV HOUR,A MOV A,MIN ADD A,#00H
DA A
MOV MIN,A
MOV A,SEC
ADD A,#00H DA A MOV SEC,A
;写冒号子程序
; LINE2
MOV A,#8AH ;冒号在1602中显示的地址
LCALL WR_CMD
MOV A,#3AH ;冒号? LCALL WR_DATA
MOV A,#8DH ;冒号在1602中显示的地址
LCALL WR_CMD
MOV A,#3AH ;冒号? B
B
LCALL WR_DATA;写秒显示子程序 MOV A,SEC MOV B,#10H
DIV AB mov r4,a ;十位在A,个位在 MOV A,#8EH ;秒显示的位置 LCALL WR_CMD mov a,r4
MOV DPTR,#TAB MOVC A,@A+DPTR
LCALL WR_DATA MOV A,#8FH ;秒显示的位置 LCALL WR_CMD MOV A,B
MOVC A,@A+DPTR ;MOV P0,A LCALL WR_DATA ;写分显示子程序 MOV A,MIN
MOV B,#10H DIV AB mov r4,a ;十位在A,个位在 MOV A,#8BH ;秒显示的位置 LCALL WR_CMD mov a,r4
MOV DPTR,#TAB MOVC A,@A+DPTR ;MOV P0,A
LCALL WR_DATA MOV A,#8CH ;秒显示的位置 LCALL WR_CMD MOV A,B
MOVC A,@A+DPTR ;MOV P0,A LCALL WR_DATA ;写时显示子程序 MOV A,HOUR MOV B,#10H
DIV AB mov r4,a ;十位在A,个位在B
写1302
止振荡
WR1302:
MOV A,#88H ;秒显示的位置 LCALL WR_CMD mov a,r4 MOV DPTR,#TAB MOVC A,@A+DPTR
;MOV P0,A LCALL WR_DATA MOV A,#89H ;秒显示的位置 LCALL WR_CMD MOV A,B
MOVC A,@A+DPTR ;MOV P0,A LCALL WR_DATA RET MOV DS1302_ADDR,#8EH MOV DS1302_DATA,#00H ;允许LCALL WRITE
MOV DS1302_ADDR,#80H MOV DS1302_DATA,#80H ;1302停 LCALL WRITE
MOV DS1302_ADDR,#84H ;时写入1302 MOV DS1302_DATA,HOUR
LCALL WRITE
MOV DS1302_ADDR,#82H ;分写入1302 MOV DS1302_DATA,MIN LCALL WRITE
MOV DS1302_ADDR,#80H ;秒写入1302 MOV DS1302_DATA,SEC LCALL WRITE
ANL A,#7FH ;开启晶振
MOV DS1302_ADDR,#80H MOV DS1302_DATA,A LCALL WRITE RET
WR13022: MOV DS1302_ADDR,#8EH MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
停止振荡
;MOV DS1302_ADDR,#80H
;MOV DS1302_DATA,#80H ;1302 ; LCALL WRITE
MOV DS1302_ADDR,#84H ;时写入1302 MOV DS1302_DATA,HOUR LCALL WRITE
MOV DS1302_ADDR,#82H ;分写入1302 MOV DS1302_DATA,MIN LCALL WRITE
MOV DS1302_ADDR,#80H ;秒写入1302 MOV DS1302_DATA,SEC LCALL WRITE RET WRITE:
CLR T_CLK NOP
SETB T_RST
NOP
MOV A,DS1302_ADDR MOV R4,#8
WRITE1:
RRC A NOP NOP CLR T_CLK NOP NOP
NOP
MOV T_IO,C NOP NOP
NOP
SETB T_CLK NOP
NOP
DJNZ R4,WRITE1 CLR T_CLK NOP
MOV A,DS1302_DATA
MOV R4,#8 WRITE2:
RRC A
NOP 时读出
分读出
秒读出
RD1302:
READ: CLR T_CLK NOP NOP
MOV T_IO,C NOP NOP NOP
SETB T_CLK NOP NOP
DJNZ R4,WRITE2 CLR T_RST
RET MOV DS1302_ADDR,#85H LCALL READ
MOV HOUR,DS1302_DATA
MOV DS1302_ADDR,#83H LCALL READ
MOV MIN,DS1302_DATA
MOV DS1302_ADDR,#81H LCALL READ
MOV SEC,DS1302_DATA
RET CLR T_CLK NOP NOP
SETB T_RST
NOP
MOV A,DS1302_ADDR
MOV R4,#8 ;;;
READ1:
RRC A
MOV T_IO,C NOP NOP
NOP
SETB T_CLK NOP NOP 点阵
READ2:
START:
NOP
CLR T_CLK NOP
NOP
DJNZ R4,READ1
MOV R4,#8 CLR T_CLK NOP NOP NOP
MOV C,T_IO NOP NOP NOP NOP
NOP RRC A NOP NOP NOP
NOP
SETB T_CLK NOP
DJNZ R4,READ2 MOV DS1302_DATA,A CLR T_RST RET MOV A, #01H
LCALL WR_CMD ;清屏
MOV A, #38H
LCALL WR_CMD ;8位数据,16X2,5X7
MOV A, #0CH
LCALL WR_CMD ;开显示,关光标,不闪烁
MOV A, #06H
LCALL WR_CMD ;读写字符时地址+1,整屏不移动
RET
WR_CMD:
MOV P0, A
就循环等待
CLR RS ;写入控制命令 CLR RW CLR E LCALL BUSY SETB E LCALL DL_40U
RET
WR_DATA:
MOV P0, A
SETB RS ;写入数据 CLR RW
CLR E
LCALL BUSY ;判断液晶模块是否忙? SETB E LCALL DL_40U RET
BUSY: ;查看LCD是否忙 MOV P0,#0FFH CLR RS SETB RW CLR E
NOP SETB E
JB P0.7,BUSY ;如果P0.7为高电平表示忙DL_40U: MOV R5, #20 ;延时40US DJNZ R5, $
MOV R5,#20
RET DELAY: mov r7,#100 aa2: MOV R0, #20
AA1: MOV R6, #250 DJNZ R6, $ DJNZ R0, AA1 djnz r7,aa2
MOV R6,#250
MOV R0,#20 RET DELAY10MS: MOV R0, #20 AA: MOV R6, #250 DJNZ
R6, $
DJNZ R0, AA
MOV R6,#250 MOV R0,#20
TAB: 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
RET
;0~9液晶显示 END DB
因篇幅问题不能全部显示,请点此查看更多更全内容