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

📄 key.asm

📁 凌阳单片机4*4键盘扩展源代码及原理电路(PDF格式)
💻 ASM
字号:
.INCLUDE hardware.inc
.IRAM
.VAR     I_KeyBuf = 0                 //保存键值
.VAR	I_Key_Delay = 0               //扫描有键按下的次数
.EXTERNAL _KeyFlag                    //有键按下标识符
.CODE
.PUBLIC _SP_Init_IOA;              
_SP_Init_IOA: .PROC
   	R1 = 0x00f0;      
    [P_IOA_Attrib] = R1;    
    [P_IOA_Dir] = R1;
    [P_IOA_Data] = R1;
    RETF
.ENDP;

//============================================================================================
//函数: F_Key_Scan()
//语法:void F_Key_Scan()
//描述:键盘扫描函数
//参数:无
//返回:无
//=============================================================================================
.PUBLIC _F_Key_Scan;
_F_Key_Scan: .PROC      
    R1 = 0x00F0		                  //扫描键盘
	[P_IOA_Data] = R1
    R1 = 0x000f           
    R1 &= [P_IOA_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
//============================================================================================
//函数: unsigned F_Key_Scaning()
//语法:void unsigned F_Key_Scaning()
//描述:行扫描函数
//参数:无
//返回:扫描键值
//=============================================================================================
.PUBLIC	 F_Key_Scaning;	   
F_Key_Scaning:
F_Key_Scan_B7:   	    
    R2=0x0080                        //扫描第一行//changed by abin 扫描第四列
	[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   
	RETF		
F_Key_Pressed:	
    R2|=R1                         //R2--B11~B8:输出   R1--B0~B7,输入
    RETF

//============================================================================================
//函数: Enter_Key()
//语法:Enter_Key()
//描述:确定有键按下函数
//参数:无
//返回:无
//============================================================================================
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:                         //去抖
    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;
	    
//============================================================================================
//函数: unsigned F_Get_Key()
//语法:unsigned F_Get_Key()
//描述:取键值函数
//参数:无
//返回:键值
//============================================================================================
.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,18
   // CMP R3,11
    JBE L_Key_value_Loop
    R3=0
L_KeyCode_Return:
    R1 = 0;
    [I_KeyBuf] = R1; 
    R1=R3     
    RETF                             //清键盘缓冲区
    .endp    
 
            
 Key_Table:
 .DW  0x0088,0x0084,0x0082,0x0081
 .DW  0x0048,0x0044,0x0042,0x0041
 .DW  0x0028,0x0024,0x0022,0x0021
 .DW  0x0018,0x0014,0x0012,0x0011
 
 //.DW  0x0011,0x0021,0x0041,0x0081
 //.DW  0x0012,0x0022,0x0042,0x0082
 //.DW  0x0014,0x0024,0x0044,0x0084
 //.DW  0x0018,0x0028,0x0048,0x0088
 
  //  .DW 0x0000,0x0014,0x0024,0x0044
  //  .DW 0x0012,0x0022,0x0042,0x0011
  //  .DW 0x0021,0x0041,0x0028,0x0018
  //  .DW 0x0081,0x0082,0x0084,0x0048      

  
  

⌨️ 快捷键说明

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