义隆没弄过,大约是这样的
按键扫描
;==========================================
KEY_SCAN:
JBS B_TCCINT1 //位变量B_TCCINT1等于1吗?
RET //不是,则返回
BC B_TCCINT1 //是的,则清零
;
JBC P_KEY //P_KEY按键按下吗?
JMP KEY_RELEASE //没有,则调到KEY_RELEASE判断按键是否真正弹起
;
INC KEY_COUNT1 //是的,则按键按下的次数变量加一
MOV A,@15
SUB A,KEY_COUNT1
JBS C //够15次(即30ms=15*2ms)吗?
RET //不到,则返回
CLR KEY_COUNT1 //够了,则清按键按下的次数变量
CLR KEY_COUNT2
;
JBC B_ENKEY //B_ENKEY按键按下吗?
RET //没有,则返回
BS B_ENKEY //是的
;
INC KEY_MODE
MOV A,@3
SUB A,KEY_MODE
JBC C //按下次数够3次吗?
CLR KEY_MODE //是的,则清KEY_MODE变量
SCAN_MODE1:
MOV A,KEY_MODE
JBS Z //B_ENKEY是第3次按下吗?
JMP SCAN_MODE2 //不是,则调到SCAN_MODE2
BC 0X06.0 //是的,则清0X06的位0
BS 0X06.1
RET
SCAN_MODE2:
MOV A,@1
XOR A,KEY_MODE
JBS Z //B_ENKEY是第1次按下吗?
JMP SCAN_MODE3 //不是,则调到SCAN_MODE3
BC 0X06.1 //是的,则清0X06的位0
;BC 0X06.0
BS 0X06.0 //0X06的位1置1
;BS 0X06.1
RET //返回
SCAN_MODE3:
BS 0X06.0 //0X06的位0置1
BS 0X06.1 //0X06的位1置1
RET //返回
;
KEY_RELEASE: //按键弹起判断
INC KEY_COUNT2
MOV A,@15
SUB A,KEY_COUNT2
JBS C //按键弹起时间够30ms吗?
RET //没到,则返回
CLR KEY_COUNT1 //清KEY_COUNT1变量
CLR KEY_COUNT2
BC B_ENKEY //置B_ENKEY引脚为0
RET //返回
|