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

📄 key.asm

📁 凌阳单片机流水灯程序
💻 ASM
字号:
//========================================================
//	文件名称:	key.asm
//	功能描述:	获得1*8键盘值
//	维护记录:	2005-09-12	v1.0
//========================================================

//.include hardware.inc
.include SPCE061A.inc
.define Key_Debounce	4			//(4/128)秒=31ms;按键去抖动时间设定,单位为1/128秒
.define Key_TimeOut		64			//(64/128)秒=0.5s;持续按键时间间隔设定,单位1/128秒
//.define C_TMB2_128Hz	0x0000

.ram
.var KeyCode
.var ScanCnt
.var KeyUp

.code

//========================================================
//	汇编格式:	F_Key_Init
//	C格式:		void Key_Init(void);
//	实现功能:	初始化按键扫描程序,该函数将开启IRQ6_TMB2中断
//	入口参数:	无
//	出口参数:	无
//	破坏寄存器:无
//========================================================

.public F_Key_Init
.public _Key_Init
F_Key_Init:
_Key_Init:
	push r1 to [sp]
	int off
	
	r1 = 0
	[ScanCnt] = r1
	[KeyCode] = r1
	[KeyUp] = r1
	
	r1 = [P_IOA_Dir]
	r1 &= 0xff00
	[P_IOA_Dir] = r1
	
	r1 = [P_IOA_Attrib]
	r1 &= 0xff00
	[P_IOA_Attrib] = r1
	
	r1 = [P_IOA_Buffer]
	r1 &= 0xff00
	r1 |= 0x00ff							//设置为上拉的输入口
	[P_IOA_Data] = r1
	
	r1 = C_TMB2_128Hz
	[P_TimeBase_Setup] = r1
	r1 = [P_INT_Ctrl_New]
	r1 |= C_IRQ6_TMB2
	[P_INT_Ctrl_New] = r1
	int fiq,irq
	pop r1 from [sp]
	retf
	
//========================================================
//	汇编格式:	F_Key_Scan
//	C格式:		void Key_Scan(void);
//	实现功能:	按键扫描,该函数被IRQ6_TMB2中断服务程序调用
//	入口参数:	无
//	出口参数:	无
//	破坏寄存器:无
//========================================================

.public F_Key_Scan
.public _Key_Scan
F_Key_Scan:
_Key_Scan:
	push r1,r5 to [sp]

	r2 = [P_IOA_Data]
	r2 = r2^0xffff						//键盘公共端为低电平,输入口为上拉输入口,则需要对数据取反
	r2 = r2&0x00ff						//仅取低八位
	
	jnz ?L_ScanKey_Down
?L_ScanKey_Up:
	r1 = 1
	[KeyUp] = r1
	jmp ?L_ScanKey_Exit
?L_ScanKey_Down:
	r1 = 0
	[KeyUp] = r1
	cmp r2,[KeyCode]
	je	?L_ScanKey_Cont
?L_ScanKey_New:
	[KeyCode] = r2
	r1 = 1
	[ScanCnt] = r1
	jmp ?L_ScanKey_Exit
?L_ScanKey_Cont:
	r1 = [ScanCnt]
	r1 += 1
	[ScanCnt] = r1
?L_ScanKey_Exit:
	pop r1,r5 from [sp]
	retf

//========================================================
//	汇编格式:	F_Key_Get
//	C格式:		void Key_Get(void);
//	实现功能:	获取键值
//	入口参数:	无
//	出口参数:	r1 - 获得的键值
//	破坏寄存器:r1
//========================================================

.public F_Key_Get
.public _Key_Get
F_Key_Get:
_Key_Get:
	int off
	push r2 to [sp]

	r2 = 0x01
	[P_Watchdog_Clear] = r2
	r2 = [ScanCnt]
	cmp r2,Key_Debounce
	jb	?L_GetKey_NoKey
	cmp r2,Key_TimeOut
	jnb ?L_GetKey
	r2 = [KeyUp]
	jnz ?L_GetKey
?L_GetKey_NoKey:
	r1 = 0
	jmp ?L_GetKey_Exit
?L_GetKey:
	r1 = [KeyCode]
	r2 = 0
	[KeyCode] = r2
	[ScanCnt] = r2
	[KeyUp] = r2
?L_GetKey_Exit:
	int fiq,irq
	pop r2 from [sp]
	retf

⌨️ 快捷键说明

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