📄 01-15.asm
字号:
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 + -