LCDtimer
字体: 小 中 大 | 打印 发表于: 2008-9-30 20:39 作者: zcfhlp 来源: proteus仿真社区
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INSERT0 ;INT0用于调节时间
ORG 0013H
LJMP INSERT1 ;INT1用于选择调节定时或时间
ORG 001BH
LJMP INSERT_T1 ;T1定时
ORG 0050H
RS EQU P2.0
RW EQU P2.1
E EQU P2.2
MAIN: ANL TMOD,#0FH
ORL TMOD,#20H ;T1工作于方式2
MOV TH1,#38H ;定时250us
MOV TL1,#38H
SETB EA ;中断控制初始化
SETB ET1
SETB EX0
SETB EX1
SETB IT0
SETB IT1
SETB PX0
SETB C ;所用标志位初始化
MOV 00H,C
MOV 06H,C
CLR C
MOV 01H,C
MOV 02H,C
SETB E
MOV R2,#0 ;所用寄存器初始化
MOV R3,#0
MOV R4,#0
MOV R5,#12
MOV R6,#0
MOV 50H,#1
MOV 51H,#1
MOV P1,#01H ;LCD初始化
LCALL ENABLE ;调用命令生效子程序
LCALL DELAY ;调用保证控制字写入的延时子程序
MOV P1,#06H
LCALL ENABLE
LCALL DELAY
MOV P1,#0CH
LCALL ENABLE
LCALL DELAY
MOV P1,#3CH
LCALL ENABLE
LCALL DELAY
MOV P1,#0C4H
LCALL ENABLE
LCALL DELAY
MOV DPTR,#TABLE
MOV R0,#8
MOV R1,#0
AGAIN: MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
LCALL EABLE1 ;调用写入数据生效子程序
LCALL DELAY
INC R1
DJNZ R0,AGAIN
SETB TR1
RETURN: jb p2.7,return1 ;判断电源是否断掉
JNB 06H,RETURN
CLR C
MOV 06H,C ;电源标志清零
mov p1,#08h ;关LCD
lcall enable
lcall delay
clr ex0 ;关外部中断
clr ex1
ajmp return
return1:JNB P0.7,RETURN ;判断是否允许报警
JNB 05H,RETURN ;判断定时是否到达
CLR C
MOV 05H,C
CLR P2.5 ;点亮二极管
CLR P2.6 ;驱动继电器
AGAIN3: CPL P2.4 ;驱动蜂鸣器
LCALL DELAY1
jb p2.7,pow
SETB P2.5 ;关掉二极管
SETB P2.6 ;关掉继电器
SETB P2.4
ajmp return
pow: JB P0.7,AGAIN3
SETB P2.5 ;关掉二极管
SETB P2.6 ;关掉继电器
SETB P2.4 ;关掉蜂鸣器
AJMP RETURN
;*************************
INSERT_T1: INC 50H ;T1中断服务程序
MOV A,#250
CJNE A,50H,EXIT11
MOV 50H,#1
INC 51H
MOV A,#16
CJNE A,51H,EXIT11
MOV 51H,#1
INC R4 ;1s=16*250*250us
CJNE R4,#60,LP18
MOV 55H,#0
AJMP LP19
LP18: MOV 55H,R4
LP19: MOV P1,#0CAH ;秒钟变化时显示
LCALL ENABLE
LCALL DELAY
LCALL DISPLAY ;24#到12#的转换
JB P0.6,H2411 ;判断选择的计数进制
JNB 00H,LP131 ;判断上一次是否是12#,是则不进行转换,否则转换
CLR C
MOV 00H,C ;把进制标志改为12#
MOV A,#11 ;大于11,显示pm,否则显示am
SUBB A,R2
JC LP14
CLR C
MOV 02H,C
MOV 01H,C
MOV P1,#0CEH
LCALL ENABLE
LCALL DELAY
MOV P1,#41H
LCALL EABLE1
LCALL DELAY
MOV P1,#4DH
LCALL EABLE1
LCALL DELAY
MOV A,R2
JZ LP1C
LP131: AJMP LP13
H2411: AJMP H24
EXIT11: AJMP EXIT1
LP14: SETB C
MOV 02H,C
MOV P1,#0CEH
LCALL ENABLE
LCALL DELAY
MOV P1,#50H
LCALL EABLE1
LCALL DELAY
MOV P1,#4DH
LCALL EABLE1
LCALL DELAY
MOV A,#12
CLR C
SUBB A,R2
JC LP1B ;大于12,小时数值减12,否则不变
CLR C
MOV 01H,C
AJMP LP13
LP1C: MOV A,#12
ADD A,R2
MOV R2,A
AJMP LP1D
LP1B: SETB C
MOV 01H,C
CLR C
MOV A,R2
SUBB A,#12
MOV R2,A
LP1D: MOV P1,#0C4H ;显示小时数值
LCALL ENABLE
LCALL DELAY
MOV A,R2 ;小时位上第一位0不显示
MOV B,#10
DIV AB
JZ LP20
MOV 55H,R2
LCALL DISPLAY ;调用显示2位十进制数子程序
AJMP LP21
LP20: LCALL DISPLAY1 ;调用第1位为空,第2位为数值的显示子程序
LP21: AJMP LP13 ;12#到24#的转换
H24: JB 00H,LP13 ;判断上一次是否为24#,是则不转换,否则转换
SETB C
MOV 00H,C ;把进制标志改为24#
MOV P1,#0CEH ;清掉显示的am/pm
LCALL ENABLE
LCALL DELAY
MOV P1,#20H
LCALL EABLE1
LCALL DELAY
MOV P1,#20H
LCALL EABLE1
LCALL DELAY
JNB 01H,LP30 ;pm计算标志为1时,小时数值加12
MOV A,#12
ADD A,R2
MOV R2,A
MOV A,#23
CLR C
SUBB A,R2 ;小时数值大于23时变为0
JNC LP15
MOV R2,#0
LP15: MOV P1,#0C4H ;显示小时数值
LCALL ENABLE
LCALL DELAY
MOV A,R2 ;小时位第一位0不显示
MOV B,#10
DIV AB
JZ LP1E
MOV 55H,R2
LCALL DISPLAY
AJMP LP30
LP1E: LCALL DISPLAY1
lp30: jb 02h,lp13 ;12#的上午12点转换为24#的0点
cjne r2,#12,lp13
mov r2,#0
MOV P1,#0C4H
LCALL ENABLE
LCALL DELAY
MOV A,R2
MOV B,#10
DIV AB
JZ LP31
MOV 55H,R2
LCALL DISPLAY
AJMP LP13
LP31: LCALL DISPLAY1
LP13: CJNE R4,#60,EXIT12 ;秒钟到60时向分钟进1
MOV R4,#0
INC R3
CJNE R3,#60,LP16
MOV R3,#0
MOV 55H,R3 ;显示调整后的分钟值
MOV P1,#0C7H
LCALL ENABLE
LCALL DELAY
LCALL DISPLAY
INC R2 ;分钟位向小时位进位
AJMP LP17
EXIT12: AJMP EXIT1
LP16: MOV 55H,R3 ;显示变化后的分钟值
MOV P1,#0C7H
LCALL ENABLE
LCALL DELAY
LCALL DISPLAY
AJMP EXIT1
LP17: JB P0.6,H241 ;判断当前选择的计数进制
CLR C ;12#时调整小时值以及am/pm显示和计算的标志位
MOV A,#11
SUBB A,R2
JNC DIS11
CLR C
MOV A,#12
SUBB A,R2
JNC LP1A
MOV R2,#1
MOV C,01H
CPL C
MOV 01H,C
ajmp DIS11
LP1A: MOV C,02H
CPL C
MOV 02H,C
JB 02H,LP11
MOV 55H,#41H
AJMP LP12
LP11: MOV 55H,#50H
LP12: MOV P1,#0CEH
LCALL ENABLE
LCALL DELAY
MOV P1,55H
LCALL EABLE1
LCALL DELAY
AJMP DIS11
H241: MOV A,#23 ;24#时调整小时值
CLR C
SUBB A,R2
JNC DIS11
MOV R2,#0
DIS11: MOV P1,#0C4H ;显示变化后的小时值
LCALL ENABLE
LCALL DELAY
MOV A,R2
MOV B,#10
DIV AB
JZ LP1F
MOV 55H,R2
LCALL DISPLAY
AJMP EXIT1
LP1F: LCALL DISPLAY1
EXIT1: MOV A,#0 ;判断定时是否到达
JB 00H,NEXITT1 ;在24#下判断,若当前为12#则转换为24#
JNB 01H,NEXITT1
MOV A,#12
NEXITT1: ADD A,R2
MOV 30H,R5
CJNE A,30H,EXIT2
MOV A,R3
MOV 30H,R6
CJNE A,30H,EXIT2
CJNE R4,#0,EXIT2
SETB C
MOV 05H,C ;定时到达时置报警标志位为1
AJMP EXIT3
EXIT2: CLR C
MOV 05H,C ;否则报警标志位为0
EXIT3: RETI
;*************************
INSERT1: JB P0.0,DINGSHI ;外部中断1服务程序,用于选择调节时间还是调节定时时间
CLR C ;p0.0为0时调节时间,p0.1为0时调节定时时间,两者都不为0无效
MOV 03H,C ;调节时间时置调节标志位为0
MOV P1,#01H ;输出调节时间提示信息
LCALL ENABLE
LCALL DELAY
MOV P1,#80H
LCALL ENABLE
LCALL DELAY
MOV DPTR,#STRING1
LCALL DISPLAY2 ;调用显示字符串子程序
JB 00H,NEXT2 ;把当前时间值转换到24#下显示在提示中
JNB 01H,NEXT2
MOV A,#12
ADD A,R2
MOV R2,A
CJNE R2,#24,NEXT2
MOV R2,#0
NEXT2: MOV P1,#0C6H
LCALL ENABLE
LCALL DELAY
MOV A,R2
MOV B,#10
DIV AB
JZ NEXT3
MOV 55H,R2
LCALL DISPLAY
AJMP NEXT4
NEXT3: LCALL DISPLAY1
NEXT4: MOV P1,#3AH
LCALL EABLE1
LCALL DELAY
MOV 55H,R3
LCALL DISPLAY
MOV P1,#0FH ;将光标格式改为闪烁格式
LCALL ENABLE
LCALL DELAY
JNB P0.0,$ ;等待进行时间调节
LCALL RESET ;调用恢复时间显示子程序
AJMP QUIT
DINGSHI: JB P0.1,QUIT ;调节定时时间
SETB C
MOV 03H,C ;置调节标志位为1
MOV P1,#01H ;输出调节定时时间提示信息
LCALL ENABLE
LCALL DELAY
MOV P1,#80H
LCALL ENABLE
LCALL DELAY
MOV DPTR,#STRING2
LCALL DISPLAY2
MOV P1,#0C6H ;把当前的定时时间显示在提示信息中
LCALL ENABLE
LCALL DELAY
MOV A,R5
MOV B,#10
DIV AB
JZ NEXT5
MOV 55H,R5
LCALL DISPLAY
LCALL DELAY
AJMP NEXT6
NEXT5: LCALL DISPLAY1
NEXT6: MOV P1,#3AH
LCALL EABLE1
LCALL DELAY
MOV 55H,R6
LCALL DISPLAY
MOV P1,#0FH
LCALL ENABLE
LCALL DELAY
JNB P0.1,$ ;等待进行定时时间调节
LCALL RESET ;调用恢复时间显示子程序
QUIT: MOV P1,#0CH ;恢复调节前的光标格式
LCALL ENABLE
LCALL DELAY
RETI
;*************************
RESET: MOV P1,#01H ;恢复时间显示子程序,复原到调节前的计数进制和相应的标志位
LCALL ENABLE
LCALL DELAY
JB 00H,LPP11 ;调节前为12#,则进行24#到12#的转换
CLR C
MOV A,#11
SUBB A,R2
JNC LPP2
CLR C
MOV A,#12
SUBB A,R2
JNC LPP3
MOV A,R2
CLR C
SUBB A,#12
MOV R2,A
SETB C
MOV 01H,C
MOV 02H,C
AJMP LPP4
LPP11: AJMP LPP1
LPP3: SETB C
MOV 02H,C
CLR C
MOV 01H,C
AJMP LPP4
LPP2: CLR C
MOV 02H,C
MOV 01H,C
LPP4: MOV P1,#0C4H
LCALL ENABLE
LCALL DELAY
MOV A,R2
MOV B,#10
DIV AB
JZ LPP5
MOV 55H,R2
LCALL DISPLAY
AJMP LPP6
LPP5: LCALL DISPLAY1
LPP6: MOV P1,#3AH
LCALL EABLE1
LCALL DELAY
MOV 55H,R3
LCALL DISPLAY
MOV P1,#3AH
LCALL EABLE1
LCALL DELAY
MOV 55H,R4
LCALL DISPLAY
MOV P1,#0CEH
LCALL ENABLE
LCALL DELAY
JB 02H,LPP7
MOV P1,#41H
LCALL EABLE1
LCALL DELAY
MOV P1,#4DH
LCALL EABLE1
LCALL DELAY
AJMP EXITR
LPP7: MOV P1,#50H
LCALL EABLE1
LCALL DELAY
MOV P1,#4DH
LCALL EABLE1
LCALL DELAY
AJMP EXITR
LPP1: MOV P1,#0C4H ;调节前为24#则直接将调节后的时间进行输出显示
LCALL ENABLE
LCALL DELAY
MOV A,R2
MOV B,#10
DIV AB
JZ LPP8
MOV 55H,R2
LCALL DISPLAY
AJMP LPP9
LPP8: LCALL DISPLAY1
LPP9: MOV P1,#3AH
LCALL EABLE1
LCALL DELAY
MOV 55H,R3
LCALL DISPLAY
MOV P1,#3AH
LCALL EABLE1
LCALL DELAY
MOV 55H,R4
LCALL DISPLAY
EXITR: RET
;*************************
INSERT0: JB P0.2,MINUTE ;外部中断0服务程序,用于调节时间
MOV P1,#0C6H ;p0.2为0调节小时值,p0.3为0调节分钟值,否则无效
LCALL ENABLE
LCALL DELAY
JB 03H,HOURD ;调节小时值时根据调节标志位选择调节时间小时值还是定时时间小时值
INC R2
CJNE R2,#24,GOON1
MOV R2,#0
GOON1: MOV A,R2
MOV B,#10
DIV AB
JZ GOON2
MOV 55H,R2
LCALL DISPLAY
AJMP EXITINT0
GOON2: LCALL DISPLAY1
AJMP EXITINT0
HOURD: INC R5
CJNE R5,#24,GOON3
MOV R5,#0
GOON3: MOV A,R5
MOV B,#10
DIV AB
JZ GOON4
MOV 55H,R5
LCALL DISPLAY
AJMP EXITINT0
GOON4: LCALL DISPLAY1
AJMP EXITINT0
MINUTE: JB P0.3,EXITINT0 ;调节分钟值时根据调节标志位选择调节时间分钟值还是调节定时时间分钟值
MOV P1,#0C9H
LCALL ENABLE
LCALL DELAY
JB 03H,MINUTED
INC R3
CJNE R3,#60,GOON5
MOV R3,#0
GOON5: MOV 55H,R3
LCALL DISPLAY
AJMP EXITINT0
MINUTED: INC R6
CJNE R6,#60,GOON6
MOV R6,#0
GOON6: MOV 55H,R6
LCALL DISPLAY
EXITINT0: RETI
;*************************
ENABLE: CLR RS ;控制命令写入生效子程序
CLR RW
CLR E
NOP
NOP
SETB E
RET
;************************
EABLE1: SETB RS ;数据写入生效子程序
CLR RW
CLR E
NOP
NOP
SETB E
RET
;************************
DELAY: MOV 58H,#10 ;保证可靠写入延时子程序
DEL1: MOV 59H,#255
DJNZ 59H,$
DJNZ 58H,DEL1
RET
;*************************
DELAY1: MOV 58H,#50 ;产生蜂鸣器驱动脉冲延时子程序
DELA: MOV 59H,#255
DELA1: DJNZ 59H,DELA1
DJNZ 58H,DELA
RET
;*************************
DISPLAY: MOV A,55H ;显示2位十进制数子程序
MOV B,#10 ;将2位十进制数转换为非压缩BCD码再转换为LCD显示码
DIV AB
ADD A,#30H
MOV 60H,A
MOV A,B
ADD A,#30H
MOV 61H,A
MOV P1,60H
LCALL EABLE1
LCALL DELAY
MOV P1,61H
LCALL EABLE1
LCALL DELAY
RET
;*****************************
DISPLAY1: MOV P1,#20H ;第1位为空,第2位为数值的显示子程序
LCALL EABLE1
LCALL DELAY
MOV A,B
ADD A,#30H
MOV P1,A
LCALL EABLE1
LCALL DELAY
RET
;****************************
DISPLAY2: MOV A,R0 ;显示字符串子程序
PUSH ACC
MOV R0,#0
AGAIN1: MOV A,R0
MOVC A,@A+DPTR
JZ NET
MOV P1,A
LCALL EABLE1
LCALL DELAY
INC R0
AJMP AGAIN1
NET: POP ACC
MOV R0,A
RET
TABLE: DB 20H,30H,3AH,30H,30H,3AH,30H,30H
STRING1: DB 53H,65H,74H,20H,74H,69H,6DH,65H,28H,32H,34H,48H,29H,00H
STRING2: DB 53H,65H,74H,20H,44H,69H,6EH,67H,73H,68H,69H,28H,32H,34H,48H,29H,00H
END
查看全部回复
我也来说两句
