IMC!


Contenuti


Foto

 







Curiosando...
Novita  Novità Link  Link Blog  Blog English  Español 
03 - Contatore

 | 
Pagina successiva

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
 


 | 
Pagina successiva






Fatal error: Call to undefined function sqlite_open() in /membri/giacobbe85/include/commenti.inc.php on line 324