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

📄 key_led.asm

📁 做了个流水灯程序
💻 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 + -