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

📄 lcd_bk.asm

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

;--------------------------------------------------------
 KEY1_CHECK:
            JNB KEY_0,KEY1_CHECK_1
            JNB KEY_LOCK,KEY1_CHECK_EXIT
            JNB KEY_1,KEY1_CHECK_1
            ;JNB KEY_2,KEY1_CHECK_1
            JNB KEY_3,KEY1_CHECK_1
            JNB KEY_4,KEY1_CHECK_1
            CLR HAVE_KEY
            RET

KEY1_CHECK_1:LCALL DELAY10MS
             JNB KEY_0,KEY1_CHECK_2
             SJMP  KEY1_CHECK_0
KEY1_CHECK_2:SETB KEY_LOCK
             SETB KEY_LOCK1
             SETB HAVE_KEY
             LJMP KEY_CHECK_EXIT
KEY1_CHECK_0:JNB KEY_LOCK,KEY_CHECK_EXIT
             JNB KEY_1,KEY1_CHECK_3
             ;JNB KEY_2,KEY1_CHECK_3
             JNB KEY_3,KEY1_CHECK_3
             JNB KEY_4,KEY1_CHECK_3
             CLR HAVE_KEY
             RET
KEY1_CHECK_3:SETB HAVE_KEY
KEY1_CHECK_EXIT:RET
;---------------------------------------------------------------

KEY_VALUE:                   ;取键值
          JNB KEY_0,VALUE_1
          JNB KEY_1,VALUE_2
          ;JNB KEY_2,VALUE_3
          JNB KEY_3,VALUE_4
          MOV KVALUE,#3
          SJMP KEY_VALUE_EXIT
  VALUE_1:MOV KVALUE,#0
          SJMP KEY_VALUE_EXIT
  VALUE_2:MOV KVALUE,#1
          SJMP KEY_VALUE_EXIT
  ;VALUE_3:MOV KVALUE,#2
          ;SJMP KEY_VALUE_EXIT
  VALUE_4:MOV KVALUE,#2

KEY_VALUE_EXIT: RET
;----------------------------------------------------
  KEY_BRANCH:MOV A,KVALUE         ;根据键值作相应的案键处理
             RL A
             RL A
             MOV DPTR,#KEY_TAB
             JMP @A+DPTR
    KEY_TAB: LJMP KEY_BRANCH_0
             NOP
             LJMP KEY_BRANCH_1
             NOP
             ;LJMP KEY_BRANCH_2
             ;NOP
             LJMP KEY_BRANCH_3
             NOP
             LJMP KEY_BRANCH_4
             NOP
KEY_BRANCH_0:LCALL KEY0
             LJMP KEY_EXIT
KEY_BRANCH_1:LCALL KEY1
             LJMP KEY_EXIT
;KEY_BRANCH_2:LCALL KEY2
             ;LJMP KEY_EXIT
KEY_BRANCH_3:LCALL KEY3
             LJMP KEY_EXIT
KEY_BRANCH_4:LCALL KEY4
    KEY_EXIT:RET

;-------------------------------------------------------
     KEY0:
             MOV A,STATE
             CJNE A,#0,STATE_1
             MOV DISP_FLAG,#1;等于0说明是往下个状态
             MOV STATE,#1
             LJMP KEY0_EXIT
     STATE_1:CJNE A,#1,STATE_2
             MOV STATE,#1
             MOV DISP_FLAG,#1
             cpl function
             LJMP KEY0_EXIT
     STATE_2:
             JNB FUNCTION ,STATE_2_TIME  ;FUNCTION中状态2的画面选择1为上行
             INC KEY_CLK_COUNT
             MOV A,KEY_CLK_COUNT
             CJNE A,#1,STATE_2_CLK
             MOV RBLACK,#82H

             LJMP KEY0_EXIT_0
STATE_2_CLK: CJNE A,#2,STATE_2_CLK1
             MOV RBLACK,#86H

             LJMP KEY0_EXIT_0
STATE_2_CLK1:CJNE A,#3,STATE_2_CLK2
             MOV RBLACK,#90H
             MOV RTIME,#CLK_mon
             LJMP KEY0_EXIT_0
STATE_2_CLK2:CJNE A,#4,STATE_2_CLK3
             MOV RBLACK,#92H
             MOV RTIME,#CLK_day
             LJMP KEY0_EXIT_0
STATE_2_CLK3:CJNE A,#5,STATE_2_CLK4
             MOV RBLACK,#94H
             MOV RTIME,#CLK_hour
             LJMP KEY0_EXIT_0
STATE_2_CLK4:CJNE A,#6,STATE_2_CLK5
             MOV KEY_CLK_COUNT,#0
             MOV RBLACK,#96H
             MOV RTIME,#CLK_min
STATE_2_CLK5: LJMP KEY0_EXIT_0

STATE_2_TIME:INC KEY_TIME_COUNT
             MOV A,KEY_TIME_COUNT
             CJNE A,#1,STATE_2_TIME0
             MOV RBLACK,#81H
             MOV RTIME,#YEAR
             LJMP KEY0_EXIT_1
STATE_2_TIME0:CJNE A,#2,STATE_2_TIME1
             MOV RBLACK,#83H
             MOV RTIME,#MON
             LJMP KEY0_EXIT_1
STATE_2_TIME1:CJNE A,#3,STATE_2_TIME2
             MOV RBLACK,#85H
             MOV RTIME,#DAY
             LJMP KEY0_EXIT_1
STATE_2_TIME2:CJNE A,#4,STATE_2_TIME3
             MOV RBLACK,#90H
             MOV RTIME,#HOUR
             LJMP KEY0_EXIT_1
STATE_2_TIME3:CJNE A,#5,STATE_2_TIME4
             MOV RBLACK,#92H
             MOV RTIME,#MIN
             LJMP KEY0_EXIT_1
STATE_2_TIME4:CJNE A,#6,STATE_2_TIME5
             MOV RBLACK,#94H
             MOV RTIME,#SEC
             LJMP KEY0_EXIT_1
STATE_2_TIME5:
             CJNE A,#7,KEY0_EXIT_1
             MOV KEY_TIME_COUNT,#0
             MOV RBLACK,#97H
             MOV RTIME,#WEEK
KEY0_EXIT_1: MOV DISP_FLAG,#0
             MOV STATE,#2
             SETB KP        ;键已处理
             clr have_key   ;清有键标志
             SETB KEY_LOCK1
             RET

KEY0_EXIT_0:MOV DISP_FLAG,#2
            MOV STATE,#2
            ;SETB KEY_LOCK1
  KEY0_EXIT:SETB KP
            clr have_key
            SETB KEY_LOCK1
            RET

;-------------------------------------------------
      KEY1:     JNB KEY_LOCK,key1_clk7
                MOV A,STATE
                CJNE A,#2,KEY1_CLK0
                JNB FUNCTION ,KEY1_TIME
                MOV A, KEY_CLK_COUNT
                CJNE A,#3,KEY1_CLK1
                MOV BIG,#13H
                MOV SMALL,#01H
                LJMP KEY1_ADD
      KEY1_CLK0:LJMP KEY1_EXIT
      KEY1_CLK1:CJNE A,#4,KEY1_CLK2
                MOV BIG,#32H
                MOV SMALL,#01H
                LJMP KEY1_ADD
      KEY1_CLK2:CJNE A,#5,KEY1_CLK3
                MOV BIG,#24H
                MOV SMALL,#00H
                LJMP KEY1_ADD
      KEY1_CLK3:CJNE A,#0,KEY1_CLK4
                MOV BIG,#60H
                MOV SMALL,#00H
                LJMP KEY1_ADD
      KEY1_CLK4:CJNE A,#2,KEY1_CLK5
                CPL NAOZHONG_CONTROL
      KEY1_CLK5:CJNE A,#1,KEY1_CLK6
                cpl clk_on
      KEY1_CLK6:;SETB KEY_LOCK1
                RET
      KEY1_CLK7:ljmp KEY3_EXIT_1
    KEY1_TIME:  MOV A,KEY_TIME_COUNT   ;1号键的处理程序 功能加1
                CJNE A,#1,KEY1_TIME1
                MOV BIG,#0A0H      ;时间的上限
                MOV SMALL,#00H      ;时间的下限
                LJMP KEY1_ADD
         KEY1_TIME1:CJNE A,#2,KEY1_TIME2
                MOV BIG,#13H
                MOV SMALL,#01H
                LJMP KEY1_ADD
         KEY1_TIME2:CJNE A,#3,KEY1_TIME3
                MOV BIG,#32H
                MOV SMALL,#01H
                LJMP KEY1_ADD
         KEY1_TIME3:CJNE A,#4,KEY1_TIME4
                MOV BIG,#24H
                MOV SMALL,#00H
                LJMP KEY1_ADD
        KEY1_TIME4:CJNE A,#5,KEY1_TIME5
                MOV BIG,#60H
                MOV SMALL,#00H
                LJMP KEY1_ADD
        KEY1_TIME5:CJNE A,#6,KEY1_TIME6
                MOV BIG,#60H
                MOV SMALL,#0
                LJMP KEY1_ADD
        KEY1_TIME6:CJNE A,#0,KEY1_TIME7
                MOV BIG,#08H
                MOV SMALL,#1
                LJMP KEY1_ADD
        KEY1_TIME7:SETB KP
                   ;SETB KEY_LOCK1
                   RET

        KEY1_ADD:
                MOV R1,RTIME          ;此段程序为公共的处理加1的核心程序
                MOV A,@R1
                CJNE A,BIG,KEY1_ADD1
                MOV @R1,SMALL
                MOV A,@R1
      KEY1_ADD1:ANL A,#0FH
                CJNE A,#09H,KEY1_11
                MOV A,@R1
                ADD A,#7
                MOV @R1,A
                LJMP KEY1_13
        KEY1_11:INC @R1
                MOV A,@R1
        KEY1_13:CJNE A,BIG,KEY1_EXIT
                MOV @R1,SMALL
      KEY1_EXIT:SETB KP
                SETB KEY_LOCK1
                RET


;-------------------------------------------------------------------
   ; KEY2:        RET
;
;----------------------------------------------------------------------
      KEY4:    MOV A,STATE
               CJNE A,#1,KEY4_STATE_2
               JB FUNCTION,STATE_1_CLK
               MOV STATE,#2
               MOV DISP_FLAG,#0
               MOV RBLACK,#81H
               SETB KEY_LOCK1
               inc key_time_count
               SJMP KEY4_EXIT
   STATE_1_CLK:MOV STATE,#2
               MOV DISP_FLAG,#2
               MOV RBLACK,#82H
               SETB KEY_LOCK1
               inc key_clk_count
               mov clk_mon_1,clk_mon ;保存以前的闹钟设置
               mov clk_day_1,clk_day
               mov clk_hour_1,clk_hour
               mov clk_MIN_1,clk_MIN
               mov c,naozhong_control
               mov naozhong_control_1,c

               mov c,clk_on
               mov clk_on_1,c
               SJMP KEY4_EXIT
  KEY4_STATE_2:CJNE A,#2,KEY4_EXIT
               JB FUNCTION,STATE_2_CLK0
               LCALL WRITE1302
               LCALL READ1302
               MOV STATE,#0
               MOV DISP_FLAG,#0
               MOV KEY_CLK_COUNT,#0
               MOV KEY_TIME_COUNT,#0
               CLR FUNCTION
               CLR NAOZHONG_CONTROL
               CLR KEY_LOCK
               CLR KEY_LOCK1
               ;clr clk_on
               SJMP KEY4_EXIT
  STATE_2_CLK0:MOV STATE,#0
               MOV DISP_FLAG,#0
               CLR FUNCTION
               MOV KEY_CLK_COUNT,#0
               MOV KEY_TIME_COUNT,#0
               CLR KEY_LOCK
               CLR KEY_LOCK1
               jb clk_on,STATE_2_CLK_2
               clr ring_on
               clr clk_once
               clr clk_ever
               clr NAOZHONG_CONTROL
               sjmp KEY4_EXIT
 STATE_2_CLK_2:setb ring_on

               JNB NAOZHONG_CONTROL,STATE_2_CLK01
               SETB CLK_ONCE
               CLR NAOZHONG_CONTROL
               CLR KEY_LOCK1
               SJMP KEY4_EXIT
 STATE_2_CLK01:CLR NAOZHONG_CONTROL
               SETB CLK_EVER
     KEY4_EXIT:mov clk_mon_1,clk_mon ;保存当前的闹钟设置到备份中
               mov clk_day_1,clk_day
               mov clk_hour_1,clk_hour
               mov clk_MIN_1,clk_MIN
               mov c,naozhong_control
               mov naozhong_control_1,c

               mov c,clk_on
               mov clk_on_1,c

               SETB KP
               RET
 ;-----------------------------------------------------------
   key3:       MOV A,STATE
               CJNE A,#1,KEY3_STATE_2
               LCALL READ1302
               LCALL WRITE1302

               MOV STATE,#0
               MOV DISP_FLAG,#0
               MOV KEY_CLK_COUNT,#0
               MOV KEY_TIME_COUNT,#0
               CLR FUNCTION
               CLR KEY_LOCK
               CLR KEY_LOCK1
               SETB KP
               RET
  KEY3_STATE_2:CJNE A,#2,KEY3_EXIT_1
               jnb function,key3_time
               mov clk_mon,clk_mon_1 ;恢复以前的闹钟设置
               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
               sjmp key3_exit
   key3_time:  lcall read1302
   KEY3_EXIT:  MOV STATE,#1
               MOV DISP_FLAG,#1
               MOV KEY_CLK_COUNT,#0
               MOV KEY_TIME_COUNT,#0
               SETB KEY_LOCK1
               SJMP KEY3_EXIT_0
   KEY3_EXIT_1:MOV STATE,#0
               MOV DISP_FLAG,#0
               MOV KEY_CLK_COUNT,#0
               MOV KEY_TIME_COUNT,#0
               CLR KEY_LOCK
               CLR KEY_LOCK1
               clr function
   KEY3_EXIT_0:

               SETB KP
               RET
 ;----------------------------------------------------------------------

   WRITE1302: PUSH 01H         ;把更改或初始化写入ds1302
              PUSH 02H
              PUSH 03H
              CLR RST
              CLR SCLK
              SETB RST
              MOV IN_BYTE,#8EH
              LCALL SEND_BYTE
              MOV IN_BYTE,#0
              LCALL SEND_BYTE
              SETB SCLK
              CLR RST
              MOV R1,#SEC
              MOV R2,#7
              MOV R3,#80H
     SEND_GO: CLR RST
              CLR SCLK
              SETB RST
              MOV IN_BYTE,R3
              LCALL SEND_BYTE
              NOP
              NOP
              MOV A,@R1
              MOV IN_BYTE,A
              LCALL SEND_BYTE
              NOP
              NOP
              INC R1
              INC R3
              INC R3
              SETB SCLK
              CLR RST
              DJNZ R2,SEND_GO
              CLR RST
              CLR SCLK
              SETB RST
              MOV IN_BYTE,#8Eh ;命令字节为8E
              LCALL SEND_BYTE
              MOV IN_BYTE,#80H;WP=1
              LCALL SEND_BYTE
              SETB SCLK
              CLR RST
              POP 03H
              POP 02H
              POP 01H
              RET

READ1302:             ;读ds1302 数据存放到以sec开始的7个字节
         PUSH 01H
         PUSH 02H
         PUSH 03H
         MOV R1,#SEC

         MOV R2,#81H
         MOV R3,#7
  READ_1:CLR RST
         CLR SCLK
         SETB RST
         MOV IN_BYTE,R2
         LCALL SEND_BYTE
         LCALL GET_BYTE
         MOV @R1,A
         INC R1
         INC R2
         INC R2
         SETB SCLK
         CLR RST
         DJNZ R3,READ_1
         POP 03H
         POP 02H
         POP 01H
         RET




GET_BYTE:                ;51串口 一次发送1字节数据
	        CLR A ;清类加器
	        CLR C ;清进位位C
	        MOV BitCnt,#08h ;接收位数为8
G_Byte2:

	         MOV C,IO_DATA ;数据总线上的数据传送给C
	         RRC A ;从最低位接收数据
	         SETB SCLK ;时钟总线置高
	         NOP
	         CLR SCLK ;时钟下降沿接收数据有效
	         DJNZ BitCnt,G_Byte2 ;位接收未完毕则继续
	         RET

Send_Byte:


	MOV A,IN_BYTE ;准备发送命令字节
	MOV BitCnt,#08h ;传送位数为8
S_Byte0:
	RRC A ;将最低位传送给进位位C
	MOV IO_DATA,C ;位传送至数据总线
	NOP
	SETB SCLK ;时钟上升沿发送数据有效
	NOP
	CLR SCLK ;清时钟总线
	DJNZ BitCnt,S_Byte0 ;位传送未完毕则继续
	NOP

        RET

 Osc_Enable:         ;使ds1302开始计时
            CLR RST
            CLR SCLK
            SETB RST
            MOV IN_BYTE,#80h ; 命令字节为80
            LCALL SEND_BYTE


            MOV IN_BYTE,#00h ;数据内容为0 振荡器工作允许
            LCALL Send_Byte ;调用写入数据子程序
            SETB SCLK
            CLR RST
            RET

DELAY40MS:   PUSH 06H           ;40ms 延时
          PUSH 07H
          MOV R7,#160
   DEL:   MOV R6,#125
          DJNZ R6,$
          DJNZ R7,DEL
          POP 07H
          POP 06H
          RET
  DELAY10MS:   PUSH 06H      ;10ms 延时
          PUSH 07H
          MOV R7,#40
  DEL0:   MOV R6,#125
          DJNZ R6,$
          DJNZ R7,DEL0
          POP 07H
          POP 06H
          RET
DELAY1 :   PUSH 06H          ;100us 延时
          PUSH 07H
          MOV R7,#1
   DEL1:   MOV R6,#40
          DJNZ R6,$
          DJNZ R7,DEL1
          POP 07H
          POP 06H
          RET

end

⌨️ 快捷键说明

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