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

📄 key.asm

📁 这是“凌阳”单片机的一个c工程
💻 ASM
字号:
.INCLUDE spce.inc
.DEFINE C_DebounceCnt			0x0008;		

.RAM
.PUBLIC KeyBuf      //保存键值
.PUBLIC keysum      //扫描有键按下的次数
.VAR    KeyBuf
.VAR    keysum
.VAR	R_DebounceReg;						//for keyboard scan
.VAR	R_DebounceCnt;						//for keyboard scan
.VAR	R_KeyBuf;							//for keyboard scan
.VAR	R_KeyStrobe;						//for keyboard scan
.VAR 	KeyValue

.PUBLIC F_Key_Scan_ServiceLoop;
.PUBLIC F_Key_DebounceCnt_Down;

.CODE
//*******************************************//
//键盘扫描函数
//函数名称:unsigned F_Key_Scan()
//出口参数:按键值
//*******************************************//
.PUBLIC _F_Key_Scan;
_F_Key_Scan: .proc       
        r1 = 0x00F0		     //扫描键盘
		[P_IOA_Data] = r1
        r1 = 0x000f           
        r1 &= [P_IOA_Data]
        jnz Have_Key_Pressed

NoKey_Press:                //无键按下
        r1 = 0 
        [KeyBuf] = r1        //清键盘缓冲区
		r1=0xff;			//if no key ,KeyCode=0xff
         retf

Have_Key_Pressed:            //有键按下处理
        [KeyBuf]=r1       	//是否连续两次按键扫描值相同
        
        call Delay10ms
        
        r1 = 0x000f           
        r1 &= [P_IOA_Data]
        
        cmp r1,[KeyBuf]
        jne   NoKey_Press
        call   F_Key_Scaning  //行扫描确定键
        call   Key_Order      //确定键码
        [KeyValue]=r2
        
   WaitDebon:    
        r1 = 0x000f           
        r1 &= [P_IOA_Data]
        jnz    WaitDebon
        
        r1=[KeyValue]
        retf                 //清键盘缓冲区
 .endp
//////////////////////////////////////////
//行扫描函数
//函数名称:unsigned F_Key_Scaning()
//出口参数:扫描键值
//**************************************//
      
F_Key_Scaning:
F_Key_Scan_B7:   	    
	    r2=0x0080          //扫描第一行
	    [P_IOA_Data] = r2  
	    r1 = 0x000f	    	   
    	r1& =[P_IOA_Data]
	    cmp r1,0x0000      //是否该行有键按下
    	jnz  F_Key_Pressed   	        
F_Key_Scan_B6:
	    r2=0x0040          //扫描第二行
	    [P_IOA_Data] = r2
	    r1 = 0x000f	    	   
    	r1& =[P_IOA_Data]
	    cmp r1,0x0000      //是否该行有键按下
    	jnz  F_Key_Pressed   
F_Key_Scan_B5:           
    	r2=0x0020           //扫描第三行
	    [P_IOA_Data] = r2
	    r1 = 0x000f	    	   
    	r1& =[P_IOA_Data] 
	    cmp r1,0x0000       //是否该行有键按下
    	jnz  F_Key_Pressed   
F_Key_Scan_B4:
	    r2=0x0010          //扫描第四行
	    [P_IOA_Data] = r2
	    r1 = 0x000f	    	   
    	r1& =[P_IOA_Data]
	    cmp r1,0x0000      //是否该行有键按下
    	jnz  F_Key_Pressed   
        r1=0
        r2=0         
        [KeyBuf] = r1  
F_Key_Pressed:	
		r2|=r1      //r2--B11~B8:output    r1--B0~B7,input
        retf
 //***********************************//
 //确定键值函数
 //函数名称:Key_Order()
 //***********************************//
Key_Order: 
      r3=1
Key_value_Loop:
      bp = r3 + Key_Table
      r1 = [bp]
      cmp r1,r2
      je KeyOrder_Ret
      r3 += 1
      cmp r3,15  //modified by gywei ( cmp r3,11 )
      jbe Key_value_Loop
      r3=0
 KeyOrder_Ret: 
       r2=r3     
        retf
 
 //****************************************//
 //延时函数
 //函数名称:Delay10ms()
 //****************************************//
 Delay10ms:
      r4=0x2FFF
    Delay10LOOP:
       R4-=1
       JNZ     Delay10LOOP
       RETF  
  
  .data             
 Key_Table:
//    .dw  0x0000
    .dw 0x0011,0x0012,0x0014,0x0018
    .dw 0x0021,0x0022,0x0024,0x0028
    .dw 0x0041,0x0042,0x0044,0x0048
    .dw 0x0081,0x0082,0x0084,0x0088      
//////////////////////////////////////////////////////////////////
// Function: Get Key code from key pad(8 x 1 key pad)
// Input: Port IOA b7-b0
// Output: R_KeyStrobe b7-b0
//          | 	  |     |     | 
// +Vcc --- x --- x ... x --- x ---   
//          |     |     |     |
//          IOA.7             IOA.0
// Note: 1)link F_DebounceCntDown is necessary 
// Destory register: r1, r2                                            
////////////////////////////////////////////////////////////////// 
F_Key_Scan_ServiceLoop:
		
     	r1 = [P_IOA_Data];			// get key data from IOA   
	    	
        r1 = r1 and 0xff;				//
        r2 = [R_DebounceReg];			//
        [R_DebounceReg] = r1;			//
        cmp r2,[R_DebounceReg];			//
        je	L_KS_StableTwoSample;		//
        
        r1 = C_DebounceCnt;				//debounce time setting
        [R_DebounceCnt] = r1;			//
        retf;							//
        
L_KS_StableTwoSample:
		r1 = [R_DebounceCnt];			//
		jz	L_KS_StableOverDebounce;	//
		retf;
	
L_KS_StableOverDebounce:        
		[R_DebounceCnt] = r1;			//
		r2 = [R_DebounceReg];			//
		r1 = [R_KeyBuf];				//
		[R_KeyBuf] = r2;				//
		r1 = r1 xor 0x00ff;				//
		r1 = r1 and [R_KeyBuf];			//
		r1 = r1 and 0x00ff;				//
		r1 = r1 or [R_KeyStrobe];		//
		[R_KeyStrobe] = r1;				//save stable key code to R_KeyStrobe
		retf;		
	

//////////////////////////////////////////////////////////////////
// Function: debounce counter down count
//////////////////////////////////////////////////////////////////
F_Key_DebounceCnt_Down:
		r1 = [R_DebounceCnt];			// Debounce subroutine for F_IO_Key_Scan:
		jz	L_DebounceCntZero;			// stop count if zero
		r1 -= 0x0001;					//
		[R_DebounceCnt] = r1;			//
L_DebounceCntZero:						//
		retf;  							//	

⌨️ 快捷键说明

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