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

📄 key.asm

📁 凌阳单片机控制的DDS芯片AD9851(串行和并行控制方式)
💻 ASM
字号:
.INCLUDE 	hardware.inc
.IRAM
.VAR     	I_KeyBuf = 0                 //保存键值
.VAR		I_Key_Delay = 0               //扫描有键按下的次数
.EXTERNAL 	_KeyFlag                    //有键按下标识符
.CODE	

//=============================================================================================
.PUBLIC F_Key_Scan;
F_Key_Scan: .PROC      
  
    r2=[P_IOB_Buffer]	//扫描键盘
     r2&=0x00ff 
     r2|=0xf000             
	[P_IOB_Data] = r2
    r1 = 0x0f00         
    r1 &= [P_IOB_Data]
    JNZ L_Have_Key_Pressed
L_NoKey_Press:                        //无键按下
    r1 = 0 
    [I_KeyBuf] = r1                   //清键盘缓冲区
    [_KeyFlag] = r1
    [I_Key_Delay]=r1;
    RETF
L_Have_Key_Pressed:                  //有键按下处理         
    CALL   F_Key_Scaning             //行扫描确定键
    CALL   Enter_Key;                //确认有键按下
    RETF       
    .ENDP

//=============================================================================================
.PUBLIC	 F_Key_Scaning;	   
F_Key_Scaning:
F_Key_Scan_B7:   	     
    r2=[P_IOB_Data] 
    r2&=0x00ff
    r2|=0x8000                    //扫描第一行//changed by abin 扫描第四列
	[P_IOB_Data] = r2  
	r2&=0xff00
	r1 = 0x0f00	    	   
    r1& =[P_IOB_Data]
	CMP r1,0x0000                    //是否该行有键按下
    JNZ  F_Key_Pressed   	        
F_Key_Scan_B6:
    r2=[P_IOB_Data] 
    r2&=0x00ff
    r2|=0x4000                              //扫描第二行
	[P_IOB_Data] = r2
	r2&=0xff00
	r1 = 0x0f00    	   
    r1& =[P_IOB_Data]
	CMP r1,0x0000                   //是否该行有键按下
    JNZ  F_Key_Pressed   
F_Key_Scan_B5:           
     r2=[P_IOB_Data] 
    r2&=0x00ff
    r2|=0x2000                                     //扫描第三行
	[P_IOB_Data] = r2
	r2&=0xff00
	r1 = 0x0f00    	   
    r1& =[P_IOB_Data] 
	CMP r1,0x0000                   //是否该行有键按下
    JNZ  F_Key_Pressed   
F_Key_Scan_B4:
 r2=[P_IOB_Data] 
    r2&=0x00ff
    r2|=0x1000                                      //扫描第四行
	[P_IOB_Data] = r2
	r2&=0xff00
	r1 = 0x0f00    	   
    r1& =[P_IOB_Data]
	CMP r1,0x0000                  //是否该行有键按下
    JNZ  F_Key_Pressed   
	RETF		
F_Key_Pressed:	
    r2|=r1                         //r2--B11~B8:输出   r1--B0~B7,输入
    RETF


//============================================================================================
Enter_Key:
Scan_first:
    r3 = [I_Key_Delay]
    CMP r3,0x0000
    JNZ L_Scan_many;
    [I_KeyBuf] = r2;
    r3 += 1;
    [I_Key_Delay] = r3;
    RETF;
L_Scan_many:  
      CALL   F_Key_Scaning ;                        //去抖;
    r1 = [I_KeyBuf]        
    CMP r1,r2
    JNE L_Error_Key_pro;
    r3 = [I_Key_Delay]
    r3 += 1;
    [I_Key_Delay] = r3;		
	CMP		r3, 0x0010;         
	JE		L_Enter_Have_KeyDown;
	RETF;
L_Enter_Have_KeyDown:
	r1 = 1;
    [_KeyFlag] = r1	
    r3 = 0;
    [I_Key_Delay]=r3	
    RETF
L_Error_Key_pro:
    r3 = 0;
    [I_Key_Delay]=r3
	[I_KeyBuf] = r3
	RETF;
	    

//============================================================================================
.PUBLIC		_F_Get_Key;       
_F_Get_Key:    .PROC
    r3 = 1
    r2 = [I_KeyBuf]
L_Key_value_Loop:
    bp = r3 + Key_Table
    r1 = [bp]
    CMP r1,r2
    JE L_KeyCode_Return
    r3 += 1
    CMP r3,16
    JBE L_Key_value_Loop
    r3=0
L_KeyCode_Return:
    r1 = 0;
    [I_KeyBuf] = r1; 
    r1=r3     
    RETF                             //清键盘缓冲区
    .ENDP    
 
            
 Key_Table:
    
    
   .dw 0x8800,0x8400,0x8200,0x8100
   .dw 0x4800,0x4400,0x4200,0x4100
   .dw 0x2800,0x2400,0x2200,0x2100
   .dw 0x1800,0x1400,0x1200,0x1100
         

 
///=================================================================================
 
 
 
  .public _SP_INT_128Hz;
    _SP_INT_128Hz:
     r1 = 0x0040;
     [P_TimeBase_Setup]=r1        // TMB2选择128Hz //TMB1选择8Hz,但不起作用 
     r1 = 0x0001 				  //开中断IRQ6_TMB2
   	 [P_INT_Ctrl]= r1
	 INT IRQ
     RETF; 

⌨️ 快捷键说明

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