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

📄 01-15.asm

📁 基于51的多功能电子钟,多闹钟,温度测试
💻 ASM
📖 第 1 页 / 共 4 页
字号:
    CJNE A,#012H,NEXT2      ;当按下"ENTER"时进入功能设定,否则向下运行
    LCALL INITIAL
    SJMP NEXT3

NEXT2:
    LCALL KEYWRONG          ;跳到错误键盘输入子程序
    SJMP LOOP1



NEXT3:                      ;功能设定
    MOV A,#080H
    LCALL WRITE_COM
    MOV DPTR,#LINE4         ;显示1:时钟调整菜单项
    LCALL DISP2
    MOV A,#0C0H
    LCALL WRITE_COM
    MOV DPTR,#LINE5         ;显示2:闹钟设定菜单项
    LCALL DISP2
    MOV A,#0C8H
    LCALL WRITE_COM
    MOV DPTR,#LINE6         ;显示3:返回上一级的菜单项
    LCALL DISP2

FUN2:
    LCALL KEYWAIT
    MOV A,KEYNAME
    CJNE A,#00H,LOOP3
    SJMP FUN2
LOOP3:
    CJNE A,#01H,NEXT4        ;当输入"1"时进入调整时间 ,否则向下执行
    LCALL INITIAL
    MOV  MOUSE,#083H
    LCALL INITIAL
    LCALL READTIME
    LCALL DISP
    LCALL DEL10MS
    SJMP SETTIME
NEXT4:
    CJNE A,#02H,NEXT5        ;当输入"2时进入设定闹钟,否则向下执行
    LCALL INITIAL
    SJMP SETCLOCK
NEXT5:
    CJNE A,#11H,NEXT6        ;当输入"ESC"时返回上一级菜单,否则向下执行
    LCALL INITIAL
    LJMP LOOP1
NEXT6:                       ;当输入错误时进入键盘输入错误处理子程序
    LCALL KEYWRONG
    SJMP NEXT3




SETTIME:                     ;时间调整功能
    LCALL DISP
    MOV A,MOUSE
    LCALL WRITE_COM
    MOV A,#00001110B
    LCALL WRITE_COM
    LCALL DEL10MS
    LCALL KEYWAIT
    MOV A,KEYNAME
    CJNE A,#00H,LOOP4
    SJMP SETTIME


;---------------------------------------
;时间调整功能
;------------------------------------------

;---------------------------------------------------
;;通过"A"."B"."DOWN"."UP"键来确定需要调整的项目
;---------------------------------------------------
LOOP4:
   CJNE A,#0BH,NEXT7              ;输入"B"键时光标向右移动
   MOV A,MOUSE
   INC A
   MOV MOUSE,A
   SJMP SETTIME

NEXT7:                            ;输入"A"键时光标向左移动
   CJNE A,#0AH,NEXT8
   MOV A,MOUSE
   DEC A
   MOV MOUSE,A
   SJMP SETTIME                   ;输入"DOWN"键时光标向下

NEXT8:
   CJNE A,#10H,NEXT9
   MOV MOUSE,#0C4H
   SJMP SETTIME
NEXT9:
   CJNE A,#13H,NEXT10              ;输入"UP"键时光标向上移动
   MOV MOUSE,#083H
   SJMP SETTIME
NEXT10:                            ;输入"ESC"键时返回上一级菜单
   CJNE A,#011H,NEXT11
   LCALL INITIAL
   LJMP NEXT3

NEXT11:
                                   ;调用具体时间调整子程序
   LCALL TIMEAD                    ;将所获设定值秒至年的时间写入发送缓冲区中赋给时间存储单元
   MOV 58H,76H
   MOV 57H,75H
   MOV 56H,74H
   MOV 55H,73H
   MOV 54H,72H
   MOV 53H,71H
   MOV 52H,70H
   LCALL SENDTIME                  ;调用送时间子程序
   LCALL READTIME                  ;调用时间读取子程序
   SJMP SETTIME



;------------------------------------------------------
;闹钟设定功能
;------------------------------------------------------
SETCLOCK:                          ;闹钟设定功能
   LCALL INITIAL
   ;MOV DPL,CLOADR1
   ;MOV DPH,CLOADR2
   MOV CLONUM1,#01H
   MOV MOUSE,#08DH
   LCALL ALMKEYDO
   LJMP NEXT3
EXIT2:
   RET
END



;-----------------------------------------------------
;闹钟对按键输入的响应子程序;
;----------------------------------------------------
PROC ALMKEYDO
ALMKEYDO:
LOOP1:                             ;LCM第一行显示

   MOV A,#080H                     ;确定显示的首地址
   LCALL WRITE_COM

   MOV A,CLONUM1                   ;将闹钟的序号送显示
   MOV R5,A
   LCALL BREAK
   MOV A,#083H
   LCALL WRITE_COM                 ;显示"ALARM"字符
   MOV DPTR,#LINE9                 ;调用字符显示子程序DISP2
   LCALL DISP2
   MOV A,MOUSE                     ;显示向左的平行箭头
   CJNE A,#08DH,NEXT1
   LCALL WRITE_COM
   MOV A,#07FH
   LCALL WRITE_DATA
NEXT1:
   MOV A,#089H                     ;判断闹钟存储单元内容是否为空,为空则表示该闹钟未设置,显示"NO"
   LCALL WRITE_COM
   ;MOV DPL,CLOADR1
  ; MOV DPH,CLOADR2
   MOV DPTR,#0000H
   MOVX A,@DPTR
   CJNE A,#00H,NEXT2
   MOV DPTR,#LINE11
   LCALL DISP2
   LCALL DEL10MS
   MOV A,#08H
   ADD A,CLOADR1
   MOV CLOADR1,A
   SJMP NEXT3
NEXT2:
   MOV DPTR,#LINE10                ;闹钟存储单元内容不为空,则表示该闹钟有设置,显示"OK"
   LCALL DISP2
   LCALL DEL10MS
   MOV A,#08H
   ADD A,CLOADR1
   MOV CLOADR1,A
   SJMP NEXT3

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

NEXT3:                             ;LCM第二行显示
   INC CLONUM1
   MOV A,#0C0H                     ;LCM第二行显示首地址送显示
   LCALL WRITE_COM
   MOV A,CLONUM1                   ;将闹钟的序号送显示
   CJNE A,#0AH,ALM1
   MOV CLONUM1,#01H
   SJMP LOOP1
ALM1:
   CJNE A,#0BH,ALM2
   MOV CLONUM1,#01H
   SJMP LOOP1
ALM2:
   MOV R5,A
   LCALL BREAK
   DEC CLONUM1
   MOV A,#0C3H
   LCALL WRITE_COM
   MOV DPTR,#LINE9                 ;显示"ALARM"字符
   LCALL DISP2                     ;调用字符显示子程序DISP2

   MOV A,MOUSE
   CJNE A,#0CDH,NEXT4
   LCALL WRITE_COM
   MOV A,#07FH
   LCALL WRITE_DATA
NEXT4:
   MOV A,#0C9H
   LCALL WRITE_COM
   MOV DPTR,#0010H                 ;判断闹钟存储单元内容是否为空,为空则表示该闹钟未设置,显示"NO"
   MOVX A,@DPTR
   CJNE A,#00H,NEXT5
   MOV DPTR,#LINE11
   LCALL DISP2
   LCALL DEL10MS
   MOV A,#08H
   ADD A,CLOADR1
   MOV CLOADR1,A
   SJMP NEXT6
NEXT5:
   MOV DPTR,#LINE10                ;闹钟存储单元内容不为空,则表示该闹钟有设置,显示"OK"
   LCALL DISP2
   MOV A,#08H
   ADD A,CLOADR1
   MOV CLOADR1,A

NEXT6:                             ;调用键盘输入子程序以判断要执行的下一步
   LCALL KEYWAIT
   MOV A,KEYNAME                   ;无键盘输入则继续等待键盘输入
   CJNE A,#00H,NEXT7
   LJMP LOOP1




;---------------------------------
;处理闹钟设置的键盘响应
;---------------------------------
NEXT7:
   MOV A,KEYNAME
   CJNE A,#013H,NEXT10              ;响应输入了"UP"键
   MOV A,CLONUM1
   CJNE A,#01H,NEXT8
   LJMP LOOP1
NEXT8:
   LCALL INITIAL
   MOV A,MOUSE
   CJNE A,#0CDH,NEXT9
   MOV MOUSE,#08DH
   DEC CLONUM1
   LJMP LOOP1

NEXT9:
   DEC CLONUM1
   LJMP LOOP1



NEXT10:                             ;响应输入了"DOWN"键
   MOV A,KEYNAME
   CJNE A,#10H,NEXT13
   MOV A,CLONUM1
   CJNE A,#32,NEXT11
   LJMP LOOP1
NEXT11:
   LCALL INITIAL
   MOV A,MOUSE
   CJNE A,#08DH,NEXT12
   MOV MOUSE,#0CDH
   LJMP LOOP1
NEXT12:
   MOV A,#02H
   ADDC A,CLONUM1
   MOV CLONUM1,A
   LJMP LOOP1



NEXT13:                             ;响应输入了"Enter"键

   CJNE A,#012H,FUN20
  ;MOV A,MOUSE
  ;CJNE A,#08DH,NEXT14
  ;MOV DPL,CLOADR1
  ;MOV DPH,CL
;----------------------------------------------
;具体的闹钟设置
;------------------------------------------------


FUN23:                             ;先清除LCM显示的内容
   LCALL INITIAL                   ;调用闹钟的时间设置子菜单
   LCALL DISP5
   LCALL DEL10MS
   LCALL KEYWAIT
   MOV A,KEYNAME                   ;等待按键才执行下一步
   CJNE A,#00H,FUN21
   MOV KEYNAME,#00H
   SJMP FUN23


FUN21:
   CJNE A,#011H,NEXT14             ;按下了"ESC"就返回上一层菜单
   LCALL INITIAL
   LJMP LOOP1
FUN20:LJMP NEXT20                  ;辅跳转指令

NEXT14:
   CJNE A,#02H,NEXT15              ;按下了"2"则执行删除闹钟指令
   LCALL INITIAL
   CLR ALMODE1
   MOV R5,#07H
   MOV DPTR,#0000H
   MOV A,#00H
LOOP2:
   MOVX @DPTR,A
   DJNZ R5,LOOP2
   LJMP LOOP1



NEXT15:
   CJNE A,#01H,NEXT16               ;按下了"1"则进入闹钟时间设置
   LCALL INITIAL
   LCALL DISP
   MOV MOUSE,#083H
   SJMP FUN15

NEXT16:                             ;没有输入正确按键,调用错误输入提示子程序
   LCALL KEYWRONG
   LJMP FUN23


FUN15:
   MOV A,MOUSE
   LCALL WRITE_COM
   MOV A,#00001110B
   LCALL WRITE_COM
   LCALL DEL10MS
   LCALL KEYWAIT
   MOV A,KEYNAME
   CJNE A,#00H,LOOP34
   SJMP FUN15


;---------------------------------------
;闹钟时间调整功能
;------------------------------------------

;---------------------------------------------------
;;通过"A"."B"."DOWN"."UP"键来确定需要调整的项目
;---------------------------------------------------
LOOP34:
    CJNE A,#0BH,NEXT37              ;输入"B"键时光标向右移动
    MOV A,MOUSE
    INC A
    MOV MOUSE,A
    SJMP FUN15

NEXT37:                             ;输入"A"键时光标向左移动
   CJNE A,#0AH,NEXT38
   MOV A,MOUSE
   DEC A
   MOV MOUSE,A
   SJMP FUN15                       ;输入"DOWN"键时光标向下

NEXT38:
   CJNE A,#10H,NEXT39
   MOV MOUSE,#0C4H
   SJMP FUN15
NEXT39:
   CJNE A,#13H,NEXT30               ;输入"UP"键时光标向上移动
   MOV MOUSE,#083H
   SJMP FUN15
NEXT30:                             ;输入"ESC"键时返回上一级菜单
   CJNE A,#011H,NEXT31
FUN30:
   LCALL INITIAL
   LCALL DISP6
   LCALL DEL10MS
   LCALL KEYWAIT
   MOV A,KEYNAME
   MOV DPTR ,#0006H
   CJNE A,#00H,NEXT301
   SJMP FUN30
NEXT301:
   CJNE A,#01H,NEXT302
   MOVX @DPTR,A
   LJMP EXIT30
NEXT302:
   CJNE A,#02H,NEXT303
   MOVX @DPTR,A
   LJMP EXIT30
NEXT303:
   CJNE A,#03H,NEXT304
   MOVX @DPTR,A
   LJMP EXIT30
NEXT304:
   LCALL KEYWRONG
   LJMP FUN30
EXIT30:
   LJMP FUN23

NEXT31:
                                    ;输入了"Enter"则调用具体时间调整子程序
   LCALL TIMEAD                     ;将所获设定值秒至年的时间写入发送缓冲区中赋给时间存储单元
   MOV DPTR,#0000H
   MOV A,71H                        ;将获得的闹钟时间设置值赋给缓冲区
   MOVX @DPTR,A
   INC DPTR
   MOV A,72H
   MOVX @DPTR,A
   MOV A,73H
   INC DPTR
   MOVX @DPTR,A
   INC DPTR
   MOV A,74H
   MOVX @DPTR,A
   INC DPTR
   MOV A,75H
   MOVX @DPTR,A
   INC DPTR
   MOV A,76H
   MOVX @DPTR,A

   LJMP FUN15
NEXT20:                             ;响应输入了"Esc"键,跳回上一层菜单
   MOV A,KEYNAME
   CJNE A,#011H,NEXT21
   LCALL INITIAL
   SJMP EXIT

NEXT21:
   LJMP NEXT6
EXIT:

   RET
END



;---------------------------------------------------
;具体时间调整子程序
;---------------------------------------------------
PROC TIMEAD
TIMEAD:

    MOV A,MOUSE

NEXT1:
    CJNE A,#83H,NEXT2             ;年的十位调整项
    MOV A,#083H
    LCALL WRITE_COM
    MOV R6,#0A0H
    LCALL DISP3
    MOV 76H,R5
    LJMP EXIT
NEXT2:                             ;年的个位调整项
    CJNE A,#084H,NEXT3
    MOV A,#084H
    LCALL WRITE_COM
    MOV R5,76H
    MOV R6,#09AH
    LCALL DISP4
    MOV 76H,R5

    LJMP EXIT
NEXT3:
    CJNE A,#86H,NEXT4              ;月的十位调整项 范围:0-1
    MOV A,#086H
    LCALL WRITE_COM
    MOV R6,#020H
    LCALL DISP3
    MOV 75H,R5

    LJMP EXIT

NEXT4:
    CJNE A,#087H,NEXT5             ;月的个位调整项 范围:0-9
    MOV A,#087H
    LCALL WRITE_COM
    MOV R5,75H
    MOV R6,#13H
    LCALL DISP4
    MOV 75H,R5
    LJMP EXIT
NEXT5:
    CJNE A,#89H,NEXT6             ;日的十位调整项 范围:0-3
    MOV A,#089H
    LCALL WRITE_COM
    MOV R6,#40H
    LCALL DISP3
    MOV 73H,R5
    LJMP EXIT
NEXT6:
    CJNE A,#08AH,NEXT7            ;日的个位调整项 范围:0-9
    MOV A,#08AH
    LCALL WRITE_COM
    MOV R5,73H
    MOV R6,#032H
    LCALL DISP4
    MOV 73H,R5
   LJMP EXIT
NEXT7:

⌨️ 快捷键说明

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