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

📄 key_led11

📁 做了个流水灯程序
💻
📖 第 1 页 / 共 2 页
字号:
;**********************  程序说明  **************************
;按键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,#44H	;初始化	键盘键值寄存器
	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
	ANL	KEY_VALUE,#77H	;将D7,D3屏蔽
	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
	CLR	KEY_LED_flag	;设KEY显示标志
	CJNE	A,#08H,KEY_DD	;判断P3。3是否按下
	SETB	K1_flag
	LJMP	KEY_EE
KEY_DD:	CJNE	A,#04H,KEY_EE	;判断P3。2是否按下
	SETB	K2_flag
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
;***************************************************************

;***************************************************************
;取键盘按键状态标志程序
;***************************************************************
KEY_VALUE_GET:
	PUSH 	ACC
	PUSH	PSW
K1G_NEXT0:
	JNB	K1_flag,K2G_NEXT0
	CLR	K1_flag		;清K1按键盘有效标志位
	MOV	A,KEY_GET_REG
K1_STA0:	;KEY进入状态
	CJNE	A,#00H,K1_STA1  ;判按键状态是否为00
	CLR	KEY_LED_flag	;清KEY/LED显示标志位,设为KEY显示状态
	MOV	KEY_GET_REG,#01H;将按键状态寄存器设为01,即模式选择状态
	ORL	KEY_VALUE,#80H	;指示模式选择
	ANL	KEY_VALUE,#0F7H
	LJMP	KEY_VALUE_OUT	;跳转返回
K1_STA1:	;KEY模式选择状态
	CJNE	A,#01H,K1_STA2	;判按键状态是否为01
	MOV	KEY_GET_REG,#02H;将按键状态寄存器设为02,即时间选择状态
	ORL	KEY_VALUE,#08H;指示时间选择
	ANL	KEY_VALUE,#7FH
	LJMP	KEY_VALUE_OUT	;跳转返回
K1_STA2:	;KEY时间选择状态
	CJNE	A,#02H,K1_STA3
	MOV	KEY_GET_REG,#03H
	LJMP	KEY_VALUE_OUT	;跳转返回
K1_STA3:
	CJNE	A,#03H,K1_STA3	;判按键状态是否为02
	SETB	KEY_LED_flag	;置KEY/LED显示标志位,设为LED显示状态
	MOV	DISP_REG,#0FEH	;重新初始化显示寄存器
	MOV	KEY_GET_REG,#00H;将按键状态寄存器设为00,即初始进入状态
	LJMP	KEY_VALUE_OUT	;跳转返回


K2G_NEXT0:
	JNB	K2_flag,KEY_VALUE_OUT
	CLR	K2_flag		;清K2按键盘有效标志位
	MOV	A,KEY_GET_REG	;读按键状态寄存器

KEY_MODE:	;模式选择
	CJNE	A,#01H,KEY_TIME	;判状态是否为模式选择方式
	MOV	A,KEY_VALUE	;将原键盘值取出
	SWAP	A
	INC	A	;将模式选择加1,即选择下一个LED显示模式
       	ANL	A,#07H	;将高四位屏蔽
	CJNE	A,#05H,KEY_MODE1	;模式选择只有1-4 四种方式
	ANL	A,#01H	;将低四位置为1
KEY_MODE1:
	SWAP	A
	ANL	KEY_VALUE,#0FH	;将高四位屏蔽
	ORL	KEY_VALUE,A
	LJMP	KEY_VALUE_OUT	;跳转返回

KEY_TIME:	;时间选择
	CJNE	A,#02H,KEY_VALUE_OUT	;判状态是否为时间选择方式
	MOV	A,KEY_VALUE	;将原键盘值取出
	INC	A	;将模式选择加1,即选择下一个LED显示模式
       	ANL	A,#07H	;将高四位屏蔽
	CJNE	A,#05H,KEY_TIME1	;时间选择只有1-4 四种方式
	ANL	A,#0F1H	;将低四位置为1
KEY_TIME1:
	ANL	KEY_VALUE,#0F0H	;将低四位屏蔽
	ORL	KEY_VALUE,A	;将KEY_VALUE返回	
	LJMP	KEY_VALUE_OUT	;跳转返回

⌨️ 快捷键说明

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