📄 key.asm
字号:
.INCLUDE SPCE061.INC
.RAM
.PUBLIC KeyBuf //保存键值
.VAR KeyBuf
.VAR KeyValue
.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 _F_Key_Scan;
_F_Key_Scan: .PROC
PUSH BP TO [SP]
R1=0x0100 //A0-A7为上拉输入口,A8输出低电平
[P_IOA_Dir]=R1
[P_IOA_Attrib]=R1
R1=0xfeff
[P_IOA_Data]=R1
NOP
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-K8对应0-7键值
R1=0x0000
Check:
R3=[BP++]
CMP R3,[KeyBuf]
JE Key
R1+=0x0001
CMP R1,0x0008
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=0x0000
[KeyBuf]=R1 //清键盘缓冲区
R1=0xff
POP BP FROM [SP]
RETF
.endp
//****************************************//
//延时函数
//函数名称:Delay10ms()
//****************************************//
Delay10ms:
r4=0x2FFF
Delay10LOOP:
R4-=1
JNZ Delay10LOOP
RETF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -