LCDtimer


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