; LCD显示时钟,第一行显示设定日期" DATE XXXX-XX-XX " ,第二行显示设定时间" TIME XX-XX-XX " ,开始时两行并列逐字;显示日期和时间,然后定格,时钟继续运行。祝亚森(0515074240),朱大三(0515074239)
RS EQU P3.0 ;写入数据(1)或指令(0)选择端
RW EQU P3.1 ;读(1)写(0)控制
E EQU P3.2; ;使能
LCD EQU P2 ;LCD数据口
BF EQU P2.7 ;忙标志
YEA1 EQU 30H ;日期储存地址
YEA2 EQU 31H
MON EQU 32H
DAY EQU 33H
HOU EQU 34H ;时间储存地址
MIN EQU 35H
SEC EQU 36H
COUNT EQU 3CB0H ;T0初值
COUNT1 EQU 20 ;20*50us=1S
SECCOUN EQU 10H ;存放20的地址
LEDBUF EQU 40H ;显示数据首地址
ORG 0000H
LJMP MAIN
ORG 000BH ;T0中断入口
LJMP STIME ;调用定时器T0中断服务子程序
MAIN: ;装入固定点显示字母或符号
SETB PSW.5
MOV LEDBUF, #12 ;D
MOV LEDBUF+1, #13 ;A
MOV LEDBUF+2, #14 ;T
MOV LEDBUF+3, #15 ;E
MOV LEDBUF+4, #16 ;空格
MOV LEDBUF+9, #10 ;-
MOV LEDBUF+12,#10 ;-
MOV LEDBUF+15,#17 ;T
MOV LEDBUF+16,#18 ;I
MOV LEDBUF+17,#19 ;M
MOV LEDBUF+18,#15 ;E
MOV LEDBUF+19,#16 ;空格
MOV LEDBUF+20,#16 ;空格
MOV LEDBUF+23,#11 ;:
MOV LEDBUF+26,#11 ;:
MOV LEDBUF+29,#16 ;空格
;---------LCD1602初始化-------------------
MOV A, #00000001B ;发送清屏操作指令;
CALL W_CMD ;调写入指令子程序
MOV A, #00001111B ;发送显示开/关控制
ACALL W_CMD ;指令,有光标,有闪烁
MOV A, #00011100B ;发送光标移动指令
ACALL W_CMD ;光标和字一起移动,光标自动右移
MOV A, #00111100B ;发送功能设置指令
CALL W_CMD ;8位DB,双行,5x7字符
MOV DPTR, #TAB ;装入查表地址
;---------LCD1602初始化结束---------------------
;---------T0定时初始化--------------------------
MOV YEA1,#20H ;设置日期初始值
MOV YEA2,#08H
MOV MON, #10H
MOV DAY, #12H
MOV HOU,#12H ;设置时间初始值
MOV MIN,#59H
MOV SEC,#50H
MOV TMOD,#01H ;设置T0定时,模式1
MOV TH0,#HIGH(COUNT) ;装入高4位初始值
MOV TL0,#LOW(COUNT) ;装入低4位初始值
SETB EA ;开中断
SETB ET0 ;开T0中断允许位
SETB TR0 ;开始定时
MOV SECCOUN,#COUNT1 ;把数值20放到10H单元中
;---------T0定时初始化结束------------------------
MOVBUF1: ;日期"年"前两位处理
MOV A,YEA1
ANL A,#0F0H ;取高四位
SW AP A ;高四位和低四位调换
MOV LEDBUF+5,A ;把处理的数存放到相应地址中MOV A,YEA1
ANL A,#0FH ;取低四位
MOV LEDBUF+6,A ;把处理的数存放到相应地址中
MOV A,YEA2 ;日期"年"后两位处理
ANL A,#0F0H
SW AP A
MOV LEDBUF+7,A
MOV A,YEA2
ANL A,#0FH
MOV LEDBUF+8,A
MOV A,MON ;日期"月"处理
ANL A,#0F0H
SW AP A
MOV LEDBUF+10,A
MOV A,MON
ANL A,#0FH
MOV LEDBUF+11,A
MOV A,DAY ;日期"日"处理
ANL A,#0F0H
SW AP A
MOV LEDBUF+13,A
MOV A,DAY
ANL A,#0FH
MOV LEDBUF+14,A
MOV A,HOU ;时间"时"处理
ANL A,#0F0H
SW AP A
MOV LEDBUF+21,A
MOV A,HOU
ANL A,#0FH
MOV LEDBUF+22,A
MOV A,MIN ;时间"分"处理
ANL A,#0F0H
SW AP A
MOV LEDBUF+24,A
MOV A,MIN
ANL A,#0FH
MOV LEDBUF+25,A
MOV A,SEC ;时间"秒"处理
ANL A,#0F0H
SW AP A
MOV LEDBUF+27,A
MOV A,SEC
ANL A,#0FH
MOV LEDBUF+28,A
JMP2DIS:LCALL DISPLAYLCD ;调用显示子程序
SJMP MOVBUF1
;-------------定时器T0中断服务子程序----------
STIME: MOV TH0,#HIGH(COUNT) ;重新装入高4位初始值MOV TL0,#LOW(COUNT) ;重新装入低4位初始值
DJNZ SECCOUN,TIMEEND ;判断是否够1秒(20*50us=1S)
MOV SECCOUN,#COUNT1 ;重新装入20
PUSH ACC ;堆栈
SECCHA: MOV A,SEC ;"秒"处理
ADD A,#1 ;秒加1
DA A ;十进制调整
MOV SEC,A
CJNE A,#60H,TIMEEND1 ;判断是否够60秒
MOV SEC,#0 ;够60秒后,秒位清0
MINCHA: MOV A,MIN ;"分"处理
ADD A,#1
DA A
MOV MIN,A
CJNE A,#60H,TIMEEND1
MOV MIN,#0
HOUCHA: MOV A,HOU ;"时"处理
ADD A,#1
DA A
MOV HOU,A
CJNE A,#24H,TIMEEND1
MOV HOU,#0
DAYCHA: MOV A,DAY ;"日"处理
MOV A,#1
DA A
MOV DAY,A
CJNE A,#24H,TIMEEND1
MONCHA: MOV A,MON ;"月"处理
MOV A,#1
DA A
MOV MON,A
CJNE A,#12H,TIMEEND1
YEA2CHA:MOV A,YEA2 ;"年"后两位处理
MOV A,#1
DA A
MOV YEA2,A
CJNE A,#99H,TIMEEND1
YEA1CHA:MOV A,YEA1 ;"年"前两位处理
MOV A,#1
DA A
MOV YEA1,A
CJNE A,#99H,TIMEEND1
TIMEEND1:
POP ACC ;弹出堆栈
TIMEEND:RETI
;-------------定时器T0中断服务子程序结束-------------
;------------------LCD1602显示子程序------------------
DISPLAYLCD:
MOV R0, #LEDBUF ;显示首地址
MOV R1, #LEDBUF+15
MOV R2, #0 ;显示第一个字
MOV R3, #10000001B ;发送第一行DDRAM地址设置指令
MOV R4, #11000001B ;发送第二行DDRAM地址设置指令LOOP1:
MOV A,R3
ACALL W_CMD
MOV A, @R0
MOVC A, @A+DPTR ;查表
ACALL W_DA TA ;调用LCD显示字子程序
INC R0 ;显示下一个字
INC R3
MOV A,R4
ACALL W_CMD
MOV A, @R1
MOVC A, @A+DPTR ;查表
ACALL W_DA TA ;调用LCD显示字子程序
INC R1 ;显示下一个字
INC R2 ;下一个数
INC R4
JNB PSW.5,TG
CALL DELAY
TG:
CJNE R2, #15, LOOP1
CLR PSW.5
LOOP:
MOV A, #00001100B ;发送显示开/关控制
ACALL W_CMD ;指令,无光标,无闪烁
LJMP EXIT ;跳出LCD1602显示子程序
TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 2DH,3AH,44H,41H,54H,45H,20H,54H,49H,4DH
W AIT:
MOV LCD, #0FFH ;令P2作输入口使用
CLR RS
SETB RW
CLR E
NOP
SETB E
JB BF, WAIT ;判断LCD忙标志
RET
W_CMD: ;入口参数A
ACALL WAIT
MOV LCD, A
CLR RS
CLR RW
SETB E
NOP
CLR E
RET
W_DA TA: ;入口参数A
ACALL WAIT
MOV LCD, A
SETB RS
CLR RW
SETB E
NOP
CLR E
RET
EXIT:
RET
;------------------LCD1602显示子程序结束------------------
DELAY: MOV R6,#00H ;延时子程序MOV R7,#00H
DELAY1: NOP
DJNZ R7,DELAY1
DJNZ R6,DELAY1
RET
END
图片看不清的可以放大,这个应该会的,不多说