📄 key.asm
字号:
//========================================================================================
// Progarm: The head file for key.asm in assembly view
// Arranged by: Andy Hsu
// Last modified date:
// 2000/06/23: first version
// 2000/07/20: modified
//
// Functions:
// F_Key_Scan_Initial;
// F_Key_Scan_ServiceLoop;
// F_Key_DebounceCnt_Down;
//
// call F_SP_GetCh;
//========================================================================================
.INCLUDE hardware.inc;
.RAM
.PUBLIC KeyBuf //保存键值
.VAR KeyBuf
.VAR KeyValue
.PUBLIC keysum //扫描有键按下的次数
.VAR keysum
.DATA
KeyTbl: //键盘编码表
.DW 0x007F,0x00BF,0x00DF,0x00EF //K1,K2,K3,K4
.DW 0x00F7,0x00FB,0x00FD,0x00FE //K5,K6,K7,K8
.CODE
//*****************************************//
//键盘扫描函数
//函数名称:unsigned F_Key_Scan()
//出口参数:按键值
//*******************************************//
.PUBLIC _SP_GetCh
_SP_GetCh: .proc
PUSH BP TO [SP]
R1=0x0000 //屏蔽数码管显示
[P_IOB_Data]=R1
R1=0x0100 //A0-A7为下拉输入口,A8输出低电平
[P_IOA_Dir]=R1
[P_IOA_Attrib]=R1
R1=0xfeff
[P_IOA_Data]=R1
NOP
NOP
NOP
R1=[P_IOA_Data] //读入键码
R1&=0x00ff //屏蔽高8位
CMP R1,0x00ff
JE NoKey //无键处理
[KeyBuf]=r1 //是否连续两次按键扫描值相同
call Delay10ms
R1=0x00ff
R1&=[P_IOA_Data]
CMP R1,[KeyBuf]
JNE NoKey
R1=[KeyBuf] //取回键码
BP=KeyTbl //对键码进行8-3编码,使K1-K7对应1-8键值
R1=0x0001
Check:
R3=[BP++]
CMP R3,[KeyBuf]
JE Key
R1+=0x0001
CMP R1,0x0009
JE NoKey
JMP Check
Key:
[KeyValue]=R1
WaitDebon:
R1=0x00ff //等待按键抬起
R1&=[P_IOA_Data]
CMP R1,0x00ff
JNE WaitDebon
R1=[KeyValue]
POP BP FROM [SP]
RETF
NoKey:
R1=0
[KeyBuf]=R1 //清键盘缓冲区
POP BP FROM [SP]
RETF
.endp
//****************************************//
//延时函数
//函数名称:Delay10ms()
//****************************************//
Delay10ms:
R4=0x2FFF
Delay10LOOP:
R4-=1
JNZ Delay10LOOP
RETF
//========================================================================================
// End of key.asm
//========================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -