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

📄 key.asm

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 ASM
字号:
//============================================================
// 文件名称:Key.asm
// 实现功能:4*4按键扫描程序,使用IRQ6_TMB2中断(128Hz)
// 日期:    2005/6/18
//============================================================

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

//================================================
//	按键使用端口设定
//================================================

/////-----       若按键使用IOA的低8位则使用下面的定义	    -----/////
//.define P_Key_Data		0x7000
//.define P_Key_Buf		0x7001
//.define P_Key_Dir		0x7002
//.define P_Key_Attrib	0x7003
//.define Key_IO_HighByte	0
//========================================================

/////-----       若按键使用IOA的高8位则使用下面的定义	    -----/////
//.define P_Key_Data		0x7000
//.define P_Key_Buf		0x7001
//.define P_Key_Dir		0x7002
//.define P_Key_Attrib	0x7003
//.define Key_IO_HighByte	1
//========================================================

/////-----       若按键使用IOB的低8位则使用下面的定义	    -----/////
.define P_Key_Data		0x7005
.define P_Key_Buf		0x7006
.define P_Key_Dir		0x7007
.define P_Key_Attrib	0x7008
.define Key_IO_HighByte	0
//========================================================

/////-----       若按键使用IOB的高8位则使用下面的定义	    -----/////
//.define P_Key_Data		0x7005
//.define P_Key_Buf		0x7006
//.define P_Key_Dir		0x7007
//.define P_Key_Attrib	0x7008
//.define Key_IO_HighByte	1
//========================================================

.if Key_IO_HighByte==0
	.define Key_ALL			0x00ff
	.define Key_NibbleL		0x000f
	.define Key_NibbleH		0x00f0
.else
	.define Key_ALL			0xff00
	.define Key_NibbleL		0x0f00
	.define Key_NibbleH		0xf000
.endif

.define P_INT_Ctrl_New		0x702d
.define P_TimeBase_Setup	0x700e
.define P_Watchdog_Clear	0x7012
.define C_IRQ6_TMB2			0x0001
.define C_TMB2_128Hz		0x0000


.public F_Key_Init
.public _Key_Init
.public F_Key_Scan
.public _Key_Scan
.public F_Key_Get
.public _Key_Get

.ram
.var KeyCode
.var ScanCnt
.var KeyUp

.code
//======================================================
// 函数名称:	Key_Init
// C调用:		void Key_Init(void)
// 汇编调用:	F_Key_Init
// 实现功能:   初始化按键扫描程序,该函数将开启IRQ6_TMB2中断
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	无
//======================================================
F_Key_Init:
_Key_Init:
	push r1 to [sp]
	INT Off
	
	r1 = 0
	[ScanCnt] = r1
	[KeyCode] = r1
	[KeyUp] = 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

//======================================================
// 函数名称:	Key_Scan
// C调用:		void Key_Scan(void)
// 汇编调用:	F_Key_Scan
// 实现功能:   按键扫描,该函数被IRQ6_TMB2中断服务程序调用
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	无
//======================================================
F_Key_Scan:
_Key_Scan:
	push r1,r5 to [sp]

	r1 = [P_Key_Dir]
	r1 |= Key_ALL
	[P_Key_Dir] = r1

	r1 = [P_Key_Attrib]
	r1 |= Key_ALL
	[P_Key_Attrib] = r1

	r1 = [P_Key_Buf]
	r1 &= ~Key_NibbleH
	r1 |= Key_NibbleL
	[P_Key_Buf] = r1

	r1 = [P_Key_Dir]
	r1 &= ~Key_NibbleH
	[P_Key_Dir] = r1

	r1 = [P_Key_Attrib]
	r1 &= ~Key_NibbleH
	[P_Key_Attrib] = r1

	r2 = [P_Key_Data]
	
.if Key_IO_HighByte
	r2 = r2 lsr 4
	r2 = r2 lsr 4
.endif
	r2 &= 0x00f0
	jz ?L_ScanKey_Up
	r1 = [P_Key_Dir]
	r1 |= Key_ALL
	[P_Key_Dir] = r1
	r1 = [P_Key_Attrib]
	r1 |= Key_ALL
	[P_Key_Attrib] = r1
	r1 = [P_Key_Buf]
	r1 &= ~Key_NibbleL
	r1 |= Key_NibbleH
	[P_Key_Data] = r1
	r1 = [P_Key_Dir]
	r1 &= ~Key_NibbleL
	[P_Key_Dir] = r1
	r1 = [P_Key_Attrib]
	r1 &= ~Key_NibbleL
	[P_Key_Attrib] = r1

	r3 = [P_Key_Data]
	r3 = [P_Key_Data]
	r3 = [P_Key_Data]
	r3 = [P_Key_Data]
.if Key_IO_HighByte
	r3 = r3 lsr 4
	r3 = r3 lsr 4
.endif
	r3 &= 0x000f
	r2 |= r3
	
	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

//======================================================
// 函数名称:	Key_Get
// C调用:		unsigned Key_Get(void)
// 汇编调用:	F_Key_Get
// 实现功能:   获取键值
// 入口参数:	无
// 出口参数:	r1 - 获得的键值
// 破坏寄存器:	r1
//======================================================
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 + -