Conteggio a pulsanti
Semplicissimo up-down con pulsanti, conteggio da 0 a 9 più lettere
|
clicca per ingrandire |
dalla A-F, bello nel conteggio di giochi di societa' come segna punti, possibilita' di sostituire i pulsanti con delle fotocellule (norlmalmente aperto) in modo da usarlo come conta pezzi,possibilita' di ampliare il progetto con 2 o piu' display.
Descrizione
Nulla di particolare, con un pulsante si incrementa il conteggio, con l'altro si decrementa
7 resistenze da 330 ohm, il resto si vede dall'immagine, di seguito il filesorgente in assembler per la programmazione del PIC.
;-----------------------------------------------------
; Prog. conteggio esa con pulsanti up/down e antirimbalzo
;-----------------------------------------------------
PROCESSOR 16F84A
RADIX DEC
INCLUDE "P16F84.INC"
__CONFIG 11110100010000B
;-----------------------------------------------------
ORG 32
VALORE RES 1
H_CONT RES 1
L_CONT RES 1
#DEFINE PULS_UP PORTA,0
#DEFINE PULS_DN PORTA,1
;-----------------------------------------------------
ORG 0
CALL INIT ;Chiama subr.inizializzazione
MAINLOOP BTFSS PULS_UP ;Se non premuto PULS_UP skip
CALL GESTUP ;altrimenti chiama GESTUP
BTFSS PULS_DN ;Se non premuto PULS_DN skip
CALL GESTDN ;altrimenti chiama GESTDN
GOTO MAINLOOP ;Nuovo ciclo del programma
;-----------------------------------------------------
INIT BSF STATUS,RP0 ;Attiva banco 1
CLRF TRISB ;Rende PORTB un'uscita
BCF STATUS,RP0 ;Ritorna al banco 0
MOVLW 7
MOVWF CMCON ;PORTA = I/O digitali
CLRF VALORE ;Azzera valore
CLRW
CALL DISPLAY ;Chiama subroutine display
RETURN
;-----------------------------------------------------
GESTUP CALL DELAY ;Ritardo antirimbalzo
BTFSC PULS_UP ;Se ancora premuto skip
RETURN ;altrimenti ritorna
MOVLW 15
SUBWF VALORE,W ;W=VALORE-15
BTFSS STATUS,C ;Se VALORE >= 15 skip
INCF VALORE,F ;altrimenti incrementa VALORE
MOVF VALORE,W ;W=VALORE
CALL DISPLAY ;Chiama subroutine display
GESTUP2 BTFSS PULS_UP ;Se non premuto PULS_UP skip
GOTO GESTUP2 ;altrimenti attendi
CALL DELAY ;Ritardo antirimbalzo
BTFSS PULS_UP ;Se non premuto skip
GOTO GESTUP2 ;Altrimenti attendi
RETURN
;-----------------------------------------------------
GESTDN CALL DELAY ;Ritardo antirimbalzo
BTFSC PULS_DN ;Se ancora premuto skip
RETURN ;Altrimenti ritorna
MOVF VALORE,W
SUBLW 0 ;W=0-VALORE
BTFSS STATUS,C ;Se VALORE <=0 skip
DECF VALORE,F ;altrimenti decrementa VALORE
MOVF VALORE,W ;W=VALORE
CALL DISPLAY ;Chiama subroutine display
GESTDN2 BTFSS PULS_DN ;Se non premuto PULS_DN skip
GOTO GESTDN2 ;altrimenti attendi
CALL DELAY ;Ritardo antirimbalzo
BTFSS PULS_DN ;Se non premuto skip
GOTO GESTDN2 ;Altrimenti attendi
RETURN
;-----------------------------------------------------
DELAY MOVLW 15
MOVWF H_CONT
CLRF L_CONT
DELAY2 DECF L_CONT,F ;Decrementa parte bassa CONT
CMCON L_CONT,W ;Inverte i bit
BTFSC STATUS,Z ;Se tutti zero c'è stato rollover
DECF H_CONT,F ;allora decrementa parte alta
MOVF L_CONT,W ;Carica in W la parte bassa
IORWF H_CONT,W ;Mettila in OR con la parte alta
BTFSS STATUS,Z ;Se tutto zero skip (fine ciclo)
GOTO DELAY2 ;Altrimenti ritorna a DELAY2
RETURN
;-----------------------------------------------------
DISPLAY CALL TABDISP ;Chiama subroutine conversione
MOVWF PORTB ;Scrive valore dei LED su PORTB
RETURN
;-----------------------------------------------------
TABDISP ADDWF PCL,F ;Conversione esa->display
RETLW 00111111B ;0
RETLW 00000110B ;1
RETLW 01011011B ;2 -0-
RETLW 01001111B ;3 5| |1
RETLW 01100110B ;4 -6-
RETLW 01101101B ;5 4| |2
RETLW 01111101B ;6 -3- .7
RETLW 00000111B ;7
RETLW 01111111B ;8
RETLW 01101111B ;9
RETLW 01110111B ;A
RETLW 01111100B ;B
RETLW 00111001B ;C
RETLW 01011110B ;D
RETLW 01111001B ;E
RETLW 01110001B ;F
;-----------------------------------------------------
END