本人之前用1个BS804B和1个BS808B(都是单线串口输出,共用到12个keys),分别用计数器模式(下降沿触发)和外中断(下降沿触发)来检测有没有按键按下,有的话,则分别置位BSINT1和BSINT2.
我的主程序周期是固定不变的,如4ms就能执行完所有程序,如果按键扫描子程序发现位变量BSINT1或BSINT2为1,则进入按键扫描。之前做的几个触摸产品都没问题.
近来搞一个锄摸产品,要用到14个keys,故要用2个BS808B,其它的都与之前的相同,除了这2个BS808B的读表略有不同外.
发现采用外中断的8个keys中只有1个key能正常工作(这个key接到BS808B的key0脚),其它7个keys几乎没反应.而采用计数器模式的第2个BS808B的所有6个keys都正常.后来对调一下这2个BS808B的单线串口输出----即第1个BS808B改用计数器模式来检测,则这8个keys都正常.反而第2个BS808B改用外中断来检测,则这6个keys也只有1个key正常,剩下的5个keys都不正常.
这好像是采用外中断方式的有问题,但为何会有1个KEY正常?因为它们的按键扫描子程序都是一样的.如下面:
;************************************************************
;***********************************按键扫描管理*************
key_scan_man:
mov a,keydwn_t
sub a,251
snz c
inc keydwn_t ;按键扫描计数:1~251
sz BSINT1
jmp READ_BS804
sz BSINT2
jmp READ_BS808
clr keydwn_t ;都没有按键按下,则清相关变量
clr sw_bz
set scd1c
set scd2c
set tmr1c.4 ;都没有触摸芯片的按下标志位,则启动定时器进行外部计数
ret
;***************主程序区**************
main:
mov a,t_125us
sub a,40
snz c ;到了5mS吗
jmp main ;没到,则跳到main
main1:
clr t_125us ;到了,则清t_125us变量
snz halt_b ;halt_b 等于1则进入睡眠状态
jmp $+2 ;为0则正常执行指令
jmp sleep_man ;睡眠管理
clr wdt ;喂狗
call IC_TM1637_driver_man ;IC_TM1637驱动管理
call key_scan_man ;按键扫描管理
call led_out_man ;按键led灯输出管理
call open_inspection_man ;马达开门行程开关检测管理
call close_inspection_man ;马达关门行程开关检测管理
call voltage_chk ;电池电压检测管理
call time_man ;时间管理
call motor_man ;马达驱动管理(开门)
call buz_work ;蜂鸣器管理
call baojing_man ;报警输出管理
call HM_inspect_man ;换码开关管理
call shuiyin_man ;水银开关检测管理
call key_deal_man ;按键处理管理
call disp_man ;显示管理
call door_man ;门行程开关管理
call auto_man ;自动锁门管理(关门)
jmp main
;**********************************************
;**************************外部中断0***********
ext0_interrupt:
mov acc_bak,a
mov a,status
mov status_bak,a
set BSINT2
mov a,status_bak
mov status,a
mov a,acc_bak
reti
;***********************************************
;***************************定时0中断区*********
t0_isr:
mov acc_bak,a
mov a,status
mov status_bak,a
inc t_125us
snz f_buzact
jmp t0_isr_buzoff
sz buz_num.1
jmp t0_isr_buzout
jmp t0_isr_buzout
t0_isr_buzoff:
clr buzzer
jmp t0_isr_exit
t0_isr_buzout:
sz buzzer
jmp clr_buzp
jmp set_buzp
clr_buzp:
clr buzzer
jmp t0_isr_exit
set_buzp:
set buzzer
t0_isr_exit:
mov a,status_bak
mov status,a
mov a,acc_bak
reti
;***********************************************
;***************************定时1中断区*********
t1_isr:
mov acc_bak,a
mov a,status
mov status_bak,a
set BSINT1
mov a,status_bak
mov status,a
mov a,acc_bak
clr tmr1c.4
reti |