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

📄 key.asm

📁 暑假做的直流电源的程序,能实现分级调控输出,并在数码管显示
💻 ASM
字号:
//=========================================================================================================
//名称:标准4*4键盘程序(接高八位)
//用法:函数F_Key_Scan()为键盘扫描函数,可以放在中断里面,通过KeyFlag为1判断有键按下,再调用        
//       unsigned F_Get_Key()返回:键值
//适用:凌阳61板
//=========================================================================================================
.INCLUDE hardware.inc
.IRAM
.PUBLIC  C_KeyBuf                     //保存键值
.VAR     C_KeyBuf = 0
.PUBLIC C_Key_Delay;                  //扫描有键按下的次数
.VAR	C_Key_Delay = 0  
.EXTERNAL _KeyFlag                    //有键按下标识符
.CODE

//============================================================================================
//函数: F_Key_Scan()
//语法:void F_Key_Scan()
//描述:键盘扫描函数
//参数:无
//返回:无
//=============================================================================================
.PUBLIC _F_Key_Scan;
_F_Key_Scan: .PROC      
    r1 = 0xF000		                  //扫描键盘
	[P_IOA_Data] = r1
    r1 = 0x0f00           
    r1 &= [P_IOA_Data]
    JNZ L_Have_Key_Pressed
L_NoKey_Press:                        //无键按下
    r1 = 0 
    [C_KeyBuf] = r1                   //清键盘缓冲区
    [_KeyFlag] = r1
    [C_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=0x8000                        //扫描第一行//changed by abin 扫描第四列
	[P_IOA_Data] = r2  
	r1 = 0x0f00	    	   
    r1& =[P_IOA_Data]
	CMP r1,0x0000                    //是否该行有键按下
    JNZ  F_Key_Pressed   	        
F_Key_Scan_B6:
    r2=0x4000                        //扫描第二行
	[P_IOA_Data] = r2
	r1 = 0x0f00	    	   
    r1& =[P_IOA_Data]
	CMP r1,0x0000                   //是否该行有键按下
    JNZ  F_Key_Pressed   
F_Key_Scan_B5:           
    r2=0x2000                       //扫描第三行
	[P_IOA_Data] = r2
	r1 = 0x0f00	    	   
    r1& =[P_IOA_Data] 
	CMP r1,0x0000                   //是否该行有键按下
    JNZ  F_Key_Pressed   
F_Key_Scan_B4:
	r2=0x1000                       //扫描第四行
	[P_IOA_Data] = r2
	r1 = 0x0f00	    	   
    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 = [C_Key_Delay]
    CMP r3,0x0000
    JNZ L_Scan_many;
    [C_KeyBuf] = r2;
    r3 += 1;
    [C_Key_Delay] = r3;
    RETF;
L_Scan_many:                         //去抖
    r1 = [C_KeyBuf]        
    CMP r1,r2
    JNE L_Error_Key_pro;
    r3 = [C_Key_Delay]
    r3 += 1;
    [C_Key_Delay] = r3;		
	CMP		r3, 0x0010;          //扫描去抖时间
	JE		L_Enter_Have_KeyDown;
	RETF;
L_Enter_Have_KeyDown:
	r1 = 1;
    [_KeyFlag] = r1	
    r3 = 0;
    [C_Key_Delay]=r3	
    RETF
L_Error_Key_pro:
    r3 = 0;
    [C_Key_Delay]=r3
	[C_KeyBuf] = r3
	RETF;
	    
//============================================================================================
//函数: unsigned F_Get_Key()
//语法:unsigned F_Get_Key()
//描述:取键值函数
//参数:无
//返回:键值
//============================================================================================
.PUBLIC		_F_Get_Key;       
_F_Get_Key:    .PROC
    r3 = 1
    r2 = [C_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;
    [C_KeyBuf] = r1; 
    r1=r3     
    RETF                             //清键盘缓冲区
    .endp    
 
            
 Key_Table:
    //========================================================================================
    //低8位的代码  
    //.DW 0x0000    
    //.DW 0x0011,0x0021,0x0041,0x0081
    //.DW 0x0012,0x0022,0x0042,0x0082
    //.DW 0x0014,0x0024,0x0044,0x0084
    //.DW 0x0018,0x0028,0x0048,0x0088      
    //========================================================================================
    //高8位的代码
    .DW 0x0000
    .DW 0x1100,0x2100,0x4100,0x8100
    .DW 0x1200,0x2200,0x4200,0x8200
    .DW 0x1400,0x2400,0x4400,0x8400
    .DW 0x1800,0x2800,0x4800,0x8800  
    //========================================================================================    

    

⌨️ 快捷键说明

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