Está en la página 1de 14

LENGUAJE C Muy bien, ya mas o menos sabesmos com controlar un motor a pasos, haciedno que llegue hasta cierto

numero de vuletas pasos o grados, pues para no seguir con mas ejmeplos de esto ahora pasaremos a los displays y despues de esto haremos un elvevador con un motor a pasos y un display para que indique en que piso estamos. Programas para contar de 0 a 9 en un display (2) a)
////////////////////////////////////////////////////////////////////// //////////////////// //Aqui tenemnos un programa que muestra por medio de un display // //conmectado al puerto B el conteo de 0 a 9 ascendentemente y // //conestado al pin A2 tenemos un boton con resistencia pull up para // //al presionarlo empiece a contar descendentemente.// ////////////////////////////////////////////////////////////////////// /////////////////// #include <18F452.h> //Lo de siempre. #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000, RESTART_WDT) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) #build (reset=0x200) //Esto se queita si no van a usar el bootloader, de lo contrario se deja ya esta explicado. #build (interrupt=0X208) #ORG 0X0000, 0X01FF void BOOTLOADER() { #ASM NOP #ENDASM } #byte #byte #byte #byte #byte PORTA= PORTB= PORTC= PORTD= PORTE= 0XF80 0XF81 0XF82 0XF83 0XF84

void main() { unsigned char const disp[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //Declaracion de vector para display de catodo comun., una breve explicaicion para sacar cada vector de los displays es muy parecida a como declarar los puertos si como salidas o como entradas, en caso de que se quieran usar displays matriciales es algo diferente, no me metere pro ahora, creo que cuando llegue al teclado matricial se entendera mejor. signed char i = 0; //inicializar la variable del vector en 0, es otra manera de nombrar variables de tipo entero

set_tris_B(0x00); portB = 0; while(1) {

//Puerto B como salida //limpiamos el puerto b.

if(input(PIN_A2)) //Si no se presiona A2 suma 1 al vector o recorre uno al vector. (Tenemos un boton en A2 como pull up) i++; else //Si se presiona lo resta. i--; if (i < 0) //Creo que es muy logico, es para que solo llegue hasta 0 y regrese a 9. i = 9; if (i > 9) // aqui es solo para que llegue a 9 y se regrese a o i = 0; portb = disp[i]; //Sacar la variable i por el puerto B quiere decir que i toma el valor de cada uno de los vectores declarados. delay_ms(500); //Retardo entre cambios. medio segundo.

A continuacion haremos uno que cuente de 0 a 99, obvio con 2 diplays todo pro el puertoB. En el ejemplo anterior que usamos el puerto b, solo conectamos al microcontrolador, de las patitas B0 a B6, que son las 7 de los 7 segmentos, ahora conectaremos todo el puerto B para hacer que los dos displays se "multiplexen" usando 2 transistores uno tipo pnp y otro tipo npn, estos haran el multiplexeo., pondre el diagrama para que se entienda mejor.

y el programa es: Cdigo:

y el programa es: Cdigo:


#include <18F4520.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) #build (reset=0x200) #build (interrupt=0X208) #ORG 0X0000, 0X01FF void BOOTLOADER() { #ASM NOP #ENDASM } #byte #byte #byte #byte #byte PORTA= PORTB= PORTC= PORTD= PORTE= 0XF80 0XF81 0XF82 0XF83 0XF84

void main() { int i,j,x; //Declaracion de variables int const disp[10] = {0xC0, 0xF9, 0xA4, 0xB0, declaran como constantes 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //Codigo Hexa para cada nuemro Inverso set_tris_B(0x00); portB = 0; while(TRUE) { for(i=0;i<=9;++i) terminaron de contar las decenas. { for(j=0;j<=9;++j) termianron de contar las unidades. //Ciclo que indica cuando //Ciclo que indica cuando

//Se

for(x=0;x<=10;++x) //Este ciclo sirve para no ver los parpadeos de los diplay en el multiplexado. { { portb=disp [i]+0x80; //Aqui sucede el multiplexado, al sumarle al resultado 1000 0000, para hacer que //prenda D7 instantaneamente por el delay indicado. delay_ms(10); portb=disp[j]; //Aqui esta sacando las unidades multiplexadas ya anteriormente por i. delay_ms(10); } } } } }

LENGUAJE ENSAMBLADOR

Contador de 0 a 99 con pulsadores


El contador es de 0 a 99 usando la tecnica de la multiplexion, tiene un pulsador para la cuenta ascendente y otro para la cuenta descendente. IMPORTANTE recomiendo comparar este codigo con el que no tiene pulsadores.

y el codigo fuente LIST P=16F886 INCLUDE P16F886.INC ERRORLEVEL -302 __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF CBLOCK 0X20 PDel0, PDel1, DECENAS, UNIDADES ENDC

ORG 00 GOTO CONFIGURA

RET_10MS movlw .8 ; 1 set number of repetitions (B) movwf PDel0 ; 1 | PLoop1 movlw .249 ; 1 set number of repetitions (A) movwf PDel1 ; 1 | PLoop2 clrwdt ; 1 clear watchdog

clrwdt ; 1 cycle delay decfsz PDel1, 1 ; 1 + (1) is the time over? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) is the time over? (B) goto PLoop1 ; 2 no, loop PDelL1 goto PDelL2 ; 2 cycles delay PDelL2 clrwdt ; 1 cycle delay return ; 2+2 Done

TABLA ADDWF PCL,F RETLW B'00111111' RETLW B'00000110' RETLW B'01011011' RETLW B'01001111' RETLW B'01100110' RETLW B'01101101' RETLW B'01111100' RETLW B'00000111' RETLW B'01111111' RETLW B'01101111' 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 CLRF ANSELH

BANKSEL TRISB MOVLW B'01101100' MOVWF OSCCON MOVLW B'00000011' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB MOVLW B'00000000' MOVWF TRISC BANKSEL PORTB ;paso al banco 0 CLRF PORTB CLRF DECENAS CLRF UNIDADES INICIO CALL MOSTRAR BTFSC PORTA,0 GOTO UP BTFSC PORTA,1 GOTO DOWN GOTO INICIO

UP CALL VER INCF UNIDADES,F MOVLW .10 XORWF UNIDADES,W BTFSC STATUS,Z GOTO INC_DECENAS CALL MOSTRAR GOTO INICIO INC_DECENAS CLRF UNIDADES INCF DECENAS,F MOVLW .10 XORWF DECENAS,W BTFSC STATUS,Z CLRF DECENAS CALL MOSTRAR GOTO INICIO DOWN CALL VER DECF UNIDADES,F MOVLW .255 XORWF UNIDADES,W BTFSC STATUS,Z GOTO DEC_DECENAS CALL MOSTRAR GOTO INICIO

DEC_DECENAS MOVLW .9 MOVWF UNIDADES DECF DECENAS,F MOVLW .255 XORWF DECENAS,W BTFSS STATUS,Z GOTO INICIO MOVLW .9 MOVWF DECENAS CALL MOSTRAR GOTO INICIO END

LENGUAJE ENSAMBLADOR 16F84A

Hola pues necesito su ayuda tengo que hacer un contador de 0 a 99 con el pic16f84a visualizado en dos displays programando en mplab, me podrian ayudar diciendome que me falta, hasta el momento solo pude hacer que cuente de 0 - 9 este es el codigo que tengo hasta ahorita: ojala me puedan ayudar Gracias LIST P=16F84A #INCLUDE P16F84A.INC #DEFINE BANCO_0 BCF STATUS,5 #DEFINE BANCO_1 BSF STATUS,5 CONT EQU 0XC ORG 0H GOTO INICIO ORG 5H INICIO SALIDAS. BSF PORTA,4 ; LNEA DEL PULSADOR CONFIGURADA COMO ENTRADA. BANCO_0 ; ACCESO AL BANCO 0. CALL VISUALIZA ARRIBA BTFSC PORTA,4 ; PULSADOR PRESIONADO?, (PULSADOR)=0? GOTO PULSO ; NO. VUELVE A LEERLO. BTFSC PORTA,4 ; COMPRUEBA SI ES UN REBOTE. GOTO PULSO ; ERA UN REBOTE Y SALE FUERA. CALL INCREMENTO ; INCREMENTA EL CONTADOR Y LO VISUALIZA. NO_PULSO BTFSS PORTA,4 ; DEJ DE PULSAR?. (PULSADOR)=1? GOTO NO_PULSO ; NO. ESPERA QUE DEJE DE PULSAR. PULSO GOTO ARRIBA INCREMENTO INCF CONT,F ; INCREMENTA EL CONTADOR Y COMPRUEBA SI HA MOVLW .15 ; LLEGADO A SU VALOR MXIMO MEDIANTE UNA SUBWF CONT,W ; RESTA. (W)=(CONTADOR)-10. BTFSC STATUS,C ; C=0?, (W) NEGATIVO?, (CONTADOR)<10? CLRF CONT ; NO, ERA IGUAL O MAYOR. POR TANTO, RESETEA. VISUALIZA MOVF CONT,W CALL DISPLAY ; LO PASA A SIETE SEGMENTO PARA PODER SER MOVWF PORTB ; VISUALIZADO EN EL DISPLAY. RETURN DISPLAY ADDWF PCL,F ;HACE SALTAR EL PROG. AL LUGAR BANCO_1 CLRF PORTB ; ESTAS LNEAS CONFIGURADAS COMO

PERTINENTE DE LA TABLA RETLW 0X3F W Y RETORNA RETLW 0X06 W Y RETORNA RETLW 0X5B W Y RETORNA RETLW 0X4F W Y RETORNA RETLW 0X66 W Y RETORNA RETLW 0X6D EN W Y RETORNA RETLW 0X7D EN W Y RETORNA RETLW 0X07 W Y RETORNA RETLW 0X7F W Y RETORNA RETLW 0X67 CLRF CONT RETLW 0X3F EN W Y RETORNA RETURN END ; FIN DEL PROGRAMA.

;TOMA EL CARACTER "0" EN ;TOMA EL CARACTER "1" EN ;TOMA EL CARACTER "2" EN ;TOMA EL CARACTER "3" EN ;TOMA EL CARACTER "4" EN ;TOMA EL CARACTER "5" ;TOMA EL CARACTER "6" ;TOMA EL CARACTER "7" EN ;TOMA EL CARACTER "8" EN

;TOMA EL CARACTER "9"

LENGUAJE ENSAMBLADOR

Contador de 0 a 99 con PIC


Actualizado 21 de junio de 2012 22:48 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. VIDEO DE LA IMPLEMENTACION

CODIGO FUENTE PARA EL PIC LIST P=16F883 INCLUDE P16F883.INC ERRORLEVEL -302 __CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_ON & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC __CONFIG _CONFIG2, _WRT_OFF CBLOCK 0X20 PDel0, PDel1, DECENAS, UNIDADES ENDC

ORG 00 GOTO CONFIGURA ;------------------------------------------------------------; Code generated by PDEL ver 1.0 on 14/10/2010 at 03:01:16 p.m. ; Description: Waits 10000 cycles ;------------------------------------------------------------RET_10MS movlw .8 ; 1 set number of repetitions (B) movwf PDel0 ; 1 | PLoop1 movlw .249 ; 1 set number of repetitions (A) movwf PDel1 ; 1 | PLoop2 clrwdt ; 1 clear watchdog clrwdt ; 1 cycle delay decfsz PDel1, 1 ; 1 + (1) is the time over? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) is the time over? (B) goto PLoop1 ; 2 no, loop PDelL1 goto PDelL2 ; 2 cycles delay PDelL2 clrwdt ; 1 cycle delay

return ; 2+2 Done ;------------------------------------------------------------TABLA ADDWF PCL,F RETLW B'00111111' RETLW B'00000110' RETLW B'01011011' RETLW B'01001111' RETLW B'01100110' RETLW B'01101101' RETLW B'01111100' RETLW B'00000111' RETLW B'01111111' RETLW B'01101111' 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 CLRF PORTB CLRF DECENAS CLRF UNIDADES

;paso al banco 0

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 INC_DECENAS CLRF UNIDADES INCF DECENAS,F MOVLW .10 XORWF DECENAS,W BTFSC STATUS,Z CLRF DECENAS CALL VER GOTO CICLO END

Circuito de la implementacin

También podría gustarte