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

📄 中断初始化键扫描.asm

📁 该程序是用C编写的
💻 ASM
字号:
.include hardware.inc
.EXTERNAL _Hour;
.EXTERNAL _Min;
.EXTERNAL _Sec;
.EXTERNAL _Day;
.EXTERNAL _Mon;
.EXTERNAL _Year;
.EXTERNAL _Funcflag;
.EXTERNAL _Worked;           //键值处理标志
.EXTERNAL _Keydown;            //按键标志
.EXTERNAL _Funcflag;         //进位判断标志
.EXTERNAL _Keycode;         //键值保存标量
.EXTERNAL _stopflag;          //半秒标志位,1表示已经有一次半秒响应
.EXTERNAL _Flag;
.EXTERNAL _Function;

.PUBLIC _SystemInit
.code
_SystemInit:
     r1=0x07ff;           //IOB初始化
     [P_IOB_Dir]=r1;
     [P_IOB_Attrib]=r1;
     [P_IOB_Data]=r1;
     
     R1 = 0x000f;         //IOA初始化
     [P_IOA_Attrib] = R1;    
     [P_IOA_Dir] = R1;
     r1=0x00f0;
     [P_IOA_Data] = R1;
     
     int off 
     r1=0x0088;          //开IRQ5的2HZ.IRQ3的中断
     [P_INT_Ctrl]=r1;
     IRQ ON;
     RETI;
.text     
.public _IRQ3

_IRQ3:
      push r1,r4 to [sp]
      
      r1 = 0x0100
      TEST r1,[P_INT_Ctrl];
      jnz _IRQ3_EXT1
      
      r2 = 0x0200
      TEST r1,[P_INT_Ctrl];
      jnz _IRQ3_EXT2

      r1=0x0080;     
      [P_INT_Clear]=r1;
      r1=1
      [_Keydown]=r1;
      POP R1,R4 FROM [SP];
      RETI;

_IRQ3_EXT1: 
 	  [P_INT_Clear]=r1;
     POP R1,R5 FROM [SP];
     reti;

_IRQ3_EXT2:
	[P_INT_Clear]=r1;
     POP R1,R5 FROM [SP];
     reti;

.PUBLIC _IRQ5
_IRQ5:
     PUSH R1,R5 TO [SP]     //现场保护
     
     R1=0x0001;              //清看门狗
     [P_Watchdog_Clear]=R1;
     
     R1=0x0004;              //屏蔽4HZ中断
     TEST r1,[P_INT_Ctrl];
     JNZ L_IRQ5_2HZ;
     
L_IRQ5_4HZ:    
     R1=0x0008;               //清中断
     [P_INT_Clear]=R1;
     R1=[_Flag];
     CMP R1,3
     JNE Half_Sec;
     R2=0;
     
     [_Flag]=R2;
     R1=[_Sec];
     R1+=1; 
     [_Sec]=r1
     call _Function
     POP R1,R5 FROM [SP];
     RETI; 
     
L_IRQ5_2HZ:
     [P_INT_Clear]=r1;
     POP R1,R5 FROM [SP];
     RETI;
       
Half_Sec:              //不满1秒
     r1+=1; 
     [_Flag]=R1;
     r2=0
     [_Funcflag]=r2
     POP R1,R5 FROM [SP];
     RETI; 

.PUBLIC _Key_scan
.code
_Key_scan:
  
F_Key_Scan_A4: 
    r4=0x0000;  	    
    R2=0x000e;                        //扫描第一行
	[P_IOA_Data] = R2 ; 
	R1 = 0x00f0;    	   
    R1& =[P_IOA_Data];
	CMP R1,0x00f0;                    //是否该行有键按下
    JNZ   L_make_sure;  	        
F_Key_Scan_A5:
    R2=0x000d;                        //扫描第二行
	[P_IOA_Data] = R2;
	R1 = 0x00f0;	    	   
    R1& =[P_IOA_Data];
	CMP R1,0x00f0;                   //是否该行有键按下
    JNZ   L_make_sure;   
F_Key_Scan_A6:           
    R2=0x000b;                       //扫描第三行
	[P_IOA_Data] = R2;
	R1 = 0x00f0;	    	   
    R1& =[P_IOA_Data]; 
	CMP R1,0x00f0;                   //是否该行有键按下
    JNZ   L_make_sure;   
F_Key_Scan_A7:
	R2=0x0007;                       //扫描第四行
	[P_IOA_Data] = R2;
	R1 = 0x00f0;	    	   
    R1& =[P_IOA_Data];
	CMP R1,0x00f0;                  //是否该行有键按下
    JnZ  L_make_sure;
    RETF
    
L_make_sure:                          // 去抖
     r3=r1;
     [P_IOA_Data] = R2;
     R1 = 0x00f0;	    	   
     R1& =[P_IOA_Data];
     cmp r1,r3;
     jne F_Key_Scan_A4
    r4+=1;
     cmp r4,250;
    jne  L_make_sure;
     r4=0x0000; 
     r1=r1|r2 ;
     [_Keycode]=r1
     r1=0x00f0
     [P_IOA_Data]=r1
     r1=0
     [_Keydown]=r1
     RETF

⌨️ 快捷键说明

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