📄 key.asm
字号:
//========================================================
// 文件名称: key.asm
// 功能描述: 扫描键盘,获得1*8键盘值
// 维护记录: 2005-09-12 v1.0
//========================================================
.include hardware.inc
.define P_INT_Ctrl_New 0x702d
.define Key_Debounce 4 //(4/128)秒=31ms;按键去抖动时间设定,单位为1/128秒
.define Key_TimeOut 64 //(64/128)秒=0.5s;持续按键时间间隔设定,单位1/128秒
.define C_TMB2_128Hz 0x0000 //设置TIMERB频率为128Hz
.ram
.var KeyCode //定义键码寄存器
.var ScanCnt //定义扫描计数器
.var KeyUp //定义键盘抬起确认寄存器
.code
//========================================================
// 汇编格式: F_Key_Init
// C格式: void Key_Init(void);
// 实现功能: 初始化按键扫描程序,该函数将开启IRQ6_TMB2中断
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: 无
//========================================================
//.external R_InterruptStatus
//_SystemInit: .PROC
// r1=0x0000 //开2Hz中断
// [P_INT_Ctrl]=r1
// [R_InterruptStatus]=r1
// IRQ ON
// retf;
.public F_Key_Init
.public _Key_Init
F_Key_Init:
_Key_Init:
push r1 to [sp]
int off
r1 = 0
[ScanCnt] = r1 //扫描计数器清0
[KeyCode] = r1 //键码寄存器清0
[KeyUp] = r1 //键盘抬起确认寄存器清0
r1 = [P_IOA_Dir] //初始化IOA低八位为带下拉电阻的输入口
r1 &= 0xff00
[P_IOA_Dir] = r1
r1 = [P_IOA_Attrib]
r1 &= 0xff00
[P_IOA_Attrib] = r1
r1 = [P_IOA_Buffer]
r1 &= 0xff00
[P_IOA_Data] = r1
r1 = C_TMB2_128Hz
[P_TimeBase_Setup] = r1 //设置时基频率为128Hz
r1 = [P_INT_Ctrl_New]
r1 |= C_IRQ6_TMB2
[R_InterruptStatus] = r1 //在此通知语音库,之前打开了的中断情况
[P_INT_Ctrl_New] = r1 //开128Hz中断
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] //取IOA口数据
jnz ?L_ScanKey_Down //不为0时转向?L_ScanKey_Down
?L_ScanKey_Up:
r1 = 1
[KeyUp] = r1 //键盘抬起确认
jmp ?L_ScanKey_Exit //转向?L_ScanKey_Exit
?L_ScanKey_Down:
r1 = 0
[KeyUp] = r1 //键盘按下,但是未抬起
cmp r2,[KeyCode] //是否和上次扫描键码相同
je ?L_ScanKey_Cont //是,转向?L_ScanKey_Cont
?L_ScanKey_New:
[KeyCode] = r2 //否,保存键码
r1 = 1
[ScanCnt] = r1 //扫描计数器赋1
jmp ?L_ScanKey_Exit //转向?L_ScanKey_Exit
?L_ScanKey_Cont:
r1 = [ScanCnt]
r1 += 1 //扫描计数器加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 //比较扫描计数器是否小于4(设定的扫描时间)
jb ?L_GetKey_NoKey //否,转向?L_GetKey_NoKey
cmp r2,Key_TimeOut //比较扫描计数器是否不小于64
jnb ?L_GetKey //大于等于时转向?L_GetKey
r2 = [KeyUp] //键盘是否确认抬起
jnz ?L_GetKey //是
?L_GetKey_NoKey:
r1 = 0 //返回0
jmp ?L_GetKey_Exit
?L_GetKey:
r1 = [KeyCode] //返回键码
r2 = 0
[KeyCode] = r2 //键码寄存器清0
[ScanCnt] = r2 //扫描计数器清0
[KeyUp] = r2 //键盘抬起确认寄存器清0
?L_GetKey_Exit:
int fiq,irq
pop r2 from [sp]
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -