📄 key_led.asm
字号:
;********************** 程序说明 **************************
;按键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
;***********************************************************
S2 EQU 08H
S1 EQU 04H
;===========================================================
KEY_TIM EQU 35 ;按键次数
DISP_REG0 EQU 30H ;
DISP_REG1 EQU 31H ;
DISP_REG2 EQU 32H ;
DISP_REG3 EQU 33H ;
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_TIME_SEL=4 LED的刷新时间为2.0S
LED_MODE_SEL EQU 36H ;LED显示模式选择变量
;LED_MODE_SEL=1 LED的显示方式为拉屏显示,即LED_DISPLAY1
;LED_MODE_SEL=2 LED的显示方式为正向流水灯,即LED_DISPLAY2
;LED_MODE_SEL=3 LED的显示方式为反向流水灯,即LED_DISPLAY3
;LED_MODE_SEL=4 LED的显示方式为反向流水灯,即LED_DISPLAY4
KEY_VALUE EQU 37H ;键盘键值寄存器
KEY_PUSH_COU EQU 38H ;键盘被按下的次数,即按键码时间=10ms*次数
KEY_STATE EQU 39H ;键盘状态寄存器
DISP_REG EQU 42H ;LED显示寄存器
KEY_GET_REG EQU 44H ;取键值状态寄存器
TIME_COU EQU 45H ;时间初值寄存器
TIME_CHUZHI EQU 46H
TIME_FLAG BIT 00H ;定时时标位,设定时间到置1
T10MSFLAG BIT 04H ;10mS的定时时标位
KEY_LED_flag BIT 07h ;按键与显示状态标志位 KEY为0,LED为1
KEYSUCCFLAG BIT 08H ;按键成功标志位
P0_0 BIT 80H ;
;***************************************************************
ORG 0000H
LJMP START
ORG 000BH
LJMP TIMER0
;
ORG 0100H
START: MOV SP,#60H
MOV TIME_CHUZHI,#50 ;初始化 10mS*50=0.5S ;MOV 30H,#10
MOV LED_STATE,#01 ;初始化 LED显示状态变量
MOV LED_TIME_SEL,#1 ;初始化 LED显示时间选择变量
MOV LED_MODE_SEL,#1 ;初始化 LED显示模式选择变量
MOV KEY_PUSH_COU,#00H ;初始化 按键次数寄存器
MOV KEY_STATE,#00H ;初始化 按键状态寄存器
MOV TIME_COU,#00H
MOV DISP_REG,#0FEH ;初始化 LED显示寄存器
MOV KEY_GET_REG,#00H ;初始化 取键值状态寄存器
CLR T10MSflag
CLR KEYSUCCflag
SETB KEY_LED_flag ;初始化,设为LED显示状态
MOV DISP_REG0,#00H ;显示方式0函数的数据指针
MOV DISP_REG1,#01H ;显示方式1函数的数据指针
MOV DISP_REG2,#02H ;显示方式2函数的数据指针
MOV DISP_REG3,#03H ;显示方式3函数的数据指针
MOV TH0,#0D8H ;设计数初值,定时时间为10mS
MOV TL0,#0F0H
MOV TMOD,#01H ;定时器0工作于方式2,为16位的定时器
SETB ET0
SETB TR0
SETB EA
;
MAIN_LOOP: ;主程序入口
JNB T10MSflag,MAIN_NEXT2 ;10MS调一下键盘扫描
CLR T10MSflag ;清10MS时标标志位
LCALL KEYSCAN
;
MAIN_NEXT2:
JNB KEYSUCCFLAG,MAIN_NEXT3
CLR KEYSUCCFLAG
LCALL KEY_CHECK
MAIN_NEXT3:
JNB TIME_FLAG,MAIN_LOOP
CLR TIME_FLAG
LCALL DISLED_MODE_SEL
LJMP MAIN_LOOP
;主程式序循环扫描
DISP_TABLE1: DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,080H,000H
DISP_TABLE2: DB 000H,080H,0C0H,0E0H,0F0H,0F8H,0FCH,0FFH
;
DISLED_MODE_SEL:
MOV A,LED_MODE_SEL
CJNE A,#00H,DIS_00
MOV A,DISP_REG0
RL A
MOV DISP_REG0,A
MOV P1,A
RET
;
DIS_00:CJNE A,#01H,DIS_01
MOV A,DISP_REG1
RR A
MOV DISP_REG1,A
MOV P1,A
RET
;
DIS_01: CJNE A,#02H,DIS_02
MOV A,DISP_REG2
MOV DPTR,#DISP_TABLE1
MOVC A,@A+DPTR
MOV P1,A
INC DISP_REG2
MOV A,DISP_REG2
CJNE A,#08H,DIS_001
MOV DISP_REG2,#00H
DIS_001:
RET
;
DIS_02: CJNE A,#03H,DIS_RR
MOV A,DISP_REG3
RRC A
MOV P1,A
DIS_RR: RET
;
TIME_TABLE:DB 50,100,150,200
KEY_CHECK:
MOV A,KEY_VALUE
CJNE A,#S2,KEY_C0
INC LED_TIME_SEL
CJNE A,#04H,KEY_C1
MOV LED_TIME_SEL,#00H
;
KEY_C1: MOV A,LED_TIME_SEL
MOV DPTR,#TIME_TABLE
MOVC A,@A+DPTR
MOV TIME_CHUZHI,A
RET
;
KEY_C0: CJNE A,#S1,KEY_C2
INC LED_MODE_SEL
MOV A,LED_MODE_SEL
CJNE A,#04H,KEY_C2
MOV LED_MODE_SEL,#00H
KEY_C2: RET
;***************************************************************
;独立键盘处理程序
;K1从P3.2输入 K2从P3.3输入
;K1为模式选择键,K2为方式选择键
;***************************************************************
KEYSCAN:
ORL P3,#0CH
MOV A,P3
ANL A,#0CH
MOV B,A
CJNE A,#0CH,KEY_00; ;没有键按下直接退出
MOV KEY_STATE,#00H
RET
;
KEY_00: MOV A,KEY_STATE
CJNE A,#00H,KEY_01
MOV A,B
MOV KEY_VALUE,A
MOV KEY_STATE,#01H
RET
;
KEY_01: CJNE A,#01H,KEY_03
MOV A,B
CJNE A,KEY_VALUE,KEY_02
MOV KEY_STATE,#02H
RET
;
KEY_02: MOV KEY_STATE,#00H
RET
KEY_03: CJNE A,#02H,KEY_05
MOV A,B
CJNE A,KEY_VALUE,KEY_05
INC KEY_PUSH_COU
MOV A,KEY_PUSH_COU
CJNE A,#KEY_TIM,KEY_04
MOV KEY_PUSH_COU,#00H
SETB KEYSUCCFLAG ;
MOV KEY_STATE,#00H
KEY_04: RET
KEY_05: MOV KEY_STATE,#00H
RET
;***************************************************************
;LED显示输出程序
;***************************************************************
;***************************************************************
;流水灯执行子程序1,2---拉屏程序
;P1.0-P1.7以一定的时间间隔TIME_LED来逐个点亮
;***************************************************************
LED_DISPLAY1: ;LED逐个左移点亮
PUSH ACC
PUSH PSW
MOV P1,DISP_REG ;送P1显示
SETB C
MOV A,DISP_REG
RLC A ;左移
ANL A,DISP_REG
MOV DISP_REG,A
JC LED_DISP1
MOV DISP_REG,#0FEH
LED_DISP1:
POP PSW
POP ACC
RET
;
LED_DISPLAY2: ;LED逐个右移点亮
PUSH ACC
PUSH PSW
MOV P1,DISP_REG ;送P1显示
SETB C
MOV A,DISP_REG
RRC A ;右移
ANL A,DISP_REG
MOV DISP_REG,A
JC LED_DISP2
MOV DISP_REG,#7FH
LED_DISP2:
POP PSW
POP ACC
RET
;***************************************************************
;***************************************************************
;流水灯执行子程序3,4
;P1.0-P1.7以一定的时间间隔TIME_LED来流水点亮
;入口参数
;流水灯正反流动显示标志位:FOLLOW_BACK
;LED状态:LED_STATE
;***************************************************************
LED_DISPLAY3: ;LED流水灯左移
PUSH ACC
PUSH PSW
MOV A,DISP_REG ;送上次显示状态
MOV P1,A ;流水灯正向显示输出
RL A
MOV DISP_REG,A ;将状态回送
POP PSW
POP ACC
RET
;
LED_DISPLAY4: ;LED流水灯右移
PUSH ACC
PUSH PSW
MOV A,DISP_REG ;送上次显示状态
MOV P1,A ;流水灯正向显示输出
RR A
MOV DISP_REG,A ;将状态回送
POP PSW
POP ACC
RET
;***************************************************************
;中断定时器0的中断子程序
;***************************************************************
TIMER0:
PUSH ACC
PUSH PSW
MOV TH0,#0D8H ;重装记数初数,定时时间为10mS
MOV TL0,#0F0H
SETB T10MSflag ;置位10MS的定时时标位
INC TIME_COU
MOV A,TIME_COU
CJNE A,TIME_CHUZHI,TIME01
SETB TIME_FLAG
MOV TIME_COU,#00H
TIME01: POP PSW
POP ACC
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -