📄 key.asm
字号:
//========================================================
// 文件名称: key.asm
// 功能描述: 获得1*8键盘值
// 维护记录: 2005-09-12 v1.0
//========================================================
//.include hardware.inc
.include SPCE061A.inc
.define Key_Debounce 4 //(4/128)秒=31ms;按键去抖动时间设定,单位为1/128秒
.define Key_TimeOut 64 //(64/128)秒=0.5s;持续按键时间间隔设定,单位1/128秒
//.define C_TMB2_128Hz 0x0000
.ram
.var KeyCode
.var ScanCnt
.var KeyUp
.code
//========================================================
// 汇编格式: F_Key_Init
// C格式: void Key_Init(void);
// 实现功能: 初始化按键扫描程序,该函数将开启IRQ6_TMB2中断
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器:无
//========================================================
.public F_Key_Init
.public _Key_Init
F_Key_Init:
_Key_Init:
push r1 to [sp]
int off
r1 = 0
[ScanCnt] = r1
[KeyCode] = r1
[KeyUp] = r1
r1 = [P_IOA_Dir]
r1 &= 0xff00
[P_IOA_Dir] = r1
r1 = [P_IOA_Attrib]
r1 &= 0xff00
[P_IOA_Attrib] = r1
r1 = [P_IOA_Buffer]
r1 &= 0xff00
r1 |= 0x00ff //设置为上拉的输入口
[P_IOA_Data] = r1
r1 = C_TMB2_128Hz
[P_TimeBase_Setup] = r1
r1 = [P_INT_Ctrl_New]
r1 |= C_IRQ6_TMB2
[P_INT_Ctrl_New] = r1
int fiq,irq
pop r1 from [sp]
retf
//========================================================
// 汇编格式: F_Key_Scan
// C格式: void Key_Scan(void);
// 实现功能: 按键扫描,该函数被IRQ6_TMB2中断服务程序调用
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器:无
//========================================================
.public F_Key_Scan
.public _Key_Scan
F_Key_Scan:
_Key_Scan:
push r1,r5 to [sp]
r2 = [P_IOA_Data]
r2 = r2^0xffff //键盘公共端为低电平,输入口为上拉输入口,则需要对数据取反
r2 = r2&0x00ff //仅取低八位
jnz ?L_ScanKey_Down
?L_ScanKey_Up:
r1 = 1
[KeyUp] = r1
jmp ?L_ScanKey_Exit
?L_ScanKey_Down:
r1 = 0
[KeyUp] = r1
cmp r2,[KeyCode]
je ?L_ScanKey_Cont
?L_ScanKey_New:
[KeyCode] = r2
r1 = 1
[ScanCnt] = r1
jmp ?L_ScanKey_Exit
?L_ScanKey_Cont:
r1 = [ScanCnt]
r1 += 1
[ScanCnt] = r1
?L_ScanKey_Exit:
pop r1,r5 from [sp]
retf
//========================================================
// 汇编格式: F_Key_Get
// C格式: void Key_Get(void);
// 实现功能: 获取键值
// 入口参数: 无
// 出口参数: r1 - 获得的键值
// 破坏寄存器:r1
//========================================================
.public F_Key_Get
.public _Key_Get
F_Key_Get:
_Key_Get:
int off
push r2 to [sp]
r2 = 0x01
[P_Watchdog_Clear] = r2
r2 = [ScanCnt]
cmp r2,Key_Debounce
jb ?L_GetKey_NoKey
cmp r2,Key_TimeOut
jnb ?L_GetKey
r2 = [KeyUp]
jnz ?L_GetKey
?L_GetKey_NoKey:
r1 = 0
jmp ?L_GetKey_Exit
?L_GetKey:
r1 = [KeyCode]
r2 = 0
[KeyCode] = r2
[ScanCnt] = r2
[KeyUp] = r2
?L_GetKey_Exit:
int fiq,irq
pop r2 from [sp]
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -