📄 key_ledbb
字号:
;********************** 程序说明 **************************
;按键K1,K2为独立式键盘,K1对应P3.2,K2对应P3.3
;K1模式选择键,其对应的模式有:
;LED_DISPLAY1: LED逐个左移点亮
;LED_DISPLAY2: LED逐个右移点亮
;LED_DISPLAY3: LED流水灯左移
;LED_DISPLAY4: LED流水灯右移
;K2显示时间选择键,其对应的时间间隔有:
;0.5S
;1.0S
;1.5S
;2.0S
;***********************************************************
ORG 8000H
LJMP START
ORG 800BH
LJMP TIMER0
ORG 8100H
TIME_05 EQU 30H ;0.5S的定时记数器
TIME_10 EQU 31H ;1S 的定时记数器
TIME_15 EQU 32H ;1.5S的定时记数器
TIME_20 EQU 33H ;2.0S的定时记数器
LED_STATE EQU 34H ;LED显示状态变量
LED_TIME_SEL EQU 35H ;LED显示状态变化时间选择变量
;LED_TIME_SEL=1 LED的刷新时间为0.5S
;LED_TIME_SEL=2 LED的刷新时间为1S
;LED_TIME_SEL=3 LED的刷新时间为1.5S
LED_MODE_SEL EQU 36H ;LED显示模式选择变量
;LED_MODE_SEL=1 LED的显示方式为拉屏显示,即LED_DISPLAY1
;LED_MODE_SEL=2 LED的显示方式为正向流水灯,即LED_DISPLAY2,且FOLLOW_BACK=0
;LED_MODE_SEL=3 LED的显示方式为反向流水灯,即LED_DISPLAY2,且FOLLOW_BACK=1
KEY_VALUE EQU 37H ;键盘键值寄存器
KEY_PUSH_TIME EQU 38H ;键盘被按下的次数,即按键码时间=10ms*次数
KEY_STATE EQU 39H ;键盘状态寄存器
KEY_NAME EQU 40H ;键盘键名寄存器
KEY_NAME_OUT EQU 41H ;键盘键名输出寄存器
DISP_REG EQU 42H ;LED显示寄存器
FOLLOW_KEY EQU 43H ;上一次按键寄存器
KEY_GET_REG EQU 44H ;取键值状态寄存器
OLD_KEY EQU 45H ;旧键寄存器
T05flag BIT 00H ;0.5S的定时时标位
T10flag BIT 01H ;1S 的定时时标位
T15flag BIT 02H ;1.5S的定时时标位
T20flag BIT 03H ;2.0S的定时时标位
T10MSflag BIT 04H ;10mS的定时时标位
MODEflag BIT 05H ;MODE选择标志位
TIMEflag BIT 06H ;TIME选择标志位
KEY_LED_flag bit 07h ;按键与显示状态标志位 KEY为0,LED为1
KEYSUCCflag BIT 08H ;按键成功标志位
K1_flag BIT 09H ;K1一次按键有效标志位
K2_flag BIT 0AH ;K2一次按键有效标志位
START:
MOV SP,#60H
MOV TIME_05,#10 ;初始化 50mS*10=0.5S
MOV TIME_10,#20 ;初始化 50mS*20=1.0S
MOV TIME_15,#30 ;初始化 50mS*30=1.5S
MOV TIME_20,#40 ;初始化 50mS*40=2.0S
MOV LED_STATE,#02 ;初始化 LED显示状态变量
MOV LED_TIME_SEL,#1 ;初始化 LED显示时间选择变量
MOV LED_MODE_SEL,#1 ;初始化 LED显示模式选择变量
MOV KEY_VALUE,#11H ;初始化 键盘键值寄存器
MOV KEY_PUSH_TIME,#00H ;初始化 按键次数寄存器
MOV KEY_STATE,#00H ;初始化 按键状态寄存器
MOV KEY_NAME,#00H ;初始化 键盘键名寄存器
MOV KEY_NAME_OUT,#00H ;初始化 键盘键名输出寄存器
MOV DISP_REG,#0FEH ;初始化 LED显示寄存器
MOV FOLLOW_KEY,#00H ;初始化 前一次按键寄存器
MOV KEY_GET_REG,#00H ;初始化 取键值状态寄存器
MOV OLD_KEY,#00H ;初始化 旧键寄存器
CLR T05flag
CLR T10flag
CLR T15flag
CLR T20flag
CLR T10MSflag
CLR MODEflag
CLR TIMEflag
CLR KEYSUCCflag
SETB KEY_LED_flag ;初始化,设为LED显示状态
CLR K1_flag
CLR K2_flag
MOV TH0,#0D8H ;设计数初值,定时时间为10mS
MOV TL0,#0F0H
MOV TMOD,#01H ;定时器0工作于方式2,为16位的定时器
SETB ET0
SETB TR0
SETB EA
MAIN_LOOP: ;主程序入口
TEST_POINT1:
MAIN_NEXT1:
JNB T10MSflag,MAIN_NEXT2 ;10MS调一下键盘扫描
CLR T10MSflag ;清10MS时标标志位
LCALL KEY
MAIN_NEXT2:
;JNB KEY_LED_flag,MAIN_NEXT3
LCALL TIME_MODE_SEL
LJMP MAIN_LOOP
MAIN_NEXT3:
MOV A,KEY_VALUE
CPL A
MOV P1,A
LJMP MAIN_LOOP ;主程式序循环扫描
;***************************************************************
;独立键盘处理程序
;K1从P3.2输入 K2从P3.3输入
;K1为模式选择键,K2为方式选择键
;***************************************************************
KEY:
PUSH ACC
PUSH PSW
MOV A,P3
ORL A,#0CH
MOV A,P3
ANL A,#0CH
CJNE A,#0CH,KEY_00; ;没有键按下直接退出
LJMP KEY_FF;
KEY_00:
CJNE A,OLD_KEY,KEY_AA ;本次按键与上次按键相比较
LJMP KEY_BB
KEY_AA:
MOV OLD_KEY,A ;将新键存入寄存器
MOV KEY_STATE,#00H ;按键状态寄存器清零
KEY_BB:
LCALL KEY_WENDING ;调按键去抖动,延时程序
JNB KEYSUCCflag,KEY_EE;
CLR KEYSUCCflag
CJNE A,#08H,KEY_DD ;判断P3。3是否按下
SETB K1_flag
MOV A,KEY_VALUE ;将原键盘值取出
SWAP A
ANL A,#0FH ;屏蔽高四位
INC A ;将模式选择加1,即选择下一个LED显示模式
CJNE A,#05H,KEY_MODE1A ;模式选择只有1-4 四种方式
ANL A,#01H ;将低四位置为1
KEY_MODE1A:
SWAP A
ANL KEY_VALUE,#0FH ;将高四位屏蔽
ORL KEY_VALUE,A
MOV DISP_REG,#0FEH
LJMP KEY_EE
KEY_DD: CJNE A,#04H,KEY_EE ;判断P3。2是否按下
SETB K2_flag
MOV A,KEY_VALUE ;将原键盘值取出
INC A ;将模式选择加1,即选择下一个LED显示模式
ANL A,#07H ;将高四位屏蔽
CJNE A,#05H,KEY_TIME1A ;时间选择只有1-4 四种方式
ANL A,#0F1H ;将低四位置为1
KEY_TIME1A:
ANL KEY_VALUE,#0F0H ;将低四位屏蔽
ORL KEY_VALUE,A ;将KEY_VALUE返回
KEY_EE:
; LCALL KEY_VALUE_GET
KEY_FF:
POP PSW
POP ACC
RET
;***************************************************************
;***************************************************************
;按键稳定程序:去抖动,并且确认有键按下
;***************************************************************
KEY_WENDING:
PUSH ACC
PUSH PSW
MOV A,KEY_STATE
KSR0:
CJNE A,#00H,KSR1
MOV KEY_STATE,#01H ;将按键状态寄存器转为1
POP PSW
POP ACC
RET
KSR1:
CJNE A,#01H,KSR2
MOV KEY_STATE,#02H ;将按键状态寄存器转为2
CLR KEY_LED_flag ;当有确认有键盘按下,显示指示为KEY按键状态指示
POP PSW
POP ACC
RET
KSR2:
CJNE A,#02H,KSR3
INC KEY_PUSH_TIME
MOV A,KEY_PUSH_TIME
CJNE A,#35,KSR_OUT ;键按下未到350MS,则跳出
SETB KEYSUCCflag ;按键有效标志位
MOV KEY_PUSH_TIME,#00H ;将按键次数记数器清
MOV KEY_STATE,#00H ;将按键状态寄存器设为0
KSR3:
KSR_OUT:
POP PSW
POP ACC
RET
;***************************************************************
;***************************************************************
;LED显示输出程序
;***************************************************************
TIME_MODE_SEL:
PUSH ACC
PUSH PSW
MOV A,KEY_VALUE
ANL A,#0F0H ;屏蔽低四位
MODE1: ;显示方式11-14 LED_DISPLAY1: LED逐个左移点亮
CJNE A,#10H, MODE2 ;判断是否为模式1
MOV A,KEY_VALUE
ANL A,#0FH ;屏蔽高四位
TIME11:
CJNE A,#01H,TIME12 ;判断显示时间是否为0。5S
JNB T05flag,TIME15 ;出口返回
CLR T05flag ;清0。5S到时间标志位
LCALL LED_DISPLAY1 ;调显示方式1
LJMP TIME15 ;出口返回
TIME12:
CJNE A,#02H,TIME13 ;判断显示时间是否为1。0S
JNB T10flag,TIME15 ;出口返回
CLR T10flag ;清1。0S到时间标志位
LCALL LED_DISPLAY1 ;调显示方式1
LJMP MT_OUT ;出口返回
TIME13:
CJNE A,#03H,TIME14 ;判断显示时间是否为1。5S
JNB T15flag,TIME15;出口返回
CLR T15flag ;清0。5S到时间标志位
LCALL LED_DISPLAY1 ;调显示方式1
LJMP TIME15 ;出口返回
TIME14:
CJNE A,#04H,TIME15 ;判断显示时间是否为2。0S
JNB T20flag,TIME15 ;出口返回
CLR T20flag ;清2。0S到时间标志位
LCALL LED_DISPLAY1 ;调显示方式1
LJMP TIME15 ;出口返回
TIME15:
LJMP MT_OUT
MODE2: ;显示方式21-24 LED_DISPLAY2: LED逐个右移点亮
CJNE A,#20H, MODE3 ;判断是否为模式2
MOV A,KEY_VALUE
ANL A,#0FH ;屏蔽高四位
TIME21:
CJNE A,#01H,TIME22 ;判断显示时间是否为0。5S
JNB T05flag,TIME25 ;出口返回
CLR T05flag ;清0。5S到时间标志位
LCALL LED_DISPLAY2 ;调显示方式2
LJMP TIME25 ;出口返回
TIME22:
CJNE A,#02H,TIME23 ;判断显示时间是否为1。0S
JNB T10flag,TIME25 ;出口返回
CLR T10flag ;清1。0S到时间标志位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -