www.pudn.com > SpeechClock11654.rar > Key.asm


//================================================================= 
//		key.asm		键盘功能 
//================================================================= 
 
.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;           //本次键值暂存单元 
.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       
         [_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 
         je L_KS_StableTwoSample 
         r1=0x0000 
         [_Key]=r1 
         r1=C_DebounceCnt    //初始化计数单元 
         [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