📄 lcd_bk.asm
字号:
;--------------------------------------------------------
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 + -