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

📄 key.lst

📁 凌阳61单片机实现的多功能电子琴源程序代码
💻 LST
字号:
Sunplus u'nSP Assembler - Ver. 1.14.3.1
              Listing File Has Been Relocated
                            	//======================================================
                            	//  The information contained herein is the exclusive property of
                            	//  Sunnnorth Technology Co. And shall not be distributed, reproduced,
                            	//  or disclosed in whole in part without prior written permission.
                            	//             (C) COPYRIGHT 2003  SUNNORTH TECHNOLOGY CO.
                            	//                          ALL RIGHTS RESERVED
                            	//  The entire notice above must be reproduced on all authorized copies.
                            	//========================================================
                            	
                            	//============================================================
                            	// 文件名称: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
                            	
                            	//================================================
                            	//	按键使用端口设定
                            	//================================================
                            	.DEFINE Key_IO_Port			0		// 若按键使用IOA口则采用该行定义
                            	//.DEFINE Key_IO_Port			1		// 若按键使用IOB口则采用该行定义
                            	
                            	.DEFINE Key_IO_HighByte		0		// 若按键使用IO口低8位则采用该行定义
                            	//.DEFINE Key_IO_HighByte		1		// 若按键使用IO口高8位则采用该行定义
                            	
                            	/////-----       不必修改下面的定义	    -----/////
                            	.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
                            	/////-----       不必修改下面的定义	    -----/////
                            	.IF Key_IO_Port==0
                            		.DEFINE P_Key_Data		0x7000
                            		.DEFINE P_Key_Buf		0x7001
                            		.DEFINE P_Key_Dir		0x7002
                            		.DEFINE P_Key_Attrib	0x7003
                            	.ELSE
                            		.DEFINE P_Key_Data		0x7005
                            		.DEFINE P_Key_Buf		0x7006
                            		.DEFINE P_Key_Dir		0x7007
                            		.DEFINE P_Key_Attrib	0x7008
                            	.ENDIF
                            	
                            	
                            	.DEFINE P_INT_Mask			0x702d
                            	.DEFINE P_TimeBase_Setup	0x700e
                            	.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
                            	
000001A4                    	.RAM
000001A4 00 00              	.VAR KeyCode						// 存储获得的键值
000001A5 00 00              	.VAR ScanCnt						// 该变量用来表示按键持续时间
000001A6 00 00              	.VAR KeyUp							// 按键是否处于抬起状态
                            	
000099B0                    	.CODE
                            	//======================================================
                            	// 函数名称:	Key_Init
                            	// C调用:		void Key_Init(void)
                            	// 汇编调用:	F_Key_Init
                            	// 实现功能:   初始化按键扫描程序,该函数将开启IRQ6_TMB2中断
                            	// 入口参数:	无
                            	// 出口参数:	无
                            	// 破坏寄存器:	无
                            	//======================================================
                            	F_Key_Init:
                            	_Key_Init:
000099B0 88 D2              		push r1 to [sp]
000099B1 40 F1              		INT Off
000099B2 11 93 02 70        		r1 = [P_Key_Dir]				// 初始化IO, 低4位下拉输入,高4位输出高
000099B4 09 A3 F0 00        		r1 |= Key_NibbleH
000099B6 09 B3 F0 FF        		r1 &= ~Key_NibbleL
000099B8 19 D3 02 70        		[P_Key_Dir] = r1
000099BA 11 93 03 70        		r1 = [P_Key_Attrib]
000099BC 09 A3 F0 00        		r1 |= Key_NibbleH
000099BE 09 B3 F0 FF        		r1 &= ~Key_NibbleL
000099C0 19 D3 03 70        		[P_Key_Attrib] = r1
000099C2 11 93 01 70        		r1 = [P_Key_Buf]
000099C4 09 A3 F0 00        		r1 |= Key_NibbleH
000099C6 09 B3 F0 FF        		r1 &= ~Key_NibbleL
000099C8 19 D3 00 70        		[P_Key_Data] = r1
                            		
000099CA 40 92              		r1 = 0
000099CB 19 D3 A5 01        		[ScanCnt] = r1					// 初始化变量
000099CD 19 D3 A4 01        		[KeyCode] = r1
000099CF 19 D3 A6 01        		[KeyUp] = r1
000099D1 40 92              		r1 = C_TMB2_128Hz				// 开启IRQ6_TMB2(128Hz)中断
000099D2 19 D3 0E 70        		[P_TimeBase_Setup] = r1
000099D4 11 93 2D 70        		r1 = [P_INT_Mask]
000099D6 41 A2              		r1 |= C_IRQ6_TMB2
000099D7 19 D3 2D 70        		[P_INT_Mask] = r1
000099D9 43 F1              		INT FIQ,IRQ
000099DA 88 90              		pop r1 from [sp]
000099DB 90 9A              	retf
                            	
                            	//======================================================
                            	// 函数名称:	Key_Scan
                            	// C调用:		void Key_Scan(void)
                            	// 汇编调用:	F_Key_Scan
                            	// 实现功能:   按键扫描,该函数被IRQ6_TMB2中断服务程序调用
                            	// 入口参数:	无
                            	// 出口参数:	无
                            	// 破坏寄存器:	无
                            	//======================================================
                            	F_Key_Scan:
                            	_Key_Scan:
000099DC A0 D8              		push r1,r4 to [sp]
000099DD 12 95 00 70        		r2 = [P_Key_Data]				// 获取IO端口状态
000099DF 4F B4              		r2 &= Key_NibbleL
000099E0 05 4E              		jnz ?L_ScanKey_Down				// 判断当前是否有键按下
                            	?L_ScanKey_Up:
000099E1 41 92              		r1 = 1							// 如果按键处于抬起状态则KeyUp置1
000099E2 19 D3 A6 01        		[KeyUp] = r1
000099E4 80 FE 2B 9A        		goto ?L_ScanKey_Exit
                            	?L_ScanKey_Down:
000099E6 40 92              		r1 = 0							// KeyUp置0
000099E7 19 D3 A6 01        		[KeyUp] = r1
000099E9 14 99 01 70        		r4 = [P_Key_Buf]
                            	
000099EB 50 96              		r3 = Key_NibbleH & 0x1010
000099EC 0C B3 0F FF        		r1 = r4 & ~Key_NibbleH			// 扫描第1列(将第1列IO输出置高,检测输入口状态是否变化)
000099EE 03 A3              		r1 |= r3
000099EF 19 D3 00 70        		[P_Key_Data] = r1
000099F1 11 93 00 70        		r1 = [P_Key_Data]
000099F3 4F B2              		r1 &= Key_NibbleL
000099F4 21 4E              		jnz ?L_GetCode
                            		
000099F5 60 96              		r3 = Key_NibbleH & 0x2020		// 扫描第2列
000099F6 0C B3 0F FF        		r1 = r4 & ~Key_NibbleH
000099F8 03 A3              		r1 |= r3
000099F9 19 D3 00 70        		[P_Key_Data] = r1
000099FB 11 93 00 70        		r1 = [P_Key_Data]
000099FD 4F B2              		r1 &= Key_NibbleL
000099FE 17 4E              		jnz ?L_GetCode
                            	
000099FF 0B 97 40 00        		r3 = Key_NibbleH & 0x4040		// 扫描第3列
00009A01 0C B3 0F FF        		r1 = r4 & ~Key_NibbleH
00009A03 03 A3              		r1 |= r3
00009A04 19 D3 00 70        		[P_Key_Data] = r1
00009A06 11 93 00 70        		r1 = [P_Key_Data]
00009A08 4F B2              		r1 &= Key_NibbleL
00009A09 0C 4E              		jnz ?L_GetCode
                            	
00009A0A 0B 97 80 00        		r3 = Key_NibbleH & 0x8080		// 扫描第4列
00009A0C 0C B3 0F FF        		r1 = r4 & ~Key_NibbleH
00009A0E 03 A3              		r1 |= r3
00009A0F 19 D3 00 70        		[P_Key_Data] = r1
00009A11 11 93 00 70        		r1 = [P_Key_Data]
00009A13 4F B2              		r1 &= Key_NibbleL
00009A14 01 4E              		jnz ?L_GetCode
00009A15 75 EE              		jmp ?L_ScanKey_Up				// 如果未扫描到按键
                            	?L_GetCode:
00009A16 11 93 01 70        		r1 = [P_Key_Buf]				// 重新初始化IO
00009A18 09 A3 F0 00        		r1 |= Key_NibbleH
00009A1A 19 D3 00 70        		[P_Key_Data] = r1
                            		
00009A1C 03 A5              		r2 |= r3
                            	.if Key_IO_HighByte
                            		r2 = r2 lsr 4
                            		r2 = r2 lsr 4
                            	.endif
00009A1D 12 45 A4 01        		cmp r2,[KeyCode]				// 本次得到的键值与上次得到的键值比较
00009A1F 06 5E              		je	?L_ScanKey_Cont
                            	?L_ScanKey_New:						// 如果与上次键值不同则重置键值
00009A20 1A D5 A4 01        		[KeyCode] = r2
00009A22 41 92              		r1 = 1							// 重新记录键持续按下的时间
00009A23 19 D3 A5 01        		[ScanCnt] = r1
00009A25 05 EE              		jmp ?L_ScanKey_Exit
                            	?L_ScanKey_Cont:					// 如果此次键值与上次键值相同
00009A26 11 93 A5 01        		r1 = [ScanCnt]					// 更新按键持续时间(ScanCnt加1)
00009A28 41 02              		r1 += 1
00009A29 19 D3 A5 01        		[ScanCnt] = r1
                            	?L_ScanKey_Exit:
00009A2B A0 90              		pop r1,r4 from [sp]
00009A2C 90 9A              	retf
                            	
                            	//======================================================
                            	// 函数名称:	Key_Get
                            	// C调用:		unsigned Key_Get(void)
                            	// 汇编调用:	F_Key_Get
                            	// 实现功能:   获取键值
                            	// 入口参数:	无
                            	// 出口参数:	r1 - 获得的键值
                            	// 破坏寄存器:	r1
                            	//======================================================
                            	F_Key_Get:
                            	_Key_Get:
00009A2D 40 F1              		INT OFF
00009A2E 88 D4              		push r2 to [sp]
                            	
00009A2F 12 95 A5 01        		r2 = [ScanCnt]
00009A31 44 44              		cmp r2,Key_Debounce				// 如果按键持续时间小于Key_Debounce
00009A32 06 0E              		jb	?L_GetKey_NoKey				// 则认为当前没有键按下
00009A33 0A 45 40 00        		cmp r2,Key_TimeOut				// 如果按键持续时间大于Key_TimeOut
00009A35 05 1E              		jnb ?L_GetKey					// 则认为发生了一次按键
00009A36 12 95 A6 01        		r2 = [KeyUp]					// 如果按键持续时间在Key_Debounce与Key_TimeOut之间
00009A38 02 4E              		jnz ?L_GetKey					// 如果按键处于抬起状态则认为发生了一次按键
                            	?L_GetKey_NoKey:
00009A39 40 92              		r1 = 0							// 没有按键则返回0
00009A3A 09 EE              		jmp ?L_GetKey_Exit
                            	?L_GetKey:
00009A3B 11 93 A4 01        		r1 = [KeyCode]					// 有按键则返回键值
00009A3D 40 94              		r2 = 0
00009A3E 1A D5 A4 01        		[KeyCode] = r2					// 重新初始化变量
00009A40 1A D5 A5 01        		[ScanCnt] = r2
00009A42 1A D5 A6 01        		[KeyUp] = r2
                            	?L_GetKey_Exit:
00009A44 43 F1              		INT FIQ,IRQ
00009A45 88 92              		pop r2 from [sp]
00009A46 90 9A              	retf
0 error(s), 0 warning(s).





































⌨️ 快捷键说明

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