📄 lcdtimer.asm
字号:
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -