📄 scan_key.asm
字号:
//****************************************************************************************************
// 键盘服务子程序包
// 设计者: 牟联树
// 描 述: 键盘服务
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
//.INCLUDE hardware.inc //系统头文件
.INCLUDE spce.inc
.DEFINE Key_CLK 0x8000 //键盘时钟 (IOA15)
.DEFINE Key_DAT 0x4000 //键盘数据输出 (IOA14)
.DEFINE Key_In 0x2000 //键盘中断或查询脚 (IOA13)
.DEFINE TX_CLK 0x8000 //IO接口的发送时钟
.DEFINE RX_CLK 0x2000 //IO接口的接收时钟
.DEFINE IO_DAT 0x4000 //IO接口的数据引脚
.DEFINE TX_Load 0x1000 //IO接口的输出锁存
.DEFINE RX_Load 0x0800 //IO接口的输入锁存
.DEFINE TX_DAT 0x0100
.DEFINE Key_Port P_IOA_Data
.DEFINE Key_Port_B P_IOA_Buffer
.DEFINE IO_Port P_IOB_Data
.DEFINE IO_Port_B P_IOB_Buffer
.PUBLIC _Key_Dlay
.RAM
.VAR _Key_Dlay
.TEXT
//****************************************************************************************************
// 键盘扫描 int Scan_Key()
// 设计者: 牟联树
// 描 述: 返回一键值,r1
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
.PUBLIC _Scan_Key,_Scan_Keya
_Scan_Keya:push r2,r3 to [sp]
r2 = 0
call Key_TX
r3 = [Key_Port]
r3&= Key_In
jnz Key_endx
jmp Key_ka
Key_endx:r1 = 100
pop r2,r3 from [sp]
retf
_Scan_Key:push r2,r3 to [sp]
r2 = 0
call Key_TX
Key_Sa: r3 = [Key_Port]
r3&= Key_In
jnz Key_Sa //无键则转
Key_ka: r1 = 15 //延时时间
[_Key_Dlay] = r1
call _Dlay
r3 = [Key_Port]
r3&= Key_In
jnz Key_Sa //无键则转
r2 = 0xfffe
call Key_TX
r3 = [Key_Port_B]
r3|= Key_DAT + Key_In //千万记住,在检测Key_In时Key_In对应的IO口要是上拉
[Key_Port_B] = r3
r1 = 0 //键值返回
Key_Sb: r3 = [Key_Port]
r3&= Key_In
jz Key_Sc //已查到转
r1+=1
r3 = [Key_Port_B]
r3|= Key_CLK //产生CLK脉冲
[Key_Port_B] = r3
r3&=~Key_CLK
[Key_Port_B] = r3
cmp r1,16
jbe Key_Sb
jmp Key_endx
Key_Sc: r3 = [Key_Port]
r3&= Key_In
jz Key_Sc //判断键是否放开
r3 = 15
[_Key_Dlay] = r3 //延时时间
call _Dlay
cmp r1,8
jcc Key_end1
r1-=8
jmp Key_end
Key_end1: r1+=8
Key_end: pop r2,r3 from [sp]
retf
_Dlay: r3 = [_Key_Dlay];
jnz _Dlay
retf
//用来发送16位的扫描字
Key_TX: r3 = 16
r1 = [Key_Port_B]
r1|= Key_In
Key_TXa: r2+= r2
jcc Key_TXb //判断发0还是发1
r1|= Key_DAT
jmp Key_TXc
Key_TXb: r1&=~Key_DAT
Key_TXc: [Key_Port_B] = r1
r1|= Key_CLK //产生CLK脉冲
[Key_Port_B] = r1
r1&=~Key_CLK
[Key_Port_B] = r1
r3-=1
jnz Key_TXa //没发完,继续
r1|=Key_DAT
[Key_Port_B] = r1
retf
.PUBLIC _TX_Data
_TX_Data: push r1,r3 to [sp]
r3 = 16
r2 = [IO_Port_B]
r2&=~TX_CLK
[IO_Port_B] = r2
r2&=~TX_Load
[IO_Port_B] = r2
T_Dataa: r1+= r1
jcc T_Datab //判断发0还是发1
r2|= TX_DAT
jmp T_Datac
T_Datab: r2&=~TX_DAT
T_Datac: [IO_Port_B] = r2
r2|= TX_CLK //产生CLK脉冲
[IO_Port_B] = r2
r2&=~TX_CLK
[IO_Port_B] = r2
r3-=1
jnz T_Dataa //没发完,继续
r2|= TX_Load //产生装载信号
[IO_Port_B] = r2
r2&=~TX_Load
[IO_Port_B] = r2
pop r1,r3 from [sp]
retf
.PUBLIC _RX_Data
_RX_Data: push r2,r3 to [sp]
r2 = [IO_Port_B]
r2&=~RX_Load //产生装载信号
[IO_Port_B] = r2
r2|= RX_Load
[IO_Port_B] = r2
r3 = 16
R_Dataa: r1+=r1
r2 = [IO_Port]
r2&= IO_DAT
jz R_Datab
r1|=0x0001
jmp R_Datac //判收到0还是1
R_Datab: r1&=~0x0001
R_Datac: r2 = [IO_Port_B]
r2|= RX_CLK //产生CLK脉冲
[IO_Port_B] = r2
r2&=~RX_CLK
[IO_Port_B] = r2
r3-=1
jnz R_Dataa //没收完,继续
pop r2,r3 from [sp]
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -