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

📄 key.asm

📁 SpeechClock是在凌阳提供的电子钟的范例的基础之上实现的电子时钟的源程序 调试环境:unSPIDE184 运行设备:SPCE061A+LED&KEY模板 功能:时钟显示(日期与时间) L
💻 ASM
字号:
//=================================================================
//		key.asm		键盘功能
//_Key_Scan_ServiceLoop
//	在main()中不断被调用,以下为其中所涉及的变量
//		_KeyPressFlag	表示当前按键状态,无键按下时清0;有键按下时B0=1;第二次以后(按住某键不动)B15=1
//		_Key			去抖动之后存有效键值,B15=1,表示该键为被按下后两次以上被去抖动后判断出有键值
//		Key_Buff		本次扫描的键值暂存单元,用于去抖动
//		Key_Debounce	计数单元,去抖动计数
//=================================================================

.INCLUDE   hardware.inc

.PUBLIC    _Key_Scan_ServiceLoop;

.DEFINE C_DebounceCnt	0x0050; //13ms 去抖
.DEFINE C_CONTINUE   	0xB00;  //第二次以后有效


.EXTERNAL  _Key
.EXTERNAL  _KeyPressFlag;  //无键按下时清0;有键按下时B0=1;
                             //第二次以后有效B15=1
.EXTERNAL _SleepFlag

.RAM
.VAR    Key_Buff=0;           //本次键值暂存单元
.VAR    Key_Debounce;       //计数单元
.VAR    KeyScanLineBuff;


.CODE   
.PUBLIC Key_Scan_Init
Key_Scan_Init: .PROC
       r1=0x0000
       [_Key]=r1
       [Key_Buff]=r1
       [_KeyPressFlag]=r1
       retf
      .ENDP
 
_Key_Scan_ServiceLoop: .PROC
         r1=0x0001;                      // Clear watch dog
		 [P_Watchdog_Clear]=r1;
         r2=[P_IOA_Data]
         r2&=0x00ff
         jnz F_SomeKeyIsPressed
         r1=0x0000
         [Key_Buff]=r1  	   //无键按下,当前键值为0    
         [_KeyPressFlag]=r1    //清0
         r1=1 
         [_SleepFlag] = r1   //置睡眠标志
         retf
//-----------------------------//
 F_SomeKeyIsPressed:    
         r3=[_KeyPressFlag]    //有键按下  B0=1
         r3|=0x0001
         [_KeyPressFlag]=r3   //置按键标志
             
         r3=0 
         [_SleepFlag] = r3      //清睡眠标志
         
         r1=[Key_Buff]    //读上次键值
         [Key_Buff]=r2    //暂存本次键值
         cmp r1,r2		  //r1,r2只有两种情况:r1==r2 OR r1==0 即继续按某键 或 开始按某键
         je L_KS_StableTwoSample
         r1=0x0000
         [_Key]=r1
         r1=C_DebounceCnt    //初始化计数单元 C_DebounceCnt = 0x0050
         [Key_Debounce]=r1  
         retf
        
   
   L_KS_StableTwoSample:     //两次稳定采样  
	     r1=[Key_Debounce]
         jz L_KS_StableOverDebounce
         r1-=1              //计数减 1
         [Key_Debounce]=r1    
         retf   
         

L_KS_StableOverDebounce:   //形成键码
		r1=[Key_Buff]       //暂存值

        r3=0x8000    //是第一次有效吗?
        test r3,[_KeyPressFlag]   
        jz Key_First_Avail

        r1|=0x8000       //连续按键有效         ///////////////////////
        jmp  Key_Get_Value
        
Key_First_Avail:    //第一次有效        
       r3=[_KeyPressFlag]    //有键按下  B15=1
       r3|=0x8000
       [_KeyPressFlag]=r3   
       
 Key_Get_Value:      
        [_Key]=r1   //存有效键值  
        r1=C_CONTINUE
        [Key_Debounce]=r1
        retf
      .ENDP
        
 

⌨️ 快捷键说明

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