按键矩阵(多键有效)
2015-10-29 13:52
155 查看
每次对应上电某个输出口,读取输入数据。若有输入,则检测输入,跳至相关按键处理;若无,则设置下次上电的输出口。
代码:
CLRHALTFLAG:
LD A,#0
LD (HALTTIME1),A
LD (HALTTIME0),A
LD A,(HALTFLAG)
AND A,#0111B
LD (HALTFLAG),A
SET #1,(PWM_CTRL)
SET #1,(PWM_CTRL)
ldpch SERVICEIO_OK
jmp SERVICEIO_OK
; RETS
SERVICEIO:
LDMAH #0
ld a,(scankeydelay)
cmp a,#0fh
jnz EXITIO
ld a,(scankeyline)
cmp a,#0001b
ldpch scankeyportb0
jz scankeyportb0
cmp a,#0010b
ldpch scankeyportb1
jz scankeyportb1
setportb0:
set #0,(data_pb)
clr #1,(data_pb)
ld a,#0001b
ld (scankeyline),a
ld a,#0000b
ld (scankeydelay),a
EXITIO:
LD A,#0000B
LD (KEYDELAY),A
ldpch SERVICEIO_OK
jmp SERVICEIO_OK
; RETS
scankeyportb0:
set #0,(data_pb)
clr #1,(data_pb)
ld a,(data_pa)
and a,#0111b
xor a,(KEYFLAGB0)
ldpch setportb1
jz setportb1
ld a,(data_pa)
and a,#0111b
cmp a,(keybutfer)
ldpch scankeyportb00
jz scankeyportb00
ld (keybutfer),a
ldpch EXITIO
jmp EXITIO
scankeyportb00:
CLR #1,(PWM_CTRL)
CLR #1,(PWM_CTRL)
LD A,(KEYDELAY)
AND A,#0010B
;;;;;;;;2*8=16MS
JZ CLRHALTFLAG
LD A,#0000B
LD (KEYDELAY),A
LD A,(KEYBUTFER)
XOR A,(KEYFLAGB0)
AND A,(KEYBUTFER)
LD (KEYLFLAG),A
LD A,(KEYBUTFER)
LD (KEYFLAGB0),A
LD A,(KEYLFLAG)
AND A,#0001B
ldpch key01rin
JNZ key01rin
ld a,(keyflag)
and a,#0001b
jz CLRHALTFLAG
LD A,(KEYLFLAG)
AND A,#0010B
jnz key02rin
LD A,(KEYLFLAG)
AND A,#0100B
jnz key03rin
JMP CLRHALTFLAG;;;;;FALL KEY MASK
setportb1:
set #1,(data_pb)
clr #0,(data_pb)
ld a,#0010b
ld (scankeyline),a
ld a,#0000b
ld (scankeydelay),a
ldpch EXITIO
jmp EXITIO
scankeyportb1:
set #1,(data_pb)
clr #0,(data_pb)
ld a,(data_pa)
and a,#0111b
xor a,(KEYFLAGB1)
ldpch setportb0
jz setportb0
ld a,(data_pa)
and a,#0111b
cmp a,(keybutfer)
ldpch scankeyportb10
jz scankeyportb10
ld (keybutfer),a
ldpch EXITIO
jmp EXITIO
scankeyportb10:
CLR #1,(PWM_CTRL)
CLR #1,(PWM_CTRL)
LD A,(KEYDELAY)
AND A,#0010B
;;;;;;;;2*8=16MS
JZ CLRHALTFLAG
LD A,#0000B
LD (KEYDELAY),A
LD A,(KEYBUTFER)
XOR A,(KEYFLAGB1)
AND A,(KEYBUTFER)
LD (KEYLFLAG),A
LD A,(KEYBUTFER)
LD (KEYFLAGB1),A
ld a,(keyflag)
and a,#0001b
jz CLRHALTFLAG
LD A,(KEYLFLAG)
AND A,#0001B
ldpch key04rin
JNZ key04rin
LD A,(KEYLFLAG)
AND A,#0010B
jnz key05rin
LD A,(KEYLFLAG)
AND A,#0100B
jnz key06rin
JMP CLRHALTFLAG;;;;;FALL KEY MASK
;------------ 华丽的分割线 ------------
KEY01RIN:
scankeydelay 在每次中断时增加,为0fH时不再增加。
代码:
ld a,(scankeydelay)
cmp a,#0fh
jz scankeydelay_ok
inc (scankeydelay)
scankeydelay_ok:
代码:
CLRHALTFLAG:
LD A,#0
LD (HALTTIME1),A
LD (HALTTIME0),A
LD A,(HALTFLAG)
AND A,#0111B
LD (HALTFLAG),A
SET #1,(PWM_CTRL)
SET #1,(PWM_CTRL)
ldpch SERVICEIO_OK
jmp SERVICEIO_OK
; RETS
SERVICEIO:
LDMAH #0
ld a,(scankeydelay)
cmp a,#0fh
jnz EXITIO
ld a,(scankeyline)
cmp a,#0001b
ldpch scankeyportb0
jz scankeyportb0
cmp a,#0010b
ldpch scankeyportb1
jz scankeyportb1
setportb0:
set #0,(data_pb)
clr #1,(data_pb)
ld a,#0001b
ld (scankeyline),a
ld a,#0000b
ld (scankeydelay),a
EXITIO:
LD A,#0000B
LD (KEYDELAY),A
ldpch SERVICEIO_OK
jmp SERVICEIO_OK
; RETS
scankeyportb0:
set #0,(data_pb)
clr #1,(data_pb)
ld a,(data_pa)
and a,#0111b
xor a,(KEYFLAGB0)
ldpch setportb1
jz setportb1
ld a,(data_pa)
and a,#0111b
cmp a,(keybutfer)
ldpch scankeyportb00
jz scankeyportb00
ld (keybutfer),a
ldpch EXITIO
jmp EXITIO
scankeyportb00:
CLR #1,(PWM_CTRL)
CLR #1,(PWM_CTRL)
LD A,(KEYDELAY)
AND A,#0010B
;;;;;;;;2*8=16MS
JZ CLRHALTFLAG
LD A,#0000B
LD (KEYDELAY),A
LD A,(KEYBUTFER)
XOR A,(KEYFLAGB0)
AND A,(KEYBUTFER)
LD (KEYLFLAG),A
LD A,(KEYBUTFER)
LD (KEYFLAGB0),A
LD A,(KEYLFLAG)
AND A,#0001B
ldpch key01rin
JNZ key01rin
ld a,(keyflag)
and a,#0001b
jz CLRHALTFLAG
LD A,(KEYLFLAG)
AND A,#0010B
jnz key02rin
LD A,(KEYLFLAG)
AND A,#0100B
jnz key03rin
JMP CLRHALTFLAG;;;;;FALL KEY MASK
setportb1:
set #1,(data_pb)
clr #0,(data_pb)
ld a,#0010b
ld (scankeyline),a
ld a,#0000b
ld (scankeydelay),a
ldpch EXITIO
jmp EXITIO
scankeyportb1:
set #1,(data_pb)
clr #0,(data_pb)
ld a,(data_pa)
and a,#0111b
xor a,(KEYFLAGB1)
ldpch setportb0
jz setportb0
ld a,(data_pa)
and a,#0111b
cmp a,(keybutfer)
ldpch scankeyportb10
jz scankeyportb10
ld (keybutfer),a
ldpch EXITIO
jmp EXITIO
scankeyportb10:
CLR #1,(PWM_CTRL)
CLR #1,(PWM_CTRL)
LD A,(KEYDELAY)
AND A,#0010B
;;;;;;;;2*8=16MS
JZ CLRHALTFLAG
LD A,#0000B
LD (KEYDELAY),A
LD A,(KEYBUTFER)
XOR A,(KEYFLAGB1)
AND A,(KEYBUTFER)
LD (KEYLFLAG),A
LD A,(KEYBUTFER)
LD (KEYFLAGB1),A
ld a,(keyflag)
and a,#0001b
jz CLRHALTFLAG
LD A,(KEYLFLAG)
AND A,#0001B
ldpch key04rin
JNZ key04rin
LD A,(KEYLFLAG)
AND A,#0010B
jnz key05rin
LD A,(KEYLFLAG)
AND A,#0100B
jnz key06rin
JMP CLRHALTFLAG;;;;;FALL KEY MASK
;------------ 华丽的分割线 ------------
KEY01RIN:
scankeydelay 在每次中断时增加,为0fH时不再增加。
代码:
ld a,(scankeydelay)
cmp a,#0fh
jz scankeydelay_ok
inc (scankeydelay)
scankeydelay_ok:
相关文章推荐
- NSUserDefaults
- Android特效 五种Toast详解
- 关于RecyclerView的使用
- threadlocal与inheritableThreadLocal的区别
- form里两个submit按钮,在onsubmit中判断哪个被点
- 打开VB开发工具提示:Imagelist来自mscomctl.ocx控件出错,可能是mscomctl.ocx过期,解决方法
- LeetCode 236: Lowest Common Ancestor of a Binary Tree
- Visualforceで数値や日付のフォーマットを指定して表示する
- 差分约束系统
- ReactiveCocoa入门教程——第一部分
- 如何将 Oracle 11g 升级到 Orcale 12c
- jdbc&&mysql
- 超轻量级异步JS框架,别再让嵌套影响我们的优雅代码!
- 算法竞赛入门-枚举-7.2.4-下一个排列
- 错误:Uncaught TypeError: Cannot read property 'WebSocket' of undefined
- Maven实战 第16章 m2eclipse
- What do I desire
- How can i use iptables on centos 7?
- 提高php开发效率的9大代码片段
- OC进阶(五)