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

📄 system.asm

📁 16键盘程序
💻 ASM
字号:
//========================================================================================================
// 文件名称:system.asm
// 实现功能:实现与硬件相关的底层操作
// 日    期:2003/7/7
//========================================================================================================
.INCLUDE   hardware.inc
.DEFINE   P_IOA_RL 0x7004;
.RAM
.VAR KeyCode
.DATA
DispTable:.DW 0x0040,0x00F9,0x0024,0x0030            //'0'-'F'的代码值
          .DW 0x0019,0x0012,0x0002,0x0078
          .DW 0x0000,0x0010,0x0008,0x0003
          .DW 0x0046,0x0021,0x0006,0x000E
KeyTable: .DW 0x0011,0x0021,0x0041,0x0081            //键盘表
          .DW 0x0012,0x0022,0x0042,0x0082
          .DW 0x0014,0x0024,0x0044,0x0084
          .DW 0x0018,0x0028,0x0048,0x0088
.CODE
//========================================================================================================
//函数: F_System_Initial
//语法:void F_System_Initial()
//描述:初始化
//参数:无
//返回:无
//========================================================================================================
.PUBLIC _F_System_Initial;
_F_System_Initial: .PROC
	PUSH r1,r1 TO [sp];	
	r1=0xFFF0;				//IOA0-IOA3设置为下拉输入,IOA4-IOB7设置为同相高电平输出。
	[P_IOA_Dir]=r1;         //IOA8-IOA15为低电平输出;
	[P_IOA_Attrib]=r1;
	r1=0x00F0;
	[P_IOA_Data]=r1;
	r1=0xffff;
	[P_IOA_Data]=r1;
	POP r1,r1 FROM [sp];
	RETF;
	.ENDP;
    
//========================================================================================================
//函数: F_LED_On
//语法:void F_LED_On(unsigned int uiLedStateValue)
//描述:点亮与IOA8-IOA15相连的LED灯
//参数:uiLedStateValue:低8位为LED灯状态值,低电平点亮LED,高电平熄灭LED.
//返回:无
//========================================================================================================
.PUBLIC _F_LED_On;
_F_LED_On: .PROC       
    r1=[P_IOA_Data];                //确定按键值;
    r1&=0x00FF;
    r2=0;
    BP=KeyTable;                    //查表换算成顺序值;
Loop:
    r3=[BP++];
    CMP r1,r3;
    JE KeyValid;
    r2+=1;
    CMP r2,16;
    JBE Loop;
    r2=0;
KeyValid:
    [KeyCode]=r2;                   //存有效键码;
    
push r1,r1 to [sp];          
    bp=sp+1;
    r1=[bp+3];    
    bp=DispTable;                   //查表
    bp+=[KeyCode];
    r1=[bp];
    r1=r1 rol 4;
    r1=r1 rol 4;
Loop1:
	[P_IOA_Data]=r1;                //送IOA口显示;
	r3=0x0001;
	[P_Watchdog_Clear]=r3;
	CALL F_Key_Scaning;
	JZ Loop1;    
    
  pop r1,r1 from [sp];	
	RETF;
	.ENDP
	
//============================================================================================
//函数: SP_INT_128Hz()
//语法:void SP_INT_128Hz()
//描述:TMB2选择128Hz
//参数:无
//返回:无
//=============================================================================================
.public _SP_INT_128Hz;
 _SP_INT_128Hz:
     r1 = 0x0000;
     [P_TimeBase_Setup]=r1        // TMB2选择128Hz //TMB1选择8Hz,但不起作用 
     r1 = 0x0001 				  //开中断IRQ6_TMB2
   	 [P_INT_Ctrl]= r1 
	 INT IRQ
     RETF;
//========================================================================================================
//函数: F_GetKeyValue
//语法:unsigned int F_GetKeyValue(void)
//描述:获取与IOA0-IOA7相连接的16个按键的键值
//参数:无
//返回:键值
//========================================================================================================
.PUBLIC _F_GetKeyValue;
_F_GetKeyValue: .PROC
    push r2,r3 to [sp];
   
	CALL F_Key_Scaning;
    
	r1=[P_IOA_Data];
	r1&=0x00FF;

	r3=0x0001;
	[P_Watchdog_Clear]=r3;
	pop r2,r3 from [sp];
	RETF;
	.ENDP
	
F_Key_Scaning:    
Scan_A0:
    r2=0xff10;
    [P_IOA_Data]=r2;
   
    r1=0x000f;
    r1&=[P_IOA_Data];
    CMP r1,0x0000;
    JNZ F_Key_Pressed;
Scan_A1:
    r2=0xff20;

    [P_IOA_Data]=r2;
  
    r1=0x000f;
    r1&=[P_IOA_Data];
    CMP r1,0x0000;
    JNZ F_Key_Pressed;
Scan_A2:
    r2=0xff40;
    [P_IOA_Data]=r2;
   
    r1=0x000f;
    r1&=[P_IOA_Data];
    CMP r1,0x0000;
    JNZ F_Key_Pressed;
Scan_A3:
    r2=0xff80;
    [P_IOA_Data]=r2;
   
    r1=0x000f;
    r1&=[P_IOA_Data];
    CMP r1,0x0000;
    JNZ F_Key_Pressed;
    retf;
F_Key_Pressed:
    r1+=r2;
     retf;
   
//========================================================================================================
//函数: F_Delay
//语法:call F_Delay  (for Assembly language)
//描述:用于键扫描延时去抖
//参数:无
//返回:无
//========================================================================================================

	
	
.TEXT
.PUBLIC _IRQ6;
_IRQ6:        
   	PUSH r3,r4 to [sp];
	r3=0x0001;
	TEST r3,[P_INT_Ctrl];
	JNZ  _IRQ6_TMB2;
	r3=0x0002;
	[P_INT_Clear]=r1;
	POP r3,r4 FROM [sp];
    RETI;         
_IRQ6_TMB2:
	[P_INT_Clear]=r1;
	CALL	F_Key_Scaning;
	POP r3,r4 FROM [sp];
    RETI;  

⌨️ 快捷键说明

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