Implementacion de un contador de 0 a 99 con dos display de 7 segmentos y microcontrolador usando la tecnica de multiplexacion para solo usar un puerto del pic.
MOSTRAR MOVF UNIDADES,W ;cargo el valor de las unidades
CALL TABLA
BSF PORTC,5 ;activo el display unidad
BCF PORTC,4 ;desactivo el display decena
MOVWF PORTB
CALL RET_10MS
MOVF DECENAS,W ;cargo el valor de las decenas
CALL TABLA
BCF PORTC,5 ;desactivo el display unidad
BSF PORTC,4 ;activo el display decena
MOVWF PORTB
CALL RET_10MS
RETURN
VER CALL MOSTRAR
CALL MOSTRAR
CALL MOSTRAR
CALL MOSTRAR
CALL MOSTRAR
CALL MOSTRAR
CALL MOSTRAR
CALL MOSTRAR ;LOGRO UN RETARDO DE 160ms
RETURN
CONFIGURA NOP
BANKSEL ANSEL ;paso al banco 3
CLRF ANSEL ;Configura el porta como digital
CLRF ANSELH ;Configura el portb como digital
BANKSEL TRISB ;paso al banco 1
CLRF ANSEL
MOVLW 0X00
MOVWF TRISA
MOVLW 0X00
MOVWF TRISB
MOVLW 0X00
MOVWF TRISC
BANKSEL PORTB ;paso al banco 0
CLRF PORTB
CLRF DECENAS
CLRF UNIDADES
CICLO CALL VER ;Esta rutina me sirve como un
;retarde de 20ms aprox
INCF UNIDADES,F
MOVLW .10
XORWF UNIDADES,W
BTFSC STATUS,Z
GOTO INC_DECENAS
CALL VER
GOTO CICLO
Varias personas me han preguntado como poner un tope a la cuenta, es decir, como hacer que solo cuente hasta 12 o hasta 20 o hasta cualquier número entre 0 y 99, la explicación la deje en uno de los comentarios y el código con las modificaciones lo publique en GitHub:
Copyright 2012 edwtron Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o una version superior. Leer la licencia GNU gpl para mas detalles.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
Plantilla para un PIC que solo tiene 8 pines de los cuales podemos usar 6 pines, entre las diferencias con los pics que estamos acostumbrados a manejar es que el puerto es llamado GPIO y el para entradas o salidas digitales es el TRISIO. Como tiene comparadores, hay que configurar sl CMCON para que los pines finciones como digitales. Solo tiene dos bancos de memoria, es un PIC relativamente muy facil de usar.
Esta es una plantilla para trabajar con el PIC 16F883 (y toda su familia), tiene diferencias con los viejos P16F873A (y su familia) en los bits de configuración, y que ya los pines digitales y análogos no se configuran en el ADCON1, ya se configuran en el ANSEL (para el porta) y ANSELH (para el portb), y se diferencia del P16F88 en que el ANSEL esta en el banco 1 de memoria, mientras que en el P16F883 están en el banco 3 de memoria.
Hay que tener en cuenta que tienes mas diferencias, como que el P16F883 tiene oscilador interno, entre otras, pero como siempre digo, "Hay que leer el manual".
;LUGAR PARA SUBRRUTINAS
CONFIGURANOP BANKSELANSEL;paso al banco 3 CLRFANSEL;Configura el porta como digital CLRFANSELH;Configura el portb como digital BANKSELTRISB;paso al banco 1 CLRFANSEL MOVLW0X00 MOVWFTRISA MOVLW0X00 MOVWFTRISB
MOVLW 0X00
MOVWF TRISC BANKSELPORTB;paso al banco 0
;PROGRAMA PRINCIPAL
CICLO
A continuacion el codigo fuente base para un programa con microcontroladores PIC en ensamblador, seria interesante que lo guardaran para tenerlo como plantilla a la hora de sentarse a cacharriar, yo lo mantengo como plantilla.asm, y cada vez que voy a realizar un trabajo, lo copio y lo pego en un archivo nuevo en el MPLAB, y asi ahorro trabajo y evito errores.
En letras verdes voy a agregar algunos comentarios, recuerden que en el ensamblador los comentarios se colocan despues de un punto y coma " ; "
IMPORTANTE el oscilador es de tipo externo con un cristal de 4MHz
;si se trabajara con otro microcontrolador solo seria cambiar la referencia del microcontrolador y la direccion de
;memoria donde empizan los registros de proposito general.
LIST P=16F88
INCLUDE P16F88.INC
;Estas son las palabras de configuracion necesarias para este microconlador __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
;dentro de esta directiva CBLOCK se especifican las variables con las que voy a trabajar en el programa
CBLOCK 0X20
ENDC
ORG 00
GOTO CONFIGURA
;en esta parte o al final del programa puedo escribir las rutinas
;Este bloque lo uso para configurar los perofericos del microcontrolador
;primero configure todos los pines como digitales y despues cambio las X
;por unos y ceros, coloco un uno, si necesito una entrada, y un cero si lo
;que necesito es una salida.
CONFIGURA NOP BANKSEL TXSTA
CLRF ANSEL
MOVLW B'XXXXXXXX'
MOVWF TRISA
MOVLW B'XXXXXXXX'
MOVWF TRISB
BANKSEL TXREG
;Este es el bloque donde escribo el programa principal
INICIO