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

📄 lcd_bk.asm

📁 51实现电子钟功能
💻 ASM
📖 第 1 页 / 共 2 页
字号:

        SCLK BIT P2.0
        RST BIT P2.2
        IO_DATA BIT P2.1
        rs bit    p2.4
        rw bit    p2.5
        e  bit    p2.6
        KEY_0 BIT P1.4
	KEY_1 BIT P1.5

	KEY_3 BIT P1.6
	KEY_4 BIT P1.7
        RING BIT P2.3
        ;ring_off  bit p2.3  ;关闹铃
        FUNCTION bit 00h
        KP    BIT  01H
	KEY_LOCK BIT 02H
        HAVE_KEY BIT 03H

        KEY_LOCK1 BIT 04H
        NAOZHONG_CONTROL BIT 05H
        CLK_ONCE BIT 06H
        CLK_EVER BIT 07H
        clk_on   bit 08h
        CLK_ON_1 BIT 09H
        NAOZHONG_CONTROL_1 BIT 0AH
        ring_on   bit 0bh
        WAIT_TIME BIT 0CH
        BIG EQU 50H
        SMALL   EQU 51H
        COMM EQU 52H
        DAT  EQU 53H
        IN_BYTE EQU 54H
        BitCnt EQU 55H
        RTIME  EQU 56H

        KEY_CLK_COUNT EQU 57H
        KEY_TIME_COUNT EQU 58H
        RBLACK EQU 59H
        KVALUE EQU 5AH
        STATE EQU 5BH
        DISP_FLAG EQU 5CH

        SEC EQU 22H     ;20H,21H留给位寻址
        MIN EQU 23H
        HOUR EQU 24H
        DAY EQU 25H
        MON EQU 26H
        WEEK EQU 27H
        YEAR EQU 28H
        CLK_MON EQU 29H
        CLK_DAY EQU 2AH
        CLK_HOUR EQU 2BH
        CLK_MIN EQU 2CH
        CLK_CONTROL EQU 2DH
        clk_mon_1   EQU 10H ;闹钟的修改备份
        clk_DAY_1   EQU 11H
        clk_HOUR_1   EQU 12H
        clk_MIN_1   EQU 13H

        SEC1 EQU 48H
        MIN1 EQU 44H
        HOUR1 EQU 40H
        DAY1 EQU 3AH
        MON1 EQU 36H
        WEEK1 EQU 4EH
        YEAR1 EQU 32H
         ORG 0000H
         LJMP START
         ORG 000BH
	 ;
         ORG 0040H
   START:MOV SP,#60H                ;以下是内存初始化
         MOV P1,#0FFH
         MOV YEAR,#08H             ;1302的时钟寄存器的缓存
         MOV MON,#08H
         MOV DAY,#31H
         MOV HOUR,#19H
         MOV MIN,#0
         MOV SEC ,#0
         MOV WEEK,#5

         MOV CLK_CONTROL,#31H   ;闹钟的时间缓存
         MOV CLK_MON,#08H
         MOV CLK_DAY,#31H
         MOV CLK_HOUR,#19H
         MOV CLK_MIN,#01H

         MOV STATE,#0           ;按键的状态 决定画面效果
         MOV DISP_FLAG,#0      ;显示哪张画面 把数据送入显存

         MOV KEY_CLK_COUNT,#0  ;调整闹钟时间的按键标志
         MOV KEY_TIME_COUNT,#0 ;调整时间的按键标志

         CLR ring_on  ;有无闹钟标志
         clr clk_on ;开/关在屏幕上的显示标志

         CLR NAOZHONG_CONTROL   ;闹钟次数在屏幕上显示的标志
         CLR KEY_LOCK           ;0号键的标志
         CLR HAVE_KEY           ;有无键的标志
         CLR CLK_EVER           ;闹钟一次定时标志

         clr  CLK_ONCE          ;闹钟永久定时标志
         CLR KEY_LOCK1          ;按键等待标志
         setb ring              ;为低振铃
   MAIN:
        lcall delay40MS
        lcall WRITE1302
	lcall Osc_Enable
        lcall lcdini
 main_0:
         LCALL READ1302
         JNB ring_on,main_1
         JNB CLK_ever,main_2
         LCALL COMPARE
         sjmp main_1
main_2:  jnb clk_once,main_1
         lcall compare
main_1:  LCALL KEY_CHECK
         LCALL EXCHANGE
         LCALL LCDDISP
         JNB KEY_LOCK1,main_0  ;有键等待
         LCALL KEY_STATE
         JB WAIT_TIME,main_1
         SJMP main_0



        COMPARE:MOV A,CLK_MIN
                CJNE A,MIN,COMPARE_EXIT
                MOV A,CLK_HOUR
                CJNE A,HOUR,COMPARE_EXIT
                MOV A,CLK_DAY
                CJNE A,DAY,COMPARE_EXIT
                MOV A,CLK_MON
                CJNE A,MON,COMPARE_EXIT
                LCALL EQU_TIME
  COMPARE_EXIT: RET

          EQU_TIME:Mov 	state,     #3
                   Mov 	disp_flag  ,#3
                   Lcall 	exchange
                   Lcall 	lcddisp
                   mov          r6,#15   ;15 是2分钟
          ringing0:Mov		r7 ,#100
           ringing:clr   ring
                   Lcall    delay40ms
                   setb  ring
                   lcall    delay40ms
                   Jnb     key_3 ,equ_time_exit  ;ke yong key_3
                   Djnz    r7 , ringing
                   djnz    r6,  ringing0

     equ_time_exit:Jnb     clk_ever,equ_time_1
                   Setb    ring_on

        equ_time_1:
                   clr		ring_on
                   clr		clk_once      ;可不加
                   setb ring
                   Mov    state ,#0
                   Mov    disp_flag,#0
                   Ret






         KEY_STATE:

               MOV R5,#100
      YOU_KEY2:MOV R7,#200
      YOU_KEY1:MOV R6,#125
      YOU_KEY0:JNB KEY_0,YOU_KEY
               JNB KEY_1,YOU_KEY
               ;JNB KEY_2,YOU_KEY
               JNB KEY_3,YOU_KEY
               JNB KEY_4,YOU_KEY
               DJNZ R6,YOU_KEY0
               DJNZ R7,YOU_KEY1
               DJNZ R5,YOU_KEY2
               LCALL READ1302
               LCALL WRITE1302

               mov clk_mon,clk_mon_1 ;恢复在状态2的闹钟以前的设置
               mov clk_day,clk_day_1
               mov clk_hour,clk_hour_1
               mov clk_MIN,clk_MIN_1
               mov c,naozhong_control_1
               mov naozhong_control,c
               mov c,clk_on_1
               mov clk_on,c
               CLR KEY_LOCK
               CLR KEY_LOCK1
               MOV STATE,#0
               MOV DISP_FLAG,#0
               MOV KEY_CLK_COUNT,#0
               MOV KEY_TIME_COUNT,#0
               CLR FUNCTION

               CLR WAIT_TIME

               ret
       YOU_KEY:SETB WAIT_TIME

               ret



LCDDISP:

       MOV COMM,#0CH
      LCALL SEND_COMM

        MOV R3,#15
        MOV COMM,#80H
        LCALL SEND_COMM
        MOV R0,#30H
 LINE_1:MOV DAT,@R0
        LCALL SEND_DAT
        INC R0
        DJNZ R3,LINE_1
        MOV R3,#15
        MOV COMM,#90H
        LCALL SEND_COMM
        MOV R0,#40H
 LINE_2:MOV DAT,@R0
        LCALL SEND_DAT
        INC R0
        DJNZ R3,LINE_2
        MOV A,STATE
        CJNE A,#1,STATE_TWO
        jb FUNCTION,LINE_TWO
        MOV COMM,#80H
        LCALL SEND_COMM
        MOV COMM,#0dH
        LCALL SEND_COMM
        SJMP LCDDISP_EXIT
LINE_TWO:
        MOV COMM,#90H
        LCALL SEND_COMM
        MOV COMM,#0dH
        LCALL SEND_COMM

        SJMP LCDDISP_EXIT
STATE_TWO:
        CJNE A,#2,LCDDISP_EXIT
        MOV COMM,RBLACK
        LCALL SEND_COMM
        MOV COMM,#0DH
        LCALL SEND_COMM
LCDDISP_EXIT:
        RET


EXCHANGE: MOV A,DISP_FLAG
          CJNE A,#0,EXCHANGE1
          LJMP FLAG_0
EXCHANGE1:CJNE A,#1,EXCHANGE2
          LJMP FLAG_1
EXCHANGE2:CJNE A,#2,EXCHANGE3
          LJMP FLAG_2
EXCHANGE3:cjne a,#3,EXCHANGE4
          ljmp FLAG_3
EXCHANGE4:ret
   FLAG_0: MOV 30H,#'2'
           MOV 31H,#'0'
         MOV 34H,#0C4H
         MOV 35H,#0EAH
         MOV 38H,#0D4H
         MOV 39H,#0C2H
         MOV 3CH,#0C8H
         MOV 3DH,#0D5H
         jb ring_on,FLAG_0_1
         MOV 3EH,#20H
         sjmp FLAG_0_2
FLAG_0_1:mov 3eh,#0eh
FLAG_0_2:MOV 42H,#20h;#0CAH
         MOV 43H,#3ah;#0B1H
         MOV 46H,#20h;#0B7H
         MOV 47H,#3ah;#0D6H
         MOV 4AH,#0D0H
         MOV 4BH,#0C7H
         MOV 4CH,#0C6H
         MOV 4DH,#0DAH
         LCALL LOADT
         RET

   FLAG_1:MOV R0,#30H
          MOV R1,#15
          MOV DPTR,#FUNC_TAB
  FLAG_11:CLR A
          MOVC A,@A+DPTR
          MOV @R0,A
          INC DPTR
          INC R0
          DJNZ R1,FLAG_11
          MOV R0,#40H
          MOV R1,#15
          MOV DPTR,#FUNC_TAB1
  FLAG_12:CLR A
          MOVC A,@A+DPTR
          MOV @R0,A
          INC DPTR
          INC R0
          DJNZ R1,FLAG_12
          RET
   FUNC_TAB:DB 31h,20h,0CAH,0B1H,0BCH,0E4H,0B9H,0A6H,0C4H,0DCH,0C9H,0E8H,0B6H,0A8H,20H,
   FUNC_TAB1:DB 32h,20h,0C4H,0D6H,0D6H,0D3H,0B9H,0A6H,0C4H,0DCH,0C9H,0E8H,0B6H,0A8H,20H

 FLAG_2:  LCALL CLK_LOADT_3
          MOV 42H,#0D4H
          MOV 43H,#0C2H
          MOV 46H,#0C8H
          MOV 47H,#0D5H
          MOV 4AH,#0CAH
          MOV 4BH,#0B1H
          MOV 4EH,#20H
          MOV 30H,#0C4H
          MOV 31H,#0D6H;NAO
          MOV 32H,#0D6H
          MOV 33H,#0D3H;ZHONG
          jnb clk_on,FLAG_2_1
          mov 34h,#0bfh
          mov 35h,#0aah  ;kai
          sjmp FLAG_2_2
 FLAG_2_1:mov 34h,#0b9h
          mov 35h,#0d8h  ;guan
 FLAG_2_2:MOV 36H,#20H
          MOV 37H,#20H
          MOV 38H,#0B4H
          MOV 39H,#0CEH;CI
          MOV 3AH,#0CAH
          MOV 3BH,#0FdH;SHU
          MOV 3CH,#20H
          MOV 3EH,#20H
          JB NAOZHONG_CONTROL,FLAG_2_3
          MOV 3DH,#31H
          RET
 FLAG_2_3:MOV 3DH,#4EH
          RET
;----------------------------------------------
 FLAG_3:  LCALL CLK_LOADT_3
          MOV 30H,#0C4H ;您定的时间已到20h
                        ;xx月xx日xx时xx20h
          MOV 31H,#0faH  ;nin
          MOV 32H,#0b6H
          MOV 33H,#0a8H ;ding
          MOV 34H,#0b5H
          MOV 35H,#0c4H;de
          MOV 36H,#0CAH
          MOV 37H,#0B1H ;shi
          MOV 38H,#0BCH
          MOV 39H,#0e4H ;jian                    0CAH,0B1H,0BCH,0BCH
          MOV 3AH,#0d2H
          MOV 3BH,#0D1H ;YI
          MOV 3CH,#0B5H
          MOV 3DH,#0BDH ;DAO
          MOV 3EH,#20H


          MOV 42H,#0D4H
          MOV 43H,#0C2H
          MOV 46H,#0C8H
          MOV 47H,#0D5H
          MOV 4AH,#0CAH
          MOV 4BH,#0B1H
          MOV 4EH,#20H

          RET



CLK_LOADT_3:      MOV R0,#CLK_MON
                  MOV R1,#40H
                  LCALL DIVIAD_CLK
                  MOV R0,#CLK_DAY
                  MOV R1,#44H
                  LCALL DIVIAD_CLK
                  MOV R0,#CLK_HOUR
                  MOV R1,#48H
                  LCALL DIVIAD_CLK
                  MOV R0,#CLK_MIN
                  MOV R1,#4CH
                  LCALL DIVIAD_CLK
                  RET
      DIVIAD_CLK: mov a,@R0
		  swap a
		  anl a,#0fh
		  ORL a,#30h
                  MOV @R1,A
		  INC R1
		  mov a,@R0
		  anl a,#0fh
		  ORL a,#30h
                  MOV @R1,A
		  ret

;--------------------------------------------
          LOADT:  MOV R0,#SEC
                  MOV R1,#SEC1
                  LCALL DIVIAD
                  MOV R0,#MIN
                  MOV R1,#MIN1
                  LCALL DIVIAD
                  MOV R0,#HOUR
                  MOV R1,#HOUR1
                  LCALL DIVIAD
                  MOV R0,#DAY
                  MOV R1,#DAY1
                  LCALL DIVIAD
                  MOV R0,#MON
                  MOV R1,#MON1
                  LCALL DIVIAD
                  MOV R0,#YEAR
                  MOV R1,#YEAR1
                  LCALL DIVIAD
                  MOV A,WEEK
                  ADD A,#30H
                  MOV WEEK1,A
                  RET
          DIVIAD: mov a,@R0
		  swap a
		  anl a,#0fh
		  ORL a,#30h
                  MOV @R1,A
		  INC R1
		  mov a,@R0
		  anl a,#0fh
		  ORL a,#30h
                  MOV @R1,A
		  ret


 LCDINI:
       LCALL  DELAY40MS
       LCALL DELAY1
       MOV A,#30H
       LCALL SEND_INI
       LCALL  DELAY40MS
       MOV A,#30H
       LCALL SEND_INI
       MOV COMM,#01H
       LCALL SEND_COMM
       LCALL DELAY1
       MOV COMM,#02H
       LCALL SEND_COMM
       MOV COMM,#0CH
       LCALL SEND_COMM
       MOV COMM,#06H
       LCALL SEND_COMM
       RET
  SEND_INI:clr rs
           clr rw
           mov p0,a
           setb e
           nop
           clr e
           ret
send_COMM:

         PUSH     ACC
         CLR      RS
         SETB     RW
send_COMM_1:
         MOV      P0,#0FFH
         SETB     E
         MOV      A,P0
         CLR      E
         JB       ACC.7,send_COMM_1
         CLR      RW
         MOV      P0,COMM
         SETB     E
         CLR      E
         POP      ACC
         RET




SEND_DAT:
         PUSH     ACC
         CLR      RS
         SETB     RW
SEND_DAT_1:
         MOV      P0,#0FFH
         SETB     E
         MOV      A,P0
         CLR      E
         JB       ACC.7,SEND_DAT_1
         SETB     RS
         CLR      RW
         MOV      P0,DAT
         SETB     E
         CLR      E
         POP      ACC
         RET

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

 KEY_CHECK:LCALL KEY1_CHECK ;查有无按键 返回非HAVE_KEY表示无
           JB HAVE_KEY, KEY_CHECK_1
           SJMP KEY_CHECK_EXIT
 KEY_CHECK_1:JB KP,KEY_CHECK_EXIT1

             LCALL KEY_VALUE ;取键值
             LCALL KEY_BRANCH ;键处理

             KEY_CHECK_EXIT:RET

KEY_CHECK_EXIT1:
                  LCALL DELAY40MS
                  LCALL DELAY40MS
                  LCALL DELAY40MS
                  LCALL DELAY40MS
                  ;LCALL DELAY40MS
                  CLR KP
                  RET

⌨️ 快捷键说明

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