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

📄 key.asm

📁 人的进出门检测 发出语音播报 并有数码管显示商店的总来访人数及剩余人数
💻 ASM
字号:
//========================================================
//	文件名称:	key.asm
//	功能描述:	扫描键盘,获得1*8键盘值
//	维护记录:	2005-09-12	v1.0
//========================================================

.include hardware.inc
.define P_INT_Ctrl_New		0x702d

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

.ram
.var KeyCode                         //定义键码寄存器
.var ScanCnt                         //定义扫描计数器
.var KeyUp                           //定义键盘抬起确认寄存器

.code

//========================================================
//	汇编格式:	 F_Key_Init
//	C格式:		 void Key_Init(void);
//	实现功能:	 初始化按键扫描程序,该函数将开启IRQ6_TMB2中断
//	入口参数:	 无
//	出口参数:	 无
//	破坏寄存器: 无
//========================================================
//.external R_InterruptStatus
//_SystemInit: .PROC  
//     r1=0x0000                      //开2Hz中断
 //    [P_INT_Ctrl]=r1
 //    [R_InterruptStatus]=r1
  //   IRQ ON 
  //   retf;

.public F_Key_Init
.public _Key_Init
F_Key_Init:
_Key_Init:
	push r1 to [sp]
	int off
	
	r1 = 0
	[ScanCnt] = r1                        //扫描计数器清0
	[KeyCode] = r1                        //键码寄存器清0
	[KeyUp] = r1                          //键盘抬起确认寄存器清0
	
	r1 = [P_IOA_Dir]                      //初始化IOA低八位为带下拉电阻的输入口
	r1 &= 0xff00
	[P_IOA_Dir] = r1
	
	r1 = [P_IOA_Attrib]
	r1 &= 0xff00
	[P_IOA_Attrib] = r1
	
	r1 = [P_IOA_Buffer]
	r1 &= 0xff00
	[P_IOA_Data] = r1
	
	r1 = C_TMB2_128Hz           
	[P_TimeBase_Setup] = r1               //设置时基频率为128Hz
	r1 = [P_INT_Ctrl_New]               
	r1 |= C_IRQ6_TMB2
	[R_InterruptStatus] = r1			  //在此通知语音库,之前打开了的中断情况
	[P_INT_Ctrl_New] = r1                 //开128Hz中断
	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]                 //取IOA口数据
	
	jnz ?L_ScanKey_Down               //不为0时转向?L_ScanKey_Down
?L_ScanKey_Up:
	r1 = 1        
	[KeyUp] = r1                      //键盘抬起确认
	jmp ?L_ScanKey_Exit               //转向?L_ScanKey_Exit 
?L_ScanKey_Down:
	r1 = 0
	[KeyUp] = r1                      //键盘按下,但是未抬起
	cmp r2,[KeyCode]                  //是否和上次扫描键码相同
	je	?L_ScanKey_Cont               //是,转向?L_ScanKey_Cont
?L_ScanKey_New:
	[KeyCode] = r2                    //否,保存键码
	r1 = 1      
	[ScanCnt] = r1                    //扫描计数器赋1
	jmp ?L_ScanKey_Exit               //转向?L_ScanKey_Exit 
?L_ScanKey_Cont:
	r1 = [ScanCnt]             
	r1 += 1                           //扫描计数器加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                   //比较扫描计数器是否小于4(设定的扫描时间)
	jb	?L_GetKey_NoKey                   //否,转向?L_GetKey_NoKey 
	cmp r2,Key_TimeOut                    //比较扫描计数器是否不小于64
	jnb ?L_GetKey                         //大于等于时转向?L_GetKey
	r2 = [KeyUp]                          //键盘是否确认抬起
	jnz ?L_GetKey                         //是
?L_GetKey_NoKey:
	r1 = 0                                //返回0
	jmp ?L_GetKey_Exit
?L_GetKey:
	r1 = [KeyCode]                        //返回键码
	r2 = 0
	[KeyCode] = r2                        //键码寄存器清0
	[ScanCnt] = r2                        //扫描计数器清0
	[KeyUp] = r2                          //键盘抬起确认寄存器清0
?L_GetKey_Exit:
	int fiq,irq
	pop r2 from [sp]
	retf

⌨️ 快捷键说明

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