?? key.asm
字號:
//======================================================
// The information contained herein is the exclusive property of
// Sunnnorth Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
// (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
// ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================
//============================================================
// 文件名稱:Key.asm
// 實現功能:1*3按鍵掃描程序,適用于高電平有效的按鍵電路
// 使用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
//================================================
// 按鍵使用端口設定
//================================================
.DEFINE Key_IO_Port 0 // 若按鍵使用IOA口則采用該行定義
//.DEFINE Key_IO_Port 1 // 若按鍵使用IOB口則采用該行定義
.DEFINE Key_IO_HighByte 0 // 若按鍵使用IO口低8位則采用該行定義
//.DEFINE Key_IO_HighByte 1 // 若按鍵使用IO口高8位則采用該行定義
/////----- 不必修改下面的定義 -----/////
.IF Key_IO_HighByte==0
.DEFINE Key_ALL 0x0007
.ELSE
.DEFINE Key_ALL 0x0700
.ENDIF
/////----- 不必修改下面的定義 -----/////
.IF Key_IO_Port==0
.DEFINE P_Key_Data 0x7000
.DEFINE P_Key_Buf 0x7001
.DEFINE P_Key_Dir 0x7002
.DEFINE P_Key_Attrib 0x7003
.ELSE
.DEFINE P_Key_Data 0x7005
.DEFINE P_Key_Buf 0x7006
.DEFINE P_Key_Dir 0x7007
.DEFINE P_Key_Attrib 0x7008
.ENDIF
.DEFINE P_INT_Mask 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
.external _R_InterruptStatus
.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 = [P_Key_Dir] // 初始化IO為下拉輸入
r1 &= ~Key_ALL
[P_Key_Dir] = r1
r1 = [P_Key_Attrib]
r1 &= ~Key_ALL
[P_Key_Attrib] = r1
r1 = [P_Key_Buf]
r1 &= ~Key_ALL
[P_Key_Buf] = r1
r1 = 0
[ScanCnt] = r1 // 初始化變量
[KeyCode] = r1
[KeyUp] = r1
r1 = [_R_InterruptStatus]
r1 |= C_IRQ6_TMB2 // 開啟IRQ6_TMB2(128Hz)中斷
[P_INT_Mask] = r1
[_R_InterruptStatus] = 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,r2 to [sp]
r2 = [P_Key_Data] // 獲取IO端口狀態
r2 &= Key_ALL
jnz ?L_ScanKey_Down // 判斷當前是否有鍵按下
?L_ScanKey_Up:
r1 = 1 // 如果按鍵處于抬起狀態則KeyUp置1
[KeyUp] = r1
jmp ?L_ScanKey_Exit
?L_ScanKey_Down:
r1 = 0 // KeyUp置0
[KeyUp] = r1
.if Key_IO_HighByte
r2 = r2 lsr 4
r2 = r2 lsr 4
.endif
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] // 更新按鍵持續時間(ScanCnt加1)
r1 += 1
[ScanCnt] = r1
?L_ScanKey_Exit:
pop r1,r2 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 // 如果按鍵持續時間小于Key_Debounce
jb ?L_GetKey_NoKey // 則認為當前沒有鍵按下
cmp r2,Key_TimeOut // 如果按鍵持續時間大于Key_TimeOut
jnb ?L_GetKey // 則認為發生了一次按鍵
r2 = [KeyUp] // 如果按鍵持續時間在Key_Debounce與Key_TimeOut之間
jnz ?L_GetKey // 如果按鍵處于抬起狀態則認為發生了一次按鍵
?L_GetKey_NoKey:
r1 = 0 // 沒有按鍵則返回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 + -