miércoles, 2 de marzo de 2011

Multiplexaje de Display con Desplazamiento de Caracteres

Programa para PIC16F84A

El programa consiste en mostrar una serie caracteres en 4 display multiplexados.
los caracteres se muestran en grupos de 4 y se desplazan a la izquierda.

Diagrama de Conexión:



Funcionamiento:


  • Aplicando un procedimiento de multiplexaje se muestran los primeros 4 caraceres (CHAR1, CHAR2, CHAR3 y CHAR4). 
  • transcurrido un tiempo tal que el ojo pueda captar los caracteres se desplaza la cadena hacia la izquierda y se muestran los siguientes 4 caracteres (CHAR2, CHAR3, CHAR4, CHAR5). 
  • El programa comprueba si se mostraron todos los caracteres y cuando esto ocurre el proceso se repite.
Prueba:


 Programa en Assembler:


;-----------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa para multiplexar 4 display
;Muestra mensaje LONELY113 con desplazamiento a la izquierda
;Salidas: Puerto B (RB1-RB7) 7 segmentos de display
;   Puerto A (RA0-RA3) habilitacion de display 
;Tipo de display: Catodo comun
;-----------------------------------------------------------

include "p16f84a.inc"
list P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

COUNT1 equ 0x0C
COUNT2 equ 0x0D
COUNT3 equ 0x0E
CHAR equ 0xF

 org 0x00  ; Inicio de programa
 bsf STATUS,5 ; Inicio configuracion E/S
 clrf PORTA  ; PORTA como salidas de habilitacion
 clrf PORTB  ; PORTB como salida a displays
 bcf STATUS,5 ; Fin configuracion E/S
 movlw 0x00
 movwf PORTB
 movlw 0x0F
 movwf PORTA  ; Deshabilita todos los displays
 clrf CHAR
 movlw 0xFF  ; Inicializacion de contadores
 movwf COUNT1
 movlw 0x20
 movwf COUNT2
 movlw 0x20
 movwf COUNT3
BEGIN: call TABLE  ; Inicio de rutina principal
 movwf PORTB
 bcf PORTA,3
 nop   ; Visualizacion por Display4
 bsf PORTA,3
 incf CHAR,1
 call TABLE
 movwf PORTB
 bcf PORTA,2
 nop   ; Visualizacion por Display3
 bsf PORTA,2
 incf CHAR,1
 call TABLE
 movwf PORTB
 bcf PORTA,1
 nop   ; Visualizacion por Display2
 bsf PORTA,1
 incf CHAR,1
 call TABLE
 movwf PORTB
 bcf PORTA,0
 nop   ; Visualizacion por Display1
 bsf PORTA,0
 movlw 0x03
 subwf CHAR,1
 decfsz COUNT1,1 ; Rutina de repeticion
 goto BEGIN  ; de visualizacion de los 
 movlw 0xFF  ; 4 caracteres
 movwf COUNT1
 decfsz COUNT2,1
 goto BEGIN
 movlw 0xFF
 movwf COUNT1
 movlw 0x20
 movwf COUNT2
 decfsz COUNT3
 goto BEGIN
 incf CHAR,1  ; Mostrar los siguientes caracteres
 movlw 0xFF  ; Inicializacion de contadores
 movwf COUNT1
 movlw 0x20
 movwf COUNT2
 movlw 0x20
 movwf COUNT3
 movlw 0x0C  ; Comprueba si se mostro los
 subwf CHAR,0  ; 4 ultimos caracteres
 btfsc STATUS,2 
 clrf CHAR
 goto BEGIN

; Subrutinas

TABLE movf CHAR,0  ; Tabla de caracteres a mostrar
 addwf PCL
 retlw 0x00  ; Caracter _
 retlw 0x00  ; Caracter _
 retlw 0x00  ; Caracter _
 retlw 0x70  ; Caracter L
 retlw 0x7E  ; Caracter O
 retlw 0x6E  ; Caracter N
 retlw 0xF3  ; Caracter E
 retlw 0x70  ; Caracter L
 retlw 0xDC  ; Caracter Y
 retlw 0x0C  ; Caracter 1
 retlw 0x0C  ; Caracter 1
 retlw 0x9E  ; Caracter 3
 retlw 0x00  ; Caracter _
 retlw 0x00  ; Caracter _
 retlw 0x00  ; Caracter _

 end   ; Fin de programa


Archivos .ASM y .HEX

Descargar

Multiplexaje de Display

Programa para PIC16F84A


El programa consiste en controlar la visualización simultánea en 4 display cátodo común de 7 segmentos utilizando el método de multiplexaje para optimizar el uso de pines del PIC.

Diagrama de Conexión:


Funcionamiento:
  • Se deshabilitan todos los displays (RA3-RA0=1111).
  • Se envía dato a mostrar al Puerto B (RB1-RB7).
  • Se habilita el display que mostrará el dato (Por ejemplo Display 1 à RA0=0).
  • Se deshabilita Display (Por ejemplo Display 1 à RA0=1).
  •  Se envía nuevo dato al Puerto B.
  • Se habilita el display que mostrará el dato.
  • Se deshabilita el display.
  • El procedimiento continúa hasta enviar 4 datos a los 4 displays.
  • Todo el proceso se repite endefinidamente. El ojo humano no llega a notar el parpadeo de los displays pues ocurre a muy alta frecuencia, por lo tanto se percibe como si los 4 displays estuvieran iluminados y mostrando los 4 datos simultáneamente.
  • El diagrama siguiente muestra el funcionamiento:

 Prueba


  Programa en Assembler:


;-----------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa que multiplexa 4 display y mostrar el mensaje HOLA
;Salidas: Puerto B (RB1-RB7) 7 segmentos de display
;   Puerto A (RA0-RA3) habilitacion de display 
;Tipo de display: Catodo comun
;-----------------------------------------------------------
include "p16f84a.inc"
list P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

CHAR1 equ 0x0C
CHAR2 equ 0x0D
CHAR3 equ 0x0E
CHAR4 equ 0x0F

 org 0x00  ; Inicio de programa
 bsf STATUS,5 ; Inicio configuracion de E/S
 clrf PORTA  ; Puerto A como salida
 clrf PORTB  ; Puerto B como salida
 bcf STATUS,5 ; Fin configuracion E/S
 call SAVE  ; Llama a subrutina SAVE
BEGIN: movlw   0x0F  ; b'00001111'
 movf PORTA  ; deshabilita los display
 movf CHAR1,0  
 movwf PORTB  ; Mover CHAR1 a puerto B
 bcf PORTA,3  ; Habilitar Display1 
 bsf PORTA,3  ; Deshabilitar Display1
 movf CHAR2,0  
 movwf PORTB  ; Mover CHAR2 a puerto B
 bcf PORTA,2  ; Habilita Display2
 bsf PORTA,2  ; Deshabilita Display2
 movf CHAR3,0  
 movwf PORTB  ; Mover CHAR3 a puerto B
 bcf PORTA,1  ; Habilita Display3
 bsf PORTA,1  ; Deshabilita Display3
 movf CHAR4,0  
 movwf PORTB  ; Mover CHAR4 a puerto B
 bcf PORTA,0  ; Habilita Display4
 bsf PORTA,0  ; Deshabilita Display4
 goto BEGIN  

;Subrutinas
SAVE movlw 0xEC
 movwf CHAR1  ; Caracter H
 movlw 0x7E
 movwf CHAR2  ; Caracter O
 movlw 0x70
 movwf CHAR3  ; Caracter L
 movlw 0xEE
 movwf CHAR4  ; Caracter A
 return

 end   ; Fin de programa



Archivos .ASM y .HEX

Descargar

martes, 1 de marzo de 2011

Semáforo

Programa para PIC16F84A

Control de 2 semáforos.

-Uso de contadores
-Subrutina de retardo calibrado a 1 s para un cristal de 10 MHz

Diagrama de conexión:


Funcionamiento:


             La luz Verde dura 25 segundos.
             La Luz Ámbar dura 5 segundos.
             La Luz Roja dura 30 segundos.
  • Se crea una variable TIME que se incrementa cada 1 segundo (calibrado mediante contadores para un cristal de 10 MHz).
  • Se verifica la variable TIME para cambiar el estado de las luces según el siguiente diagrama:

Prueba:


 Programa en Assembler:


;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa de control de 2 semaforos 
;Salidas: Puerto B (RB0-RB5)
;    RB0=Verde1, RB1=Ambar1, RB2=Rojo1
;   RB3=Verde2, RB4=Ambar2, RB5=Rojo2
;---------------------------------------------------------
include "p16f84a.inc"
list P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

TIME equ 0x0C
COUNT1 equ 0x0D
COUNT2 equ 0x0E
COUNT3 equ 0x0F

 org 0x00  ; Inicio de programa
 bsf STATUS,5 ; Inicio configiracion E/S
 clrf PORTB  ; Puerto B como salida
 bcf STATUS,5 ; Fin configuracion E/S
 movlw 0x21  ; b'000100001'
 movwf PORTB  ; RB0=Verde1 y RB5=Rojo2
BEGIN: call COUNTER  ; Llama a subrutina COUNTER
 movlw 0x00  ; 0 segundos
 subwf TIME,0  
 btfsc STATUS,2 ; Si TIME =0 segundos saltar a FIRST
 goto FIRST
 movlw 0x19  ; 25 segundos
 subwf TIME,0  
 btfsc STATUS,2 ; Si TIME=25 segundos saltar a SECOND
 goto SECOND
 movlw 0x1E  ; 30 segundos
 subwf TIME,0  
 btfsc STATUS,2 ; Si TIME=30 segundos saltar a THIRD
 goto THIRD
 movlw 0x37  ; 55 segundos
 subwf TIME,0
 btfsc STATUS,2 ; Si TIME=55 segundos saltar a FOURTH
 goto FOURTH
 goto FINISH
FIRST: movlw 0x21  ; b'000100001'
 movwf PORTB  ; RB0=Verde1 y RB5=Rojo2
 goto FINISH
SECOND: movlw 0x22  ; b'000100010'
 movwf PORTB  ; RB1=Ambar1 y RB5=Rojo2
 goto FINISH
THIRD: movlw 0x0C  ; b'00001100'
 movwf PORTB  ; RB2=Rojo1 y RB3=Verde2
 goto FINISH
FOURTH: movlw 0x14  ; b'00010100'
 movwf PORTB  ; RB2=Rojo1 y RB4=Ambar2
 goto FINISH
FINISH: goto BEGIN

;Subrutinas

COUNTER movlw 0xFA    ; Subrutina para que TIME 
 movwf COUNT1  ; se incremente cada 1 segundo
 movlw 0xC8  ; calibrado para cristal de 10 MHz
 movwf COUNT2  ; modificar COUNT1, COUNT2 y COUNT3
 movlw 0x12  ; para otras frecuencias
 movwf COUNT3
LOOP: decfsz COUNT1,1
 goto LOOP
 movlw 0xFA    
 movwf COUNT1
 decfsz COUNT2,1
 goto LOOP
 movlw 0xFA
 movwf COUNT1
 movlw 0xC8 
 movwf COUNT2
 decfsz COUNT3,1
 goto LOOP
 incf TIME,1 
 movlw 0x3C  ; 60 segundos entonces reiniciar TIME
 subwf TIME,0
 btfsc STATUS,2
 clrf TIME
 return

 end   ; Fin de programa
  


****Programa Pic Basic (Microcode)****


'****************************************************************
'*  Name    : SEMAFORO.BAS                                      *
'*  Author  : LONELY113                                         *
'*  Notice  : Copyright (c) 2011 LONELY113                      *
'*          : All Rights Reserved                               *
'*  Date    : 12/05/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : PIC16F84a                                         *
'*          : RB0=GREEN1, RB1=YELLOW1, RB2=RED1                 *
'*          : RB3=GREEN2, RB4=YELLOW2, RB5=RED2                 *
'****************************************************************

@  __config _HS_OSC & _WDT_OFF

DEFINE OSC 10    '10 MHz
trisb=$00        'Puerto B como salida

loop1:
 portb=100001 'Green1, Red2
 PAUSE 25000     'Retardo de 25 segundo
 portb=100010 'Ambar1, Red2
 PAUSE 5000      'Retardo 5 segundos
 portb=001100 'Red1, Green2
 PAUSE 25000     'Retardo 25 segundos
 portb=010100 'Red1, Yellow2
 PAUSE 5000      'Retardo 5 segundos
GOTO loop1
END

Archivos .ASM y .HEX
Descargar

Contador Decimal

Programa para PIC16F84A

Contador decimal con visualización en display de 7 segmentos.

-Subrutina de retardo
-Tabla de datos de conversión Hexadecimal a 7 segmentos

Diagrama de conexión:


Prueba:

 

Programa en Assembler:

;-------------------------------------------------------------------
;Autor: LONELY113
;       http://lonely113.blogspot.com
;
;Programa contador decimal 0-9
;Salida a display 7 segmentos catodo comun: Puerto B (RB1-RB7)
;
;-------------------------------------------------------------------
include "p16f84a.inc"
list P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

COUNT1 equ 0x0C
COUNT2 equ 0x0D
COUNT3 equ 0x0E
COUNT0 equ 0x9F

 org 0x00  ; Inicio de programa
 bsf STATUS,5 ; Inicio configuracion E/S
 movlw 0x00
 movwf TRISB  ; PORTB como salida
 bcf STATUS,5 ; Fin configuracion E/S
 movlw 0x00
 movwf COUNT0  ; Iniciar cuenta en 0
BEGIN: movf COUNT0,0
 call TABLE  ; llamada a subrutina
 movwf PORTB  ; Mostrar cuenta
 call DELAY  ; Retardo
 incf COUNT0,1 ; Incrementar cuenta
 movlw 0x0A  
 subwf COUNT0,0 ; Comprobar si cuenta llega a 10d
 btfsc STATUS,2
 clrf COUNT0  ; Si COUNT=10d reiniciar inmediatamente
 goto BEGIN  ; Bucle infinito

;Subrutinas

DELAY movlw 0xFF  ; Subrutina de retardo de cuenta
 movwf COUNT1
 movwf COUNT2
 movwf COUNT3
LOOP: decfsz COUNT1
 goto LOOP
      decfsz COUNT2
 goto LOOP
 decfsz COUNT3
 goto LOOP
 return

;Tabla de datos

TABLE addwf PCL,1  ; Conversion hexadecimal a 7 segmentos
 retlw 0x7E
 retlw 0x0C
 retlw 0xB6
 retlw 0x9E
 retlw 0xCC 
 retlw 0xDA
 retlw 0xFA
 retlw 0x0E
 retlw 0xFE
 retlw 0xDE
 return
 
 end   ; Fin de programa


****Programa en Pic Basic (Microcode)****

'****************************************************************
'*  Name    : Contador_decimal.BAS                              *
'*  Author  : LONELY113                                         *
'*  Notice  : Copyright (c) 2011 LONELY113                      *
'*          : All Rights Reserved                               *
'*  Date    : 12/05/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : Programa para PIC16f84a                           *
'*          : Salida a display cátodo común [RB1-RB7]           *
'****************************************************************

@  __config _HS_OSC & _WDT_OFF

DEFINE OSC 10       '10 MHz
trisb=$00           'Puerto B como salida
cuenta VAR BYTE     'Contador tamaño byte
dataout VAR BYTE
cuenta=0
loop1:
    cuenta=cuenta+1
    IF cuenta=10 THEN cuenta=0 'Cuenta de 0 a 9
    PAUSE 1000                 'Retardo de 1 segundo
    LOOKUP cuenta,[$7E,$0C,$B6,$9E,$CC,$DA,$FA,$0E,$FE,$DE,$EE,$F8,$72,$BC,$F2,$E2],dataout
    'Conversión Hexadecimal a 7 segmentos
    portb=dataout ' Envio a Puerto B
GOTO loop1
END


Archivos .ASM y .HEX

Selección de Código binario y Visualización

Programa para PIC16F84A

Monitorea la entrada de un código binario (4 bits) y muestra la selección en BCD mediante 4 leds y en decimal mediante un display.

-Aplicación de Tabla de datos para conversión Hexadecimal a 7 segmentos

Diagrama de conexión:



Prueba:

 

Programa en Assembler:

;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa que muestra codigo seleccionado en binario
;en un display catodo comun de 7 segmentos
;Entradas: Puerto A (Pines RA0-RA3)
;Salidas: Puerto B (Pines RB1-RB7)
;---------------------------------------------------------

include "p16f84a.inc"
list P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

 org 0x00  ; Inicio de Programa
 bsf STATUS,5 ; Inicio configuracion E/S
 movlw 0x0F  ; b'00001111'
 movwf PORTA  ; RA0-RA3 como entradas
 clrf PORTB  ; Puerto B como salida
 bcf STATUS,5 ; Fin configuracion E/s
BEGIN: movf PORTA,0  ; Mueve PORTA a W
 call CONV  ; Llama a subrutina CONV
 movwf PORTB  ; Mueve W a PORTB
 goto BEGIN  ; Bucle infinito

;Subrutinas
CONV addwf PCL  ; Conversion hexadecimal a 7 segmentos
 retlw 0x7E  ; 0
 retlw 0x0C  ; 1
 retlw 0xB6  ; 2
 retlw 0x9E  ; 3
 retlw 0xCC  ; 4
 retlw 0xDA  ; 5
 retlw 0xFA  ; 6
 retlw 0x0E  ; 7
 retlw 0xFE  ; 8
 retlw 0xDE  ; 9  
 retlw 0xEE  ; A
 retlw 0xF8  ; B
 retlw 0x72  ; C
 retlw 0xBC  ; D
 retlw 0xF2  ; E
 retlw 0xE2  ; F
 end   ; Fin de programa


****Programa en Pic Basic (Microcode)****


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : LONELY113                                         *
'*  Notice  : Copyright (c) 2011 LONELY113                      *
'*          : All Rights Reserved                               *
'*  Date    : 12/05/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : PIC16F84a                                         *
'*          : Entradas de selección hexadecimal RA3-RA0         *
'*          : Display cátodo común en RB7-RB0                   *
'****************************************************************

@  __config _HS_OSC & _WDT_OFF
DEFINE OSC 10    '10 MHz
trisa=%01111     'RA3-RA0 como entradas
trisb=$00        'PORTB como salida
datain VAR BYTE  
dataout VAR BYTE
loop1:
    datain=porta 'Seleción en Hexadecimal
    LOOKUP datain,[$7E,$0C,$B6,$9E,$CC,$DA,$FA,$0E,$FE,$DE,$EE,$F8,$72,$BC,$F2,$E2],dataout
    'Conversión Hexadecimal a 7 segmentos
    portb=dataout 'A display
GOTO loop1
END



Archivos .ASM y .HEX

Luz Secuencial

Programa para PIC16F84A

Desplaza una luz en el Puerto B de derecha a izquierda y de izquierda a derecha.

-Comandos de rotación RRF y RLF
-Subrutina de retardo

Esquema de conexión:


Prueba:

 

Programa en Assembler:

;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa para iluminar leds secuencuencialmente
;La luz se desplaza de RB0 a RB7 y viceversa 
;Salidas: PUERTOB
;---------------------------------------------------------
include "p16f84a.inc"
list P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

COUNT1 equ 0x0C
COUNT2 equ 0x0D
COUNT3 equ 0x0E
TIMES equ 0x0F

 org 0x00  ; Inicio de programa
 bsf STATUS,5 ; Inicio de configuracion E/S
 clrf PORTA
 clrf PORTB  ; Puerto B como salida
 bcf STATUS,5 ; Fin configuracion E/S
 clrf PORTB
 bcf STATUS,0
 bsf PORTB,0  ; PORTB=00000001
 call DELAY  ; Llamada a subrutina DELAY
BEGIN: movlw 0x07
 movwf TIMES
LEFT: rlf PORTB,1  ; Rota 7 veces a la izquierda
 call DELAY
 decfsz TIMES
 goto LEFT
 movlw 0x07
 movwf TIMES
RIGHT: rrf PORTB,1  ; Rota 7 veces a la derecha
 call DELAY
 decfsz TIMES
 goto RIGHT
 goto BEGIN  ; Bucle infinito

;Subrutinas

DELAY movlw 0xFF  ; Subrutina de retardo
 movwf COUNT1  ; 256x256=65536 cuentas
 movwf COUNT2
 movlw 0x20
 movwf COUNT3
LOOP: decfsz COUNT1,1 ; Decrementa COUNT1
 goto LOOP  ; Salta si COUNT1=0
 movlw 0xFF  
 movwf COUNT1  ; COUNT1=FF
 decfsz COUNT2,1 ; Decrementa COUNT2
 goto LOOP  ; Salta se COUNT2=0
 movlw 0xFF
 movwf COUNT1
 movwf COUNT2
 decfsz COUNT3,1
 goto  LOOP
 return   ; Retorno de subrutina

 end   ; Fin de programa

****Programa en Pic Basic (Microcode)****


'****************************************************************
'*  Name    : Secuencial.BAS                                    *
'*  Author  : LONELY113                                         *
'*  Notice  : Copyright (c) 2011 LONELY113]                     *
'*          : All Rights Reserved                               *
'*  Date    : 12/05/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : PIC16F84a                                         *
'*          : Leds en Puerto B                                  *
'****************************************************************

@  __config _HS_OSC & _WDT_OFF

DEFINE OSC 10 '10 MHz

i VAR BYTE
trisb=$00     'Puerto B como salida

loop1:
  portb=$01   'PORTB=00000001
  PAUSE 1000  'Retardo de 1 segundo
 FOR i = 1 TO 7
  portb=portb<<1 'Desplazar a la izquierda 7 veces
  PAUSE 1000     'Retardo de 1 segundo
 NEXT i
 FOR i = 1 TO 7  'Desplazar a la derecha 7 veces
  portb=portb>>1
  PAUSE 1000     'Retardo de 1 segundo
 NEXT i
GOTO loop1
END



Archivos .ASM y .HEX:

Tutorial de programacion PIC16F84A