⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 液晶timeend555555xin.txt

📁 用89S51做的液晶时钟走的很好 用keil3.0打开
💻 TXT
📖 第 1 页 / 共 3 页
字号:

RS EQU p0.2
RW EQU P0.1
E EQU P0.0
DAT EQU P3.7

N0_jzh EQU 1EH ;键值存放单元
N0_shb EQU 1FH ;遥控器识别码
X1_n1 EQU 2AH ;连续六个单元,(可位操作)作
X1_n2 EQU 2BH ;遥控输入数据缓冲区
X1_n3 EQU 2CH
X1_n4 EQU 2DH
X1_n5 EQU 2EH
X1_n6 EQU 2FH
Ch_num EQU 26H ;缓冲区一个字节有几位
Da_num EQU 25H ;数据缓冲区字节数
Mo_num EQU 27H ;最多移位次数
U0_x1 EQU 40H ;数据临时存放字节,存满8位后送2AH~2FH
N0_JZH1 EQU 41H;存放键值时使用,做临时存放单元
JHM EQU 42H
TIMER1 EQU 43H
JZHMA EQU 44H
JHM_CLC EQU 45H
OPEN_CLC EQU 46H
START_SR EQU 47H

YEAR EQU 50H
MON1 EQU 51H
MON2 EQU 52H
DAY1 EQU 53H
DAY2 EQU 54H
HOUR1 EQU 55H
HOUR2 EQU 56H
MIN1 EQU 57H
MIN2 EQU 58H
SEC1 EQU 59H
SEC2 EQU 5AH
TIMER0 EQU 5BH
DAY EQU 5CH
MON EQU 5DH
HOUR11 EQU 5EH
HOUR22 EQU 5FH

HOUR1_CLC EQU 30H
HOUR2_CLC EQU 31H
MIN1_CLC EQU 32H
MIN2_CLC EQU 33H
MIN1_SR EQU 34H
MIN2_SR EQU 35H
SEC1_SR EQU 36H
SEC2_SR EQU 37H
MSEC1_SR EQU 38H
MSEC2_SR EQU 39H



ORG 0000H
LJMP MAIN



ORG 000BH
LJMP INTT0

ORG 0013H
LJMP INT_X1

ORG 0100H
MAIN: MOV SP,#60H
      LCALL INIT
      LCALL JUDGE
      MOV P1,#01H
      LCALL ENABLE
      MOV P1,#38H
      LCALL ENABLE
      MOV P1,#0CH
      LCALL ENABLE
      MOV P1,#06H
      LCALL ENABLE
      LCALL DISP_INIT
      LCALL DISPTIME
      LCALL DSWD
      LCALL DSWD
      LCALL DISPTEMP
START:   MOV A,TIMER0
         CJNE A,#80,START_1
         LCALL DISPTIME
         LCALL DSWD
         LCALL DISPTEMP
START_1: LCALL CHANGETIME
         LCALL TWE_JINZHI
         LCALL CLC
         LCALL SECRUN
         AJMP START



;---------------------------------------------------------------------------------------

DISP: MOV R1,#16
LOOP: MOV A,#00H
      MOVC A,@A+DPTR
      LCALL DISP1
      INC DPTR
      DJNZ R1,LOOP
      RET
DISP1: MOV P1,A
       SETB RS
       CLR RW
       CLR E
       LCALL ENABLE
       SETB E
       RET
DISP3: SETB RS
       CLR RW
       CLR E
       LCALL ENABLE
       SETB E
       RET

DISPTIME:  LCALL TWE_TF
           MOV R1,#11
           MOV R0,#50H
           MOV DPTR ,#TABLE4
LOOP1:     MOV A,#00H
           MOVC A,@A+DPTR
           MOV P1,A
           LCALL ENABLE
           INC DPTR
           MOV A,@R0
           ADD A,#30H
           LCALL DISP1
           INC R0
           DJNZ R1,LOOP1
           LCALL DISP_HOUR
	   MOV P1,#0CH
	   LCALL ENABLE
           RET

DISPTEMP:  LCALL JUDGE
           MOV P1,#0CAH
	   LCALL ENABLE
	   MOV A,#30H
	   ADD A,R7
	   LCALL DISP1
           MOV P1,#0CBH
	   LCALL ENABLE
	   MOV A,#30H
	   ADD A,R6
	   LCALL DISP1
           MOV P1,#0CDH
	   LCALL ENABLE
	   MOV A,#30H
	   ADD A,R5
	   LCALL DISP1
           MOV P1,#0CEH
	   LCALL ENABLE
	   MOV A,#0DFH
	   LCALL DISP1
	   RET

TWE_TF:    MOV A,JZHMA
           CJNE A,#0FFH,TWE_TF_3
	   MOV A,HOUR1
	   SWAP A
	   ORL A,HOUR2
	   CJNE A,#12H,TWE_TF_1
TWE_TF_1:  JC TWE_TF_2
           CJNE A,#12H,TWE_TF_4
	   AJMP TWE_TF_2
TWE_TF_4:  ADD A,#88H
	   DA A
	   MOV R0,A
	   ANL A,#0FH
           MOV HOUR22,A
	   MOV A,R0
	   SWAP A
	   ANL A,#0FH
	   MOV HOUR11,A
           LCALL DISP_PM
	   AJMP TWE_TF_OUT
TWE_TF_2:  MOV HOUR11,HOUR1
           MOV HOUR22,HOUR2
	   LCALL DISP_AM
	   AJMP TWE_TF_OUT
TWE_TF_3:  LCALL DISP_APCLR
TWE_TF_OUT: RET

DISP_HOUR:       MOV A,JZHMA
                 CJNE A,#0FFH,DISP_HOUR_OUT
                 MOV P1,#0C0H
                 LCALL ENABLE
		 MOV A,#30H
		 ADD A,HOUR11
		 LCALL DISP1
		 MOV P1,#0C1H
		 LCALL ENABLE
		 MOV A,#30H
		 ADD A,HOUR22
		 LCALL DISP1
DISP_HOUR_OUT:  RET

DISP_AM:         MOV P1,#0C8H
                 LCALL ENABLE
		 MOV A,#61H
		 LCALL DISP1
		 MOV P1,#0C9H
		 LCALL ENABLE
		 MOV A,#6DH
		 LCALL DISP1
		 RET

DISP_PM:         MOV P1,#0C8H
                 LCALL ENABLE
		 MOV A,#70H
		 LCALL DISP1
		 MOV P1,#0C9H
		 LCALL ENABLE
		 MOV A,#6DH
		 LCALL DISP1
		 RET
DISP_APCLR:      MOV P1,#0C8H
                 LCALL ENABLE
		 MOV A,#20H
		 LCALL DISP1
		 MOV P1,#0C9H
		 LCALL ENABLE
		 MOV A,#20H
		 LCALL DISP1
		 RET



DISP_INIT:       MOV P1,#80H
                 LCALL ENABLE
                 MOV DPTR,#TABLE2
                 LCALL DISP
                 MOV P1,#0C0H
                 LCALL ENABLE
                 MOV DPTR ,#TABLE3
                 LCALL DISP
                  RET

ENABLE: CLR RW
        CLR RS
        CLR E
        ACALL JUDGE
        SETB E
        RET


JUDGE:  MOV P1,#0FFH
        CLR RS
	SETB RW
	CLR E
	NOP
        SETB E
	JB P1.7,JUDGE
	RET


;--------------------------------------------------------------------------------------------

INIT: MOV YEAR,#7
      MOV MON,#2
      MOV MON1,#0
      MOV MON2,#2
      MOV DAY,#28
      MOV DAY1,#2
      MOV DAY2,#8
      MOV HOUR1,#2
      MOV HOUR2,#3
      MOV HOUR11,#1
      MOV HOUR22,#1
      MOV MIN1,#5
      MOV MIN2,#9
      MOV SEC1,#5
      MOV SEC2,#0
      MOV HOUR1_CLC,#0
      MOV HOUR2_CLC,#0
      MOV MIN1_CLC,#0
      MOV MIN2_CLC,#0
      MOV MIN1_SR ,#0
      MOV MIN2_SR ,#0
      MOV SEC1_SR ,#0
      MOV SEC2_SR ,#0
      MOV MSEC1_SR ,#0
      MOV MSEC2_SR ,#0
      MOV START_SR, #0
      MOV TIMER0,#100
      MOV TIMER1,#0FFH
      MOV OPEN_CLC,#1
      MOV JHM_CLC,#0

      MOV JZHMA,#00H
      MOV PSW,#00
      MOV TMOD,#11H
      MOV TL0,#0F0H
      MOV TH0,#0D8H

      MOV IP,#04H      ;中断优先级
      CLR TR1          ;关T1
      MOV TL1,#00H     ;T1时间常数送初值
      MOV TH1,#00H
      MOV 18H,#2AH     ;在INT1中断服务程序中使用工#3寄存器,R0=2AH=======================
      MOV Da_num,#06H  ;输入数据取6个字节
      MOV Ch_num,#08H   ;每个字节8位
      MOV N0_jzh,#0FFH   ;键值码先送FFH,以免在未送数时错当有数
      LCALL WriteCGRAM
      SETB EA
      SETB ET0
      SETB TR0
      SETB EX1         ;开中断1,INT1
      SETB IT1         ;INT1下降沿触发
      RET


CheckBusy:PUSH ACC
LOOP12:  CLR RS             ;选择指令寄存器
SETB RW           ;选择读模式
MOV P1,#0FFH  ;P0口写1,准备写入
SETB E             ;使能LCD
MOV A,P1     ;将LCD的D0-D7由P0口送A,以便查第7位BF是否为0
CLR E             ;禁止LCD
JB ACC.7,LOOP12    ;判断由LCD读入第7位BF是否为1,若为1表示LCD忙
ACALL  DELAY2MS   ;调延时子程序
POP ACC
RET
; 写入IR寄存器子程序
WriteIR:PUSH ACC
ACALL CheckBusy  ;调检查忙子程序
CLR E              ;禁止LCD
CLR RS             ;选择指令寄存器
CLR RW            ;选择写模式
SETB E             ;使能LCD
MOV P1,A       ;将控制指令写入LCD
SETB E             ;使能LCD
CLR E              ;禁止LCD
POP ACC
RET
; 写入DR寄存器子程序
WriteDDR:PUSH ACC
ACALL CheckBusy    ;调检查忙子程序
CLR E              ;禁止LCD
SETB RS            ;选择数据寄存器
CLR RW             ;选择写模式
SETB E              ;使能LCD
MOV P1,A        ;将数据写入LCD
SETB E              ;使能LCD
CLR E               ;禁止LCD
POP ACC
RET
;以下是自定义字体程序
WriteCGRAM : PUSH  ACC
MOV A,#01000000B        ;设置CGRAM的地址
ACALL WriteIR
MOV R0,#24
MOV DPTR,#CGRAMTAB  ;指向FONTTAB表首
LOOP13: CLR A
MOVC A,@A+DPTR
ACALL  WriteDDR      ;将自定义字符存入CGRAM中
INC DPTR
DJNZ R0,LOOP13
POP ACC
RET
;以下是2.5ms延时子程序
DELAY2MS:MOV  R5,#5
D2:    MOV  R4,#248
D1:    DJNZ  R4,D1
DJNZ  R5,D2
RET
CGRAMTAB:
DB 08H,0FH,12H,0FH,0AH,1FH,02H,02H   ;年的字模
DB 0FH,09H,0FH,09H,0FH,09H,13H,00H    ;月的字模
DB 1FH,11H,11H,1FH,11H,11H,1FH,00H    ;日的字模



;-------------------------------------------------------------------------------------------------------

INTT0: PUSH PSW
       PUSH ACC
       ORL PSW,#08H
       MOV TL0,#0F0H
       MOV TH0,#0D8H

       DJNZ TIMER0,INTT00
       MOV TIMER0,#100
       LCALL ADSEC2
       LCALL CLC_RUNNING
INTT00:MOV A,START_SR
       CJNE A,#1,INTOUT
       LCALL SR_ADMSEC2
INTOUT:POP ACC
       POP PSW
       RETI

ADSEC2: MOV A,SEC2
        CJNE A,#9,AD1
        MOV SEC2,#0
        ACALL ADSEC1
	AJMP OUT1
AD1:    INC SEC2
OUT1:   RET


ADSEC1: MOV A,SEC1
        CJNE A,#5,AD2
        MOV SEC1,#0
        ACALL ADMIN2
	AJMP OUT2
AD2:    INC SEC1
OUT2:     RET

ADMIN2: MOV A,MIN2
        CJNE A,#9,AD3
        MOV MIN2,#0
	ACALL ADMIN1
	AJMP OUT3
AD3:    INC MIN2
OUT3:   RET

ADMIN1: MOV A,MIN1
        CJNE A,#5,AD4
        MOV MIN1,#0
	ACALL ADHOUR2
	AJMP OUT4
AD4:    INC MIN1
OUT4:   RET

ADHOUR2:  MOV A,HOUR1
          CJNE A,#2,ADHOUR20
	  MOV A,HOUR2
          CJNE A,#3,AD5
          MOV HOUR1,#0
	  MOV HOUR2,#0
	  ACALL ADDAY
	  AJMP OUT5
ADHOUR20: MOV A,HOUR2
          CJNE A,#9,AD5
          MOV HOUR2,#0
	  INC HOUR1
	  AJMP OUT5
AD5:      INC HOUR2
OUT5:     RET

ADDAY:   MOV A,MON
         CJNE A,#2,AD6
	 ACALL RUNNIAN
	 AJMP OUT6
AD6:     MOV A,MON
         DEC A
         MOV DPTR,#TABLE1
         MOVC A,@A+DPTR
	 CJNE A,DAY,AD7
	 MOV DAY,#0
	 ACALL ADMON
	 AJMP OUT6
AD7:     INC DAY
OUT6:    MOV A,DAY
         MOV B,#10
         DIV AB
	 MOV DAY1,A
	 MOV DAY2,B
         RET

ADMON:   MOV A,MON
         CJNE A ,#12,AD8
         MOV MON,#0
	 ACALL ADYEAR
	 AJMP OUT7
AD8:     INC MON
OUT7:    MOV A,MON
         MOV B,#10
	 DIV AB
	 MOV MON1,A
	 MOV MON2,B
         RET

ADYEAR:  MOV A,YEAR
         CJNE A,#9,AD9
         MOV YEAR ,#7
	 AJMP OUT8
AD9:     INC YEAR
OUT8:    RET

RUNNIAN: MOV A,YEAR
         CJNE A,#8,RUN
	 MOV A,DAY
         CJNE A,#29,AD10
	 MOV DAY,#0
	 ACALL ADMON
	 AJMP OUT9
RUN:     MOV A,DAY
         CJNE A,#28,AD10
         MOV DAY,#0
	 ACALL ADMON
	 AJMP OUT9
AD10:    INC DAY
OUT9:    RET










TABLE1:DB 31,28,31,30,31,30,31,31,30,31,30,31
TABLE2:DB 32H,30H,30H,37H,00H," ",32H,01H,32H,38H,02H,"     "
TABLE3:DB "  :  :      .  C"
TABLE4:DB 83H,85H,86H,88H,89H,0C0H,0C1H,0C3H,0C4H,0C6H,0C7H
TABLE5:DB 83H,86H,89H,0C1H,0C4H

;--------------------------------------------------------------------------------------------------------------

INT_X1: PUSH ACC
        PUSH PSW
        ORL PSW,#18H   ;取3#区寄存器
        CLR TR1        ;T1停止计数
        MOV R2,TH1     ;取T1计数次数
        MOV R3,TL1
        MOV R4,#03H    ;0320H~0400H为数据窗口0
        MOV R5,#80H    ;窗口0的下限
        LCALL SUB0     ;计数值小于320H吗?
        JC X0_OUT     ;<320H,作废
        MOV R4,#04H    ;窗口0的上限
        MOV R5,#0B0H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -