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

📄 key0.asm

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 ASM
字号:
.include hardware.inc

.iram
.public  KeyBuf    //保存键值
.var     KeyBuf = 0

.public key_delay; //扫描有键按下的次数
.var	key_delay = 0  

.external _KeyFlag  //有键按下标识符



.code

.public F_Key_Scan;
F_Key_Scan: .proc       
        r1 = 0x00F0		     //扫描键盘
		[P_IOB_Data] = r1
        r1 = 0x000f           
        r1 &= [P_IOB_Data]
        jnz Have_Key_Pressed

 NoKey_Press:                //无键按下
        r1 = 0 
        [KeyBuf] = r1        //清键盘缓冲区
        [_KeyFlag] = r1
        [key_delay]=r1;
        retf
        
Have_Key_Pressed:             //有键按下处理         
        call   F_Key_Scaning  //行扫描确定键
        call   Enter_Key;     //确认有键按下
        retf       
 .endp
//////////////////////////////////////////
.public		F_Key_Scaning;	   
F_Key_Scaning:
F_Key_Scan_B7:   	    
	    r2=0x0080          //扫描第一行
	    [P_IOB_Data] = r2  
	    r1 = 0x000f	    	   
    	r1& =[P_IOB_Data]
	    cmp r1,0x0000      //是否该行有键按下
    	jnz  F_Key_Pressed   	        
F_Key_Scan_B6:
	    r2=0x0040          //扫描第二行
	    [P_IOB_Data] = r2
	    r1 = 0x000f	    	   
    	r1& =[P_IOB_Data]
	    cmp r1,0x0000      //是否该行有键按下
    	jnz  F_Key_Pressed   
F_Key_Scan_B5:           
    	r2=0x0020           //扫描第三行
	    [P_IOB_Data] = r2
	    r1 = 0x000f	    	   
    	r1& =[P_IOB_Data] 
	    cmp r1,0x0000       //是否该行有键按下
    	jnz  F_Key_Pressed   
F_Key_Scan_B4:
	    r2=0x0010          //扫描第四行
	    [P_IOB_Data] = r2
	    r1 = 0x000f	    	   
    	r1& =[P_IOB_Data]
	    cmp r1,0x0000      //是否该行有键按下
    	jnz  F_Key_Pressed   
		retf		
F_Key_Pressed:	
        r2|=r1      //r2--B11~B8:output    r1--B0~B7,input
        retf



Enter_Key:

Scan_first:
        r3 = [key_delay]
        cmp r3,0x0000
        jnz Scan_many;
        [KeyBuf] = r2;
        r3 += 1;
		[key_delay] = r3;
		retf;
	
Scan_many:
        r1 = [KeyBuf]        
        cmp r1,r2
        jne Error_Key_pro;
        r3 = [key_delay]
        r3 += 1;
		[key_delay] = r3;		
		cmp		r3, 0x0010;
		je		Enter_Have_KeyDown;
	    retf;
  Enter_Have_KeyDown:
		r1 = 1;
        [_KeyFlag] = r1	
        r3 = 0;
        [key_delay]=r3	
		retf
  Error_Key_pro:
        r3 = 0;
        [key_delay]=r3
	    [KeyBuf] = r3
	    retf;

 
.PUBLIC		_F_Get_Key;       
_F_Get_Key:    .PROC
        r3 = 1
       r2 = [KeyBuf]
Key_value_Loop:
      bp = r3 + Key_Table
      r1 = [bp]
      cmp r1,r2
      je KeyCode_Return
      r3 += 1
      cmp r3,11
      jbe Key_value_Loop
      r3=0
 KeyCode_Return:
       r1 = 0;
       [KeyBuf] = r1; 
       r1=r3     
     retf                 //清键盘缓冲区
 .endp    
 
//  .data             
 Key_Table:
    .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 + -