Case Mod RJ
Olá Convidado, Seja Bem-Vindo(a) ao nosso Forum.

O Nosso Forum possui 15 Categorias.
Ela está Online há 3110 dias.
E conta com 318 Tópicos e 404 Mensagens.

Obs: Se você ainda não for cadastrado por favor, cadastre-se, é grátis assim você poderá ler todos os tópicos e ter acesso aos links.
E por favor colaborem, postem, perguntem, criem e divirtam-se.
Contribuindo vocês me ajundam a manter o forum, pois sempre estarei postando novidades e projetos sobre casemod e eletronica.




Buscar
 
 

Resultados por:
 


Rechercher Busca avançada

Parceiros
Seja Parceiro, apenas aqui e entre em contato

Seja Parceiro, apenas aqui e entre em contato

Calculadora de Led’s
Calculadora de led multo util, para você fazer seu projeto.
Calculadora LM317
Calculadora do LM 317 muito util, para você fazer seu projeto.
Calculadora Resistor
Calculadora de resistores multo util, para você fazer seu projeto.

PIC Tutorial - Um botão inteligente

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

PIC Tutorial - Um botão inteligente

Mensagem  CaseModRJ em 02.05.10 17:05

Esta é uma das minhas favoritas-rotina! Quando eu desenho um projeto, eu sempre tento fazer a interface de usuário mínima. Para isso, você precisa ter botões para fazer mais do que apenas um clique. Este tutorial irá demonstrar como distinguir três diferentes estados do botão. Então, de acordo com a forma como o botão foi pressionado, uma rotina diferente deve ser executado. Os três estados são os seguintes:

Clique: Um clique no botão rápido, mais rápido do que 800mSec

Duplo Clique: Dois cliques no 300mSec com atraso máximo entre 150mSec

Longo Clique: A imprensa muito tempo para o botão, já que 800mSec

Os tempos são dadas mSec totalmente paramétrico e podem ser alteradas à vontade. Isto é importante porque ele é diferente se o botão é mecânico diferente, se é um botão sensível ao toque, diferente dos sistemas de menu e diferentes para aplicações críticas, tais como controle de luz.

Projeto em Ação

[Você precisa estar registrado e conectado para ver este link.]

O Circuito

[Você precisa estar registrado e conectado para ver esta imagem.]

Cada LED é iluminado de uma outra sub-rotina. O LED vermelho acende em um único clique, o verde em uma longa e pressione o amarelo em um clique duplo.

Código:
; RAM preserved -----------------------------------------------------------
   cblock 0x20
      WaitCounter,WaitCounter2
      IntervalCounter
   endc
; Conastants --------------------------------------------------------------
GLDoubleClick_Interval   =   d'15'   ;mSec x 10
GLDoubleClick_MaxDelay   =   d'30'   ;mSec x 10
GLLongClick_Interval   =   d'80'   ;mSec x 10
; Main Program ------------------------------------------------------------

Start
            bank1            ;Go to bank 1
            movlw b'11111111'      ;
            movwf TRISA         ;Set the port pin types of the RA

            movlw b'11111000'      ;
            movwf TRISB         ;Set the port pin types of the RB
            bank0            ;Go to bank 0

            bcf ClickOutput
            bcf DblClickOutput
            bcf LngClickOutput

MainLoop
            btfss ButtonInput
            goto MainLoop
            
            movlw GLLongClick_Interval
            movwf IntervalCounter
CheckForLongClick
            call Wait10mSec
            btfss ButtonInput      ;Check if it is a long click
            goto NoLongClick
            decfsz IntervalCounter,f
            goto CheckForLongClick

            ;It WAS a long click
            goto Run_Long_Click

NoLongClick                     ;It was NOT a long click
            movf  IntervalCounter,w
            sublw GLLongClick_Interval   ;Check How many mSeconds was the first keypress

            sublw GLDoubleClick_MaxDelay   ;Was it MORE thant the max dbl initial click?
            btfss Carry         ;If the result is negative
            goto Run_Single_Click      ;Then it was a single click.

            ;Else, we will wait more to see if it will be a dbl click
            movlw GLDoubleClick_Interval
            movwf IntervalCounter

CheckForDblgClick
            call Wait10mSec
            btfsc ButtonInput
            goto It_Is_A_Dbl_Click

            decfsz IntervalCounter,f
            goto CheckForDblgClick

            ;It WAS a Single click
            goto Run_Single_Click            

It_Is_A_Dbl_Click
            call Wait2mSec
            btfsc ButtonInput
            goto It_Is_A_Dbl_Click      ;Wait untill the button is released
            goto Run_Dbl_Click

Run_Single_Click
            bsf ClickOutput
            call Wait1Sec
            bcf ClickOutput
            goto WaitForKeyReleaseBeforeReturn
Run_Dbl_Click
            bsf DblClickOutput
            call Wait1Sec
            bcf DblClickOutput
            goto WaitForKeyReleaseBeforeReturn

Run_Long_Click
            bsf LngClickOutput
            call Wait1Sec
            bcf LngClickOutput
;            goto WaitForKeyReleaseBeforeReturn   ;This instrruction is not really nesecary here!

WaitForKeyReleaseBeforeReturn
            call Wait4mSec
            btfsc ButtonInput
            goto WaitForKeyReleaseBeforeReturn
            call Wait10mSec
            goto MainLoop


Começamos por definir os tipos de pinos. Logo depois, temos clara a três saídas para que os LEDs estão desligados. O MainLoop desta vez é ... 2 instruções por muito tempo! Ele verifica se o botão for pressionado. Se não, ele volta ao MainLoop. Se for, ele vai continuar com a verificação do tipo clique. Tentando descrever esta sub-rotina com as palavras que complicam as coisas ainda mais. Portanto, eu tenho adicionar o seguinte fluxograma que descreve apenas esta sub-rotina:

[Você precisa estar registrado e conectado para ver esta imagem.]
Clique aqui para baixar o Pdf

Assim, após esta sub-rotina, um dos três sub-rotinas clique deve ser executado. Vai ser um single, um duplo ou um clique longo. De acordo com a chamada sub-rotina, o LED correspondente acesa. Além disso, o LED permanecerá durante um segundo e depois desliga-se novamente. Em seguida, o fluxo do programa deve retornar ao MainLoop. Mas antes isso for feito, nós precisamos garantir que o botão ainda não está pressionado (por exemplo, após um clique duplo clique que o segundo poderia ser ainda ativo). Portanto, eu adicionar uma outra sub-rotina de pequeno porte que é chamado após cada clique / dbl / lng execução subrotina clique. Esta sub-rotina irá verificar cada 4mSec o estado do botão. Se o botão não é pressionado, então ele vai esperar mais um 10msec (para debouncing) e ele vai voltar para MainLoop.

Arquivos do Projeto

Código do Pic.

Fonte: Pcheaven
avatar
CaseModRJ
Admin

Número de Mensagens : 338
Idade : 36
Pontos : 100000520
Reputação : 61
Data de inscrição : 16/03/2009

http://casemodrj.forumeiro.com

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum