📄 key.asm
字号:
//============================================================
// 文件名称:key.asm
// 实现功能:按键扫描获取键值程序
// 日期: 2006/9/20 V1.0
//============================================================
.INCLUDE SPCE061A.inc
.PUBLIC F_Key_Scan_Initial
.PUBLIC _Key_Scan_Initial
.PUBLIC F_Key_Scan_ServiceLoop
.PUBLIC _Key_Scan_ServiceLoop
.PUBLIC F_Key_DebounceCnt_Down
.PUBLIC _Key_DebounceCnt_Down
.PUBLIC _SP_GetCh
.PUBLIC F_SP_GetCh
.PUBLIC R_KeyStrobe
.RAM
.VAR R_DebounceReg //临时键值寄存
.DEFINE C_DebounceCnt 0x0015 //消抖时间控制
.VAR R_DebounceCnt //消抖
.VAR R_KeyBuf
.VAR R_KeyStrobe //最终键值寄存
.CODE
//======================================================
// 函数名称: Key_Scan_Initial()
// 汇编调用: F_Key_Scan_Initial
// 实现功能: 按键初始化函数.
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: r1
//======================================================
F_Key_Scan_Initial:
_Key_Scan_Initial:
r1 = 0x0000
[R_DebounceReg] = r1
[R_KeyBuf] = r1
[R_KeyStrobe] = r1
r1 = C_DebounceCnt
[R_DebounceCnt] = r1 // 释放按键计数器
retf
//======================================================
// 函数名称: Key_Scan_ServiceLoop()
// 汇编调用: F_Key_Scan_ServiceLoop
// 实现功能: 按键服务函数.
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: r1~r2
//======================================================
F_Key_Scan_ServiceLoop:
_Key_Scan_ServiceLoop:
r1 = [P_IOA_Data] //获取IOA口状态
r1 = r1 and 0x7 //屏蔽高13位
r2 = [R_DebounceReg]
[R_DebounceReg] = r1
cmp r2,[R_DebounceReg] //状态转变?
je L_KS_StableTwoSample //是
r1 = C_DebounceCnt //设置按键释放时间
[R_DebounceCnt] = r1
retf
L_KS_StableTwoSample:
r1 = [R_DebounceCnt]
jz L_KS_StableOverDebounce
retf
L_KS_StableOverDebounce:
[R_DebounceCnt] = r1
r2 = [R_DebounceReg]
r1 = [R_KeyBuf]
[R_KeyBuf] = r2
r1 = r1 xor 0x00ff
r1 = r1 and [R_KeyBuf]
r1 = r1 and 0x00ff
r1 = r1 or [R_KeyStrobe]
[R_KeyStrobe] = r1 //存取键值到 R_KeyStrobe
retf
//======================================================
// 函数名称: Key_DebounceCnt_Down()
// 汇编调用: F_Key_DebounceCnt_Down
// 实现功能: 循环扫描,确认按键时间.
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: r1
//======================================================
F_Key_DebounceCnt_Down:
_Key_DebounceCnt_Down:
r1 = [R_DebounceCnt] // 键释放时间确认:
jz L_DebounceCntZero // 时间到?
r1 -= 0x0001 // 否,计数器减一
[R_DebounceCnt] = r1
L_DebounceCntZero: // 是,返回
retf
//======================================================
// 函数名称: SP_GetCh()
// 汇编调用: F_SP_GetCh
// C 调用: SP_GetCh()
// 实现功能: 获取最终键值.
// 入口参数: 无
// 出口参数: r1(键值)
// 破坏寄存器: r1~r2
//======================================================
_SP_GetCh:
F_SP_GetCh:
r1 = [R_KeyStrobe] // 获取键值
r2 = 0x0000
[R_KeyStrobe] = r2
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -