打印

写了个单键控制的三种模式,望大家指点

[复制链接]
2651|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyuaug|  楼主 | 2009-6-21 17:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用T0 1S中断一次实现长按及4分钟后睡眠
用T1 实现LCD的计时,每500MS中断一次
感覍性能不是很好,是因为它在连续的按键测试过程中,会出现不到4S后复位
望大家指出问题点
;;;;;;;;;;;;;;;;;
    
    ldi tmod,001b;100ms
    ldi tl0,00h
    ldi th0,0fh;1S/0bh:5s/0ch:4s
    ldi tmod1,011b;500ms
    ldi tl1,00h
    ldi th1,08h
    ldi ie,0100b
    ldi irq,0
    
    ldi flag,010b
    jmp main
    
stop_4min:
    ldi bzw,0
    ldi kbz,0
    ldi sbzw,0
    ldi mbzw,0
    ldi s4_bzw,0
    ldi min_2,0
    ldi tl0,00
    ldi th0,0fh
    ldi ie,0001b
    ldi irq,0
    stop
    nop
    nop
;************************            
main:        
    call display    
key_scan:
    lda pb
    sta pb_bak
    sbi pb_bak,1111b
    baz no_key;key_exit    
    jmp key_work
;*********************************
;没有键操作程序
;没有按键操作;判断是否有键操作过
;*********************************
no_key:
    andim kbz,0001b
    baz min_flag;main
;不是第一次按键,判断是哪种模式
key_exit:        
    lda bzw
    ba0 main_wait    ;BZW为1是计时模式
    jmp min_flag    ;为0是暂停模式
;BZW为1是计时模式        
main_wait:
    eorim pa,0100b
    andim ie,0010b
;    ldi irq,0
    jmp main
;**********************
;判暂停是否到了4分钟    
;**********************    
min_flag:
    ;eorim pa,0001b
    lda mbzw
    ba0 stop_4min    ;到了4分钟,转STOP模式
    orim ie,0100b
    jmp main    ;没到,转key_scan
;*********************************************
;消抖后的按键处理
;*********************************************        
key_work:    
    call delay
    lda pb
    sub pb_bak
    bnz key_exit;main
    eor pb_bak
    ba0 main
    andim bzw,0001b
    ba0 key_2
key_1:    
    ldi tl0,0
    ldi th0,0
    andim s4_bzw,0;    
    ldi tl0,00
    ldi th0,0fh
    ldi ie,0010b
    ldi irq,0
    jmp key_1nd
key_2:    
    ldi tl0,0
    ldi th0,0
    andim s4_bzw,0
    ldi tl0,00
    ldi th0,0fh
    ldi irq,0
    ldi tl0,00
    ldi ie,0100b
    ldi irq,0
    jmp key_2nd
key_1nd:
    lda pb
    eor pb_bak
    bnz main_buff
    call display
    ldi ie,0110b
    ldi irq,0
    andim s4_bzw,0001b
    ba0 key4s_d0
    jmp key_1nd    
key_2nd:    
    lda pb
    eor pb_bak
    bnz main_buff_stop
    ldi flag,010b
    call display
    andim s4_bzw,0001b
    ba0 key4s_d0
    jmp key_2nd    
main_buff:
    ldi tl0,0
    ldi th0,0
    andim s4_bzw,0
    orim kbz,0001b
    orim bzw,0001b
    ldi tl0,00
    ldi th0,0fh
    ldi ie,0010b
    ldi irq,0
    jmp main
main_buff_stop:
    andim s4_bzw,0
    orim kbz,0001b
    andim bzw,0000b;
    ;ldi tl0,00
    ;ldi th0,0fh
    jmp main
key4s_d0:    
    ldi ie,0
    ldi irq,0
    jmp r_start  
沙发
warm_ice| | 2009-6-22 10:31 | 只看该作者

这样

不知道您用的是哪颗IC,如果像您说的不到4S就会复位了,请您查看一下,是否有打开看门狗(WDT),如果有打开,而没有及时喂狗,可能就会出现您说的情况.

使用特权

评论回复
板凳
gaoyuaug|  楼主 | 2009-6-22 11:19 | 只看该作者

是这样跟上

用的是ICS6612 EVBD66N12 VER3.2,应该是没有WDT吧
是这样
当我在一种模式下操作2秒后,抬起按键,
再进入另一种模式后实现长按操作,就会出现不到4S后复位,
有时是2秒就复位了
这个地方我改了,
key_2:    
    ldi tl0,0
    ldi th0,0
    andim s4_bzw,0
    ldi tl0,00
    ldi th0,0fh
    ldi irq,0
   ; ldi tl0,00
    ldi ie,0100b
    ldi irq,0
    jmp key_2nd

使用特权

评论回复
地板
warm_ice| | 2009-6-22 11:53 | 只看该作者

这样

中颖仿真器ICE66有个TRACE的功能,您可以这样使用,在程序入口初始化的部分设置一个断点,然后按您说的可能引起复位的方式来操作,当程序复位后,会停在您设置的断点处,这时按CTRL+C键,即可调出程序停止前的8K程序是怎么运行的,您通过这个来追踪,就很容易发现问题的所在了.

使用特权

评论回复
5
gaoyuaug|  楼主 | 2009-6-22 13:01 | 只看该作者

跟上

这程序是我这些天一步步的写起来的,
之前我是用示波器对做调试,很容易发现问题,
现在用示波器的都发现不了,之所以发贴是因为我不知道这种写法是否正确。

使用特权

评论回复
6
warm_ice| | 2009-6-22 13:24 | 只看该作者

OK

明白您的意思,如果是这样的话,需要您补充一下您的思路,最好再补上关键的电路部分.

使用特权

评论回复
7
gaoyuaug|  楼主 | 2009-6-29 09:53 | 只看该作者

再跟

我是想让它在长按4S后复位的,短按抬起后执行操作;
程序复位肯定是因为定时器0计时到4S后;
问题是这样:
在长按2S后,我松开按键,定时器0,1都已经记录了2S;
这时我再执行长按操作,就会出现问题了,发现不到4S后就复位了,
也就是说上次执行的2S被保留了。
我是想不管怎样,定时器我要用的时候,它应该是从我给它赋於新的值后,才工作的,可是问题出在它并没有这样;
;*************************    
;第一次按键操作
;*************************
key_1:    
    andim s4_bzw,0
    ldi irq,0
    ldi ie,0100b
    ldi tmod,111b;
    ldi tl0,0fh
    ldi th0,0fh
    ldi irq,0
    ldi ie,000b
    andim s4_bzw,0
    ldi tmod,1
    ldi tl0,00
    ldi th0,0fh
    ldi irq,0
    ldi ie,0010b    
    jmp key_1nd
;*************************    
;第一次按键抬起、长按判断
;*************************
key_1nd:
    ldi irq,0
    ldi ie,0110b
key_1nd_1:    
    lda pb
    eor pb_bak
    bnz main_buff
    call display
    andim s4_bzw,0001b
    ba0 key4s_d0
    ldi ie,0110b        
    jmp key_1nd_1
main_buff:
    andim s4_bzw,0
    orim kbz,0001b
    orim bzw,0001b
    ldi irq,0
    ldi ie,0010b    
    jmp main
;*************************    
;第二次按键操作
;*************************    
key_2:    
    andim s4_bzw,0
    ldi irq,0
    ldi ie,0100b
    ldi tmod,111b;
    ldi tl0,0fh
    ldi th0,0fh
    ldi irq,0
    ldi ie,0
    andim s4_bzw,0
    ldi tmod,001b;
    ldi tl0,00
    ldi th0,0fh
    ldi irq,0
    ldi ie,0100b
    jmp key_2nd    
;*************************    
;第二次按键抬起、长按判断
;*************************    
key_2nd:    
    lda pb
    eor pb_bak
    bnz main_buff_stop
    ldi flag,010b
    call display
    andim s4_bzw,0001b
    ba0 key4s_d0
    jmp key_2nd    
main_buff_stop:
    andim s4_bzw,0
    orim kbz,0001b
    andim bzw,0000b;
    jmp main
;*************************    
;执行长按操作
;*************************
;你肯定是想让我在这再做一次判断    
key4s_d0:
    ldi irq,0    
    ldi ie,0
    jmp r_start

使用特权

评论回复
8
gaoyuaug|  楼主 | 2009-6-30 08:15 | 只看该作者

再跟

又休息了一会儿,知道问题点出在哪了
ok

使用特权

评论回复
9
warm_ice| | 2009-6-30 09:19 | 只看该作者

恭喜

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

188

帖子

0

粉丝