📄 key.asm
字号:
//============================================================
// 文件名称:Key.asm
// 实现功能:4*4按键扫描程序,使用IRQ6_TMB2中断(128Hz)
// 日期: 2005/6/18
//============================================================
//================================================
// 按键去抖动时间设定,单位为1/128秒
//================================================
.define Key_Debounce 4 //(4/128)秒=31ms
//================================================
// 持续按键时间间隔设定,单位1/128秒
//================================================
.define Key_TimeOut 64 //(64/128)秒=0.5s
//================================================
// 按键使用端口设定
//================================================
/////----- 若按键使用IOA的低8位则使用下面的定义 -----/////
//.define P_Key_Data 0x7000
//.define P_Key_Buf 0x7001
//.define P_Key_Dir 0x7002
//.define P_Key_Attrib 0x7003
//.define Key_IO_HighByte 0
//========================================================
/////----- 若按键使用IOA的高8位则使用下面的定义 -----/////
//.define P_Key_Data 0x7000
//.define P_Key_Buf 0x7001
//.define P_Key_Dir 0x7002
//.define P_Key_Attrib 0x7003
//.define Key_IO_HighByte 1
//========================================================
/////----- 若按键使用IOB的低8位则使用下面的定义 -----/////
.define P_Key_Data 0x7005
.define P_Key_Buf 0x7006
.define P_Key_Dir 0x7007
.define P_Key_Attrib 0x7008
.define Key_IO_HighByte 0
//========================================================
/////----- 若按键使用IOB的高8位则使用下面的定义 -----/////
//.define P_Key_Data 0x7005
//.define P_Key_Buf 0x7006
//.define P_Key_Dir 0x7007
//.define P_Key_Attrib 0x7008
//.define Key_IO_HighByte 1
//========================================================
.if Key_IO_HighByte==0
.define Key_ALL 0x00ff
.define Key_NibbleL 0x000f
.define Key_NibbleH 0x00f0
.else
.define Key_ALL 0xff00
.define Key_NibbleL 0x0f00
.define Key_NibbleH 0xf000
.endif
.define P_INT_Ctrl_New 0x702d
.define P_TimeBase_Setup 0x700e
.define P_Watchdog_Clear 0x7012
.define C_IRQ6_TMB2 0x0001
.define C_TMB2_128Hz 0x0000
.public F_Key_Init
.public _Key_Init
.public F_Key_Scan
.public _Key_Scan
.public F_Key_Get
.public _Key_Get
.ram
.var KeyCode
.var ScanCnt
.var KeyUp
.code
//======================================================
// 函数名称: Key_Init
// C调用: void Key_Init(void)
// 汇编调用: F_Key_Init
// 实现功能: 初始化按键扫描程序,该函数将开启IRQ6_TMB2中断
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
F_Key_Init:
_Key_Init:
push r1 to [sp]
INT Off
r1 = 0
[ScanCnt] = r1
[KeyCode] = r1
[KeyUp] = 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
//======================================================
// 函数名称: Key_Scan
// C调用: void Key_Scan(void)
// 汇编调用: F_Key_Scan
// 实现功能: 按键扫描,该函数被IRQ6_TMB2中断服务程序调用
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
F_Key_Scan:
_Key_Scan:
push r1,r5 to [sp]
r1 = [P_Key_Dir]
r1 |= Key_ALL
[P_Key_Dir] = r1
r1 = [P_Key_Attrib]
r1 |= Key_ALL
[P_Key_Attrib] = r1
r1 = [P_Key_Buf]
r1 &= ~Key_NibbleH
r1 |= Key_NibbleL
[P_Key_Buf] = r1
r1 = [P_Key_Dir]
r1 &= ~Key_NibbleH
[P_Key_Dir] = r1
r1 = [P_Key_Attrib]
r1 &= ~Key_NibbleH
[P_Key_Attrib] = r1
r2 = [P_Key_Data]
.if Key_IO_HighByte
r2 = r2 lsr 4
r2 = r2 lsr 4
.endif
r2 &= 0x00f0
jz ?L_ScanKey_Up
r1 = [P_Key_Dir]
r1 |= Key_ALL
[P_Key_Dir] = r1
r1 = [P_Key_Attrib]
r1 |= Key_ALL
[P_Key_Attrib] = r1
r1 = [P_Key_Buf]
r1 &= ~Key_NibbleL
r1 |= Key_NibbleH
[P_Key_Data] = r1
r1 = [P_Key_Dir]
r1 &= ~Key_NibbleL
[P_Key_Dir] = r1
r1 = [P_Key_Attrib]
r1 &= ~Key_NibbleL
[P_Key_Attrib] = r1
r3 = [P_Key_Data]
r3 = [P_Key_Data]
r3 = [P_Key_Data]
r3 = [P_Key_Data]
.if Key_IO_HighByte
r3 = r3 lsr 4
r3 = r3 lsr 4
.endif
r3 &= 0x000f
r2 |= r3
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
//======================================================
// 函数名称: Key_Get
// C调用: unsigned Key_Get(void)
// 汇编调用: F_Key_Get
// 实现功能: 获取键值
// 入口参数: 无
// 出口参数: r1 - 获得的键值
// 破坏寄存器: r1
//======================================================
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 + -