Questo programma implementa un semplice contatore da 0 a 15, che pu� essere incrementato a ogni pressione di un pulsante collegato a RB0. Sul PORTD del PIC � collegato un display a 7 segmenti.
La tabella
digit_decode si occupa di attivare per ogni numero da 0 a 15 le uscite opportune del PORTD in modo da accendere i segmenti del display necessari a visualizzare una cifra. In base al tipo di display e a come vengono effettuati i collegamenti, � necessario scrivere opportunamente tale tabella.
Il pulsante viene implementato in questo modo: sul PORTB, posto in ingresso, vengono abilitate le resistenze di pull-up; la tensione in ingresso sar� quindi +5V, e sar� sempre presente 1 logico. Cortocircuitando a massa i pin, la tensione diventer� nulla e sar� presente 0 logico. Il pulsante sar� quindi attivo basso.
; -------------------------------------------------------------------------------------
; CONTATORE
; -------------------------------------------------------------------------------------
; -------------------------------------------------------------------------------------
; Questo programma implementa un semplice contatore da 0 a 15, che pu� essere
; incrementato a ogni pressione di un pulsante.
; -------------------------------------------------------------------------------------
; -------------------------------------------------------------------------------------
; Direttive per l'assemblatore
; -------------------------------------------------------------------------------------
LIST p=16F877
RADIX dec
INCLUDE "p16F877.inc"
__CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF & _LVP_OFF & _BODEN_OFF
ORG 0x0000
; -------------------------------------------------------------------------------------
; Variabili
; -------------------------------------------------------------------------------------
; Generali
sec EQU 0x24
; Varibili per la funzione Delay
X1 EQU 0x20
K2 EQU 116
X2 EQU 0x21
K3 EQU 61
X3 EQU 0x22
; -------------------------------------------------------------------------------------
; Main - Setup del sistema
; -------------------------------------------------------------------------------------
; Vado al banco 1
BSF STATUS,5
MOVLW 01111111b
; ^---------7 -RBPU Abilitazione resistenze pull-up (negato)
; ^--------6 INTEDG Decide il fronte attivo dell'interrupt (1 salita 0 discesa)
; ^-------5 T0CS tmr0 sorgente del clock (0 interno)
; ^------4 T0SE Nega il clock esterno (piedino T0CKl)
; ^-----3 PSA Se 1 uso il prescaler per il Watchdog, se 0 lo uso per TMR0
; ^----2 PS2 Con PS1 e PS0 imposta il prescaler a un valore tra 2 e 256
; per TMR0 e tra 1 e 128 per il Watchdog.
; 111 -> TMR0:256, WatchDog:128
; 000 -> TMR0:2, WatchDog:1
; ^---1 PS1
; ^--0 PS0
MOVWF OPTION_REG ;registro OPTION REGISTER
; Configurazione del PortD in uscita
CLRF TRISD ; abilito il display numerico a 7 segmenti
; Torno nel banco 0
BCF STATUS,5
; Resetto la variabile sec
MOVLW 0
MOVWF sec
CALL digit_decode
MOVWF PORTD ;Scrivo sull'uscita
; -------------------------------------------------------------------------------------
; Main - Programma principale
; -------------------------------------------------------------------------------------
ciclo_rit:
; Ritardo anti-rimbalzo per il rilascio
MOVLW 1
CALL Delay
; Ciclo di attesa dello 0
ciclo_0:
; Attesa della pressione del pulsante (attivo basso)
BTFSC PORTB,0
GOTO ciclo_0
Incremento:
INCF sec,f ;Incremento il contatore
MOVF sec,w ;Carico in W il conto attuale
CALL digit_decode
MOVWF PORTD ;Scrivo sull'uscita
; Ritardo anti-rimbalzo per la pressione
MOVLW 1
CALL Delay
ciclo_1:
; Attesa del rilascio del punsante (attivo basso)
BTFSS PORTB,0 ;
GOTO ciclo_1
GOTO ciclo_rit ; Ciclo principale
; -------------------------------------------------------------------------------------
; Delay
; -------------------------------------------------------------------------------------
; Funzione: impegna il processore per generare un ritardo
; Ingresso: ritardo (sottoforma di fattore di moltiplicazione *10ms in W)
; Uscita: nulla
Delay: MOVWF X1
LOOP1: MOVLW K2
MOVWF X2
LOOP2: MOVLW K3
MOVWF X3
LOOP3: GOTO SALTO1
SALTO1: GOTO SALTO2
SALTO2: DECFSZ X3,F
GOTO LOOP3
DECFSZ X2,F
GOTO LOOP2
DECFSZ X1,F
GOTO LOOP1
RETURN
; -------------------------------------------------------------------------------------
; Tabella di Decodifica
; -------------------------------------------------------------------------------------
; Funzione: tabella che converte un numero su 4 bit nel codice binario
; che serve a generare tale numero sul display a 7 segmenti
; collegato al PORTD.
; Ingresso: numero su 4 bit esadecimale
; Uscita: numero binario per il PORTD
digit_decode:
ANDLW 0x0F ;Prendo solo i primi 4 bit
ADDWF PCL, f
RETLW 00101000b ;0
RETLW 01111011b ;1
RETLW 00011100b ;2
RETLW 00011001b ;3
RETLW 01001011b ;4
RETLW 10001001b ;5
RETLW 10001000b ;6
RETLW 00111011b ;7
RETLW 00001000b ;8
RETLW 00001001b ;9
RETLW 00001010b ;A
RETLW 11001000b ;b
RETLW 11011100b ;c
RETLW 01011000b ;d
RETLW 10001100b ;E
RETLW 10001110b ;F
STOP: GOTO STOP
END