📄 system.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 + -