Curso de programación de PIC en PICBasic Pro

ya estas amigo..

bueno como puedo sacar la lista de estos componentes en proteus con todos sus especificaciones, por ejemplo los capacitores el voltaje qe debe ser...para poder ir y comprarlos en la electronica....o me puedas pasar la lista....
 
Busca en el menu una opcion que dice bill of Materials
- Los capacitores con voltaje mayor a 12v
-las resistencias en 1/4 o 1/8 de vatio o no importa si es mayor...
-los capacitores con nF pF son ceramicos y los de uF son electroliticos
 
gracias amigo por ayudarme en todo esto....eres buena onda...

te puedo mandar un circuito a tu correo q aparece..para ver si me lo puedes revisar y decir si esta bien o ay qe hacer correcciones??? puedes agregarle las correcciones y agregarle una fuente de voltaje de 12V a 5V, asi como me ayudaste con este pasado....
 
te envio el circuito q te comente...espero me puedas ayudar a revisarlo y mejorarlo-.--..

le puedes agregar un regulador de voltaje de 12v a 5v

saludos
 

Adjuntos

  • PIC16F877A.rar
    68.4 KB · Visitas: 307
Que tal con todos, estuve leyendo acerca del timer1, y me surgio la idea de hacer un tacometro usando este timer en modo contador.
Le pregunte a mi profesor y me dijo que si, pero que debía calcular los ciclos de maquina y hay me mato.
Estuve leyendo acerca de esto y calcule que el ciclo de maquina con cristal de 20MHz es igual a 0.05 micro segundos.
Pero mi problema esta en como usar todo esto en una programación de un tacometro. Si me podrían explicar como hacer estos cálculos o como usarlos para sacra la equivalencia en rpm.
Gracias por su ayuda de antemano:)

perdon para sacar la equivalencia en rpm
 
Última edición:
Hola a todos, quisiera pedirles una ayuda con una duda que tengo pero aun no tengo muy claro como resolverla, me compre un par de servomotores y les quite el potenciometro y aparte el tapón que lleva el engranaje para trucarlos a 360 grados, mi duda es si se pueden configurar para manejar las velocidades del servomotor con el circuito de control que ellos traen?
 
autotronico
yo tb realise un proyecto con matrices de led solo q yo solo utilise dos matrices y con el pic 16f877 y me funciono.
una consulta cuales son los codigos para hacer con mas matrices de led haber si m das una ayuda m trave en esa parte.
 
que tal amigos espero me puedan ayudar con este circuito qe debe ser intermitente, pero no me sale el efecto, lo estoy simulando en proteus..

les agrego el archivo en proteus..

espero me puedan ayudar....selos agradeceria mucho
 

Adjuntos

  • Intermitente.rar
    6.3 KB · Visitas: 128
hola amigos! tengo un codigo echo en MicroCode Studio de una cerradura electronica con pic 16f877a y lcd 2x16. no tengo conocimientos de programación pero mirando un tutorial del programa fui editando unas cuantas cosas que quería lograr. ahora me quede trabado en la ultima, el programa no tiene la salida para encender el led del lcd. me gustaría si alguien puede que me diga que tengo que hacer para que encienda cuando hay actividad en los pulsadores ej. si no se esta pulsando nada que este apagado, ahora cuando se toca algún pulsador que encienda y que quede prendido. cuando pasa un minuto sin pulsar nada que se apague. es posible esto?? yo estaba tratando de usar la salida portc.7 pero la usa para otra cosa
dejo el codigo si alguien puede darme una mano se lo agradezco. aludosss

Código:
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Luis Perez *
'* Notice : Copyright (c) 2010 IB-electronic *
'* : All Rights Reserved *
'* Date : 06/10/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
@ device pic16f877a, wdt_off, lvp_off,xt_osc,xt_osc
define osc 4
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4 
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 0 
DEFINE LCD_RWREG PORTD 
DEFINE LCD_RWBIT 1
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 2

cmcon=7
TRISA=0:porta=0
trisb=%11111000:portb=0
trisc=%11111100
trisd=0:portb=0
trise=0:porte=0

Numero var byte
nu1 var byte
nu2 var byte
nu3 var byte
nu4 var byte
R var byte
x var byte
x=0

PARLAN VAR PORTC.0
LED VAR PORTC.1
PUERTA VAR PORTC.2
PC var portc.3
PA var portc.7

F1 VAR PORTB.0
F2 VAR PORTB.1
F3 VAR PORTB.2
F4 VAR PORTB.3

C1 VAR PORTB.4
C2 VAR PORTB.5
C3 VAR PORTB.6
C4 VAR PORTB.7

Car1 var byte
Car2 var byte
Car3 var byte
Car4 var byte
dato var byte

Pre: 
lcdout $FE,1:LCDout $FE,$80,"Llave electronic"
pause 500
lcdout $Fe,$C0,"ib-electronic"

INICIO:
HIGH LED : SOUND parlan,[100,50]:high parlan
LOW LED : LOW parlan

'*********************************************
'Claves por defecto=1234:
'*********************************************
eeprom 0,[1,2,3,4]
RESET:
read 0,car1
read 1,car2
read 2,car3
read 3,car4


goto TEcla1


TEcla1:
lcdout $fe,1
lcdout $FE,$80,"Clave:"

gosub teclado: lcdout $fe,$c0,"X" :gosub pid
gosub espacio
nu1=numero
if numero=car1 then TEcla2
goto false

TEcla2:
gosub teclado : lcdout $fe,$c0,"XX" : gosub pid
gosub espacio
nu2=numero
if numero=car2 then TEcla3
goto false1

Tecla3:
Gosub Teclado : lcdout $fe,$c0,"XXX" : gosub pid
gosub espacio
nu3=numero
if numero=car3 then Tecla4
goto false2

TEcla4:
gosub teclado : lcdout $fe,$c0,"XXXX" : gosub pid
gosub espacio
nu4=numero
if numero=car4 then compara
goto false3

Compara:
if (nu1=car1) and (nu2=car2) and (nu3=car3) and (nu4=car4) then open
goto false3

PID:
SOUND parlan,[100,10] : high led
pause 300
low parlan :low led
return

Espacio:
pause 300
return

False:
goto tecla2

False1:
goto tecla3

False2:
goto tecla4

False3:
lcdout $fe,1
lcdout $FE,$80,"Clave:"
lcdout $FE,$C0,"incorrecta"

for r= 1 to 20
high led : SOUND parlan,[100,10] : high pc
pause 50
low led : SOUND parlan,[50,10] : low pc
pause 50
next

high pc
pause 2000
low pc
goto tecla1

OPen:
lcdout $fe,1
lcdout $FE,$80,"Clave:"
lcdout $FE,$C0,"Correcta"

for r=0 to 2
high led:SOUND parlan,[100,10];high parlan
pause 100
low led :SOUND parlan,[50,10];low parlan
pause 100
next

Menu:
lcdout $fe,1
lcdout $fe,$80,"Bienvenido"
lcdout $fe,$C0,"RAS"
pause 1000
lcdout $fe,1
lcdout $fe,$80,"Menu"
lcdout $fe,$c0,"1-Open 2-Clave"

Op:
gosub teclado
if numero=1 then door
if numero=2 then graba1
goto op

Door:
lcdout $fe,1
lcdout $fe,$80,"Puerta"
lcdout $fe,$C5,"Abierta"

high puerta :high pa
pause 5000
low pa :low puerta
goto tecla1


Graba1:

lcdout $fe,1 
lcdout $fe,$80,"Cambiar Clave" 
lcdout $fe,$c0,"----" 

high led : SOUND parlan,[100,300] : pause 1000 : low led : low parlan
gosub teclado:gosub PID 

lcdout $fe,$c0,"X--" 

write 0,numero
pause 300

Graba2:
gosub teclado:gosub PID

lcdout $fe,$c0,"XX--" 

write 1,numero
pause 300

Graba3:
gosub teclado:gosub pid

lcdout $fe,$c0,"XXX-" 

Write 2,numero
pause 300

Graba4:
gosub teclado:gosub pid

lcdout $fe,$c0,"XXXX"

write 3,numero
pause 300

lcdout $fe,1 
lcdout $fe,$80,"Clave guardada" 
lcdout $fe,$c0,"xxxx" 

for r = 0 to 5
SOUND parlan,[100,10] : high led
pause 100
SOUND parlan,[50,10] : low led
pause 100
next
goto RESET

Teclado:
low f1
if c1=0 then numero=7:return
if c2=0 then numero=8:return
if c3=0 then numero=9:return
high f1

low f2
if c1=0 then numero=4:return
if c2=0 then numero=5:return
if c3=0 then numero=6:return
high f2

low f3
if c1=0 then numero=1:return
if c2=0 then numero=2:return
if c3=0 then numero=3:return
high f3

low f4
if c1=0 then numero=10:return
if c2=0 then numero=0:return
if c3=0 then numero=11:return
high f4

pause 10
GOTO teclado

end
 
aqui les dejo el codigo del control de un servomotor con encoder de un canal
se utiliza el Timer 0 como contador (RA4), la posicion se envia por el puerto serie (USART),
las velocidades se controlan con HPWM, ccp1 y ccp2 para cada sentido de giro
desarrolle una pequenia rutina para enviarle un numero mayor al 255 (buffer de 1 byte), lo que hace es interpretar el caracter que llego y asignarle una cantidad. sigue el PID e I2C

Amigo AUTOTRONICO gracias por todos tus aportes, en lo que te pueda ayudar con la comunicacion serial...

aqui les dejo el codigo del micro, regresando de semana santa les subo un ejemplo de un programa en VB6 para enviarle posisiones al micro, si les interesa claro?

Código:
CLEAR
INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISC = %10000001
TRISB = %00000000
CR CON 13

DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_BAUD 2400

INTCON = %11000000 ' activamos las interrupciones y las de periféricos
ON INTERRUPT GoTo serie ' Declare interrupt handler routine
PIE1.5 = 1 ' activamos la interrupción de recepción de la USART

OPTION_REG =%11100000   'TMR0 EN MODO CONTADOR

ADCON1=7                'PUERTO A DIGITAL
TRISA = %111111         'PUERTO A COMO ENTRADAS
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE CCP2_REG PORTC
DEFINE CCP2_BIT 1
DEFINE HPWM2_TIMER 2  '
DATO VAR BYTE[8]
NUM VAR BYTE[8]
I VAR BYTE

INDICE VAR BYTE
VDEC VAR BYTE
BORRAR VAR BIT
VTMR1 VAR WORD             'variable para acumular captura del timer1
CAPTURA VAR WORD
SENTIDO VAR BIT            'sentido de giro
FRENADO VAR BIT
MOV VAR BIT
FPWM VAR WORD              'frecuencia del pwm 
VEL VAR BYTE               'velocidad de gigo del motor 0-255
POS VAR WORD               'set point
ACUM VAR WORD
DESCONTAR VAR WORD
SENT2 VAR BIT
DATOACUM VAR WORD
DATOACUM=0
DATOE VAR WORD          'VARIABLE PARA CAPTURAR ENTRADA DEL RS232
DATOS VAR WORD          'VARIABLE PARA ENVIAR DATAOS POR RS232
DATOE=0
INTCON.2=0              'bandera que se activa cuando se desborda el TMR0
 
 ACUM=0
 VTMR1=0
 SENTIDO=1
 POS=0                   ' pulsos del encoder
 FRENADO=0
 FPWM=15000                'FRECUENCIA PARA HPWM
 SENT2=1
T2CON = %00000001     '
VEL=0  '125
TMR0=0                'CONTADOR A CERO
portc.5=1             'SENTIDO DE GIRO =1
BORRAR=0
CARACTER=0

MOV=1
INDICE=1

Inicio:

    IF SENT2 <> PORTC.5 THEN    'si cambia el sentido de giro contador a cero
        SENT2=PORTC.5          'ultimo sentido de giro se actualiza
        TMR0=0                 'contador a cero
    ENDIF
 IF INTCON.2=1 THEN       'se desbordo el TMR0?
    
    IF PORTC.5 = 1 THEN   'sentido=1 acumula, si no descuenta
        ACUM=ACUM+256       
    ELSE
        ACUM=ACUM-256
    ENDIF
     INTCON.2=0           'apago bandera de desbordamiento
 ENDIF
    
    if PORTC.5 = 1 then    ' aqui esta el valor real del contador
        VTMR1=ACUM + TMR0  ' contador = acumulado mas valor actual del TMR0
    else
        VTMR1=ACUM - TMR0  ' contador = acumulado menos valor actual del TMR0
    endif

    IF VTMR1> POS THEN
        IF VTMR1-POS< 40 THEN VEL=60
        PORTC.5=0
        HPWM 1, VEL, FPWM
        HPWM 2,0,FPWM
    ENDIF
    IF VTMR1< POS THEN
        IF POS-VTMR1< 40 THEN VEL=60
        PORTC.5=1
        HPWM 2, VEL, FPWM        
        HPWM 1,0,FPWM
    ENDIF
    IF vTMR1 = POS THEN 'si llegaste al set point PWM=0 y frena el motor 
        VEL=0
        goto Frenar
    ENDIF
 GOTO Inicio

Frenar:
    hpwm 2,0,FPWM    'VEL=0
    HPWM 1, 0, FPWM  'VEL=0

    IF PORTC.5=1 THEN  'lo qu esta en el TMR0 se pasa al acumulado
        ACUM=ACUM+TMR0
    ELSE
        ACUM=ACUM-TMR0
    ENDIF
    FRENADO=1
    TMR0=0
    VEL = 0
    GOTO Inicio
    
 
 serie:
 DISABLE
 
HSerin [DATOE] ' recibo el caracter de la pc por el rs232
 DATO[INDICE]=DATOE
 INDICE=INDICE+1
 
 IF DATOE=="*" THEN  ' cuando del PC llaga un "*" interpreto el numero que recibi
  BORRAR=1
 INDICE=1
 FOR I=1 TO 7
    SELECT CASE DATO[I] 'dato que recibi
        CASE 48                 ' es un cero?
            NUM[I]=0           
        CASE 49                 ' es un uno?
            NUM[I]=1
        CASE 50                 ' es un dos?
            NUM[I]=2
        CASE 51                 'creo que ya entendiero....
            NUM[I]=3
        CASE 52
            NUM[I]=4
        CASE 53
            NUM[I]=5
        CASE 54
            NUM[I]=6
        CASE 55
            NUM[I]=7
        CASE 56
            NUM[I]=8
        CASE 57                   ' es un nueve?
            NUM[I]=9
        CASE ELSE    'CUALQUIER OTRO CARACTER LO TOMA COMO CERO "O"
            NUM[I]=0
    END SELECT 
 NEXT I
 'aqui determino que numero me enviaron por el PC
 DATOACUM=NUM[7] + NUM[6]*10 + NUM[5]*100 + NUM[4]*1000 + NUM[3]*10000 +NUM[2]*100000 + NUM[1]*1000000
 
 POS=DATOACUM              'asigno la posicion
 VEL=160                         ' velocidad cte...
 TMR0=0
 ENDIF       

  hserout[DATOE]             'envio lo que recibo....nomas...
 
    INTCON = %11000000
enable    
RESUME
    
END
 
arturouc estoy en eso primero vere como puedo aplicar la comunicacion serial VB6 y luego la HID USb ya que estoy utilizando un pic de la serie 18f , te felicito por tus avances en el proyecto encoder cuando ya tenga algo mas estructurado lo posteare saludos.:LOL:
 
En esta PC no tengo visual, pero el codigo para comunicarse con el micro por el puerto serie es algo como lo siguiente:
agrego un commanbutton que en el caption diga "Abrir Puerto" y cuando presiono el boton pregunto si el puerto esta abierto, si no esta abierto lo abro con los parametros que quiero, y si esta abierto, lo cierro y lo abro con los parametros que quiero.

agrego otro commandbutton para enviar datos por el puerto serie (ejem. Nombre: cmdEnviar)
agrego un cuadro de texto (txtEnviar) para poner la posicion del servomotor
Private Sub cmdEnviar_Click()
MSComm1.Output = txtComunicacion.Text
End Sub

agrego otro cuadro de texto (este le cmbio las dimensiones, osea lo ago mas grande para mostrar todo lo que envio y recibo por el puerto serie) le cambio la propiedad Multiline=True
y ScrollBars =2 - vertical (txtComunicacion)

agrego un timmer para mostrar la comunicacion Interval=10 mS

Private Sub tmrCom_Timer()
If MSComm1.Buffercout > 0 Then
txtComunicacion.Text = txtComunicacion.Text & MSComm1.Input & vbCrLf
End If
End Sub

para el codigo que subi del servodriver en el cuadro de texto txtEnviar pongo la posicion con un "*" al final de la posicion ejem 0002600* al mandarle este valor el servodriver cuanta 2600 pulsos y se detiene...
 
RASCUESO
Aquí te mando un programa de una cerradura electr+onica en el programa pic basic con el mismo pic 16F877 solo que esta tiene un teclado 4x3

' Programa en Pic Basic Pro
Código:
Define Osc 4 ' Define el Oscilador de 4 Mhz.

TRISA = %00000000  ' Configuración de Puertos:
TRISB = %00000000
TRISD = %01111000

I VAR Byte ' Declaramos la Variable I
VAR1 VAR Byte ' Declaramos la Variable VAR1
DIRECCION VAR Byte ' Declaramos la Variable DIRECCION
DATO VAR Byte ' Declaramos la Variable DATO

Pause 200 ' Pausa de 200 milisegundos
Lcdout $fe, 1 ' Limpia la pantalla
Lcdout $fe, 2 ' Posiciona el cursor en el inicio
Lcdout "Memoria de Datos"
Lcdout $fe,$C0, "****************"
Pause 3000 ' Pausa de 3 segundos
DIRECCION = $00 ' Asignamos una dirección inicial

Inicio:
Lcdout $fe, 1 ' Limpia la pantalla
Lcdout $fe, 2 ' Posiciona el cursor en el inicio
Lcdout "Direccion: ",#DIRECCION," "
Lcdout $fe,$C0, "Dato?: "

espera1:
Call Teclado
If VAR1 = 0 Then espera1 'Si ninguna tecla fue pulsada salta a “espera1”
If VAR1 = 10 Then espera1 'Si pulsamos la tecla asterisco salta “espera1”
If VAR1 = 11 Then VAR1 = 0 'Si pulsamos la tecla “0”, entonces VAR1 = 0
If VAR1 = 12 Then espera1 ' Si pulsamos la tecla numeral salta “espera1”
Lcdout $fe,$C0, "Dato?: ",#VAR1," "
Write DIRECCION,VAR1 ' Escribe el valor en la memoria de datos
DIRECCION = DIRECCION + 1 ' Aumentamos la posición en una unidad
Pause 1000 ' Espera 1 segundo para simular un tiempo de grabación
Lcdout $fe,$C0, "Dato Almacenado"
Pause 1000 ' Espera 1 segundo para visualizar el mensaje
If DIRECCION = $0F Then Aviso ' Revisa si llegamos al límite asignado por
' el programador en la memoria de datos
GoTo inicio
Aviso:
Lcdout $fe, 1 ' Limpia la pantalla
Lcdout $fe, 2 ' Posiciona el cursor en el inicio
Lcdout " Memoria llena! "
Lcdout $fe,$C0, "****************"
Parada:
GoTo Parada
Teclado:
VAR1 = 0
PORTD.0 = 0 ' Columna 1 = 0
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 1 ' tecla "1"
If PORTD.4 = 0 Then VAR1 = 4 ' tecla "4"
If PORTD.5 = 0 Then VAR1 = 7 ' tecla "7"
If PORTD.6 = 0 Then VAR1 = 10 ' tecla "*"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 0 ' Columna 2 = 0
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 2 ' tecla "2"
If PORTD.4 = 0 Then VAR1 = 5 ' tecla "5"
If PORTD.5 = 0 Then VAR1 = 8 ' tecla "8"
If PORTD.6 = 0 Then VAR1 = 11 ' tecla "0"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 0 ' Columna 3 = 0
If PORTD.3 = 0 Then VAR1 = 3 ' tecla "3"
If PORTD.4 = 0 Then VAR1 = 6 ' tecla "6"
If PORTD.5 = 0 Then VAR1 = 9 ' tecla "9"
If PORTD.6 = 0 Then VAR1 = 12 ' tecla "#"
Return ' Retorna una línea después del llamado "Call"
EndLcdout $fe,$C0, "Dato Almacenado"
Pause 1000 ' Espera 1 segundo para visualizar el mensaje
If DIRECCION = $0F Then Aviso ' Revisa si llegamos al límite asignado por
' el programador en la memoria de datos

GoTo inicio
Aviso:
Lcdout $fe, 1 ' Limpia la pantalla
Lcdout $fe, 2 ' Posiciona el cursor en el inicio
Lcdout " Memoria llena! "
Lcdout $fe,$C0, "****************"
Parada:
GoTo Parada
Teclado:
VAR1 = 0
PORTD.0 = 0 ' Columna 1 = 0
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 1 ' tecla "1"
If PORTD.4 = 0 Then VAR1 = 4 ' tecla "4"
If PORTD.5 = 0 Then VAR1 = 7 ' tecla "7"
If PORTD.6 = 0 Then VAR1 = 10 ' tecla "*"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 0 ' Columna 2 = 0
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 2 ' tecla "2"
If PORTD.4 = 0 Then VAR1 = 5 ' tecla "5"
If PORTD.5 = 0 Then VAR1 = 8 ' tecla "8"
If PORTD.6 = 0 Then VAR1 = 11 ' tecla "0"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 0 ' Columna 3 = 0
If PORTD.3 = 0 Then VAR1 = 3 ' tecla "3"
If PORTD.4 = 0 Then VAR1 = 6 ' tecla "6"
If PORTD.5 = 0 Then VAR1 = 9 ' tecla "9"
If PORTD.6 = 0 Then VAR1 = 12 ' tecla "#"
Return ' Retorna una línea después del llamado "Call"
End

hola rascueso
ups je je hubo un problema en el anterior codigo este es el correcto hojala q t sirva d algo  
' Programa en Pic Basic Pro
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
' Configuración de Puertos:
TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
' Declaramos las variables:
X VAR Byte
VAR1 VAR Byte
DIGITO VAR Byte[7]
CLV VAR Byte[7]
' Guardamos cada digito de la clave en las posiciones elegidas previamente:
Write 10, 1 ' Primer dígito de la clave
Write 11, 2 ' Segundo dígito de la clave
Write 12, 3 ' Tercer dígito de la clave
Write 13, 4 ' Cuarto dígito de la clave
Write 14, 5 ' Quinto dígito de la clave
Write 15, 6 ' Sexto dígito de la clave
' Iniciamos el sistema con una bienvenida:
Inicio:
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut "Cont. de Acceso"
LCDOut $fe,$C0, "** Bienvenido **"
Pause 2000 ' Hacemos una pausa de 2 segundos
Call Beep ' Generamos un sonido
Clave:
X = 0 ' inicializamos la variable X = 0
Read 10, CLV[1] ' leemos el primer dígito y lo guardamos en CLV[1]
Read 11, CLV[2] ' leemos el segundo dígito y lo guardamos en CLV[2]
Read 12, CLV[3] ' leemos el tercer dígito y lo guardamos en CLV[3]
Read 13, CLV[4] ' leemos el cuarto dígito y lo guardamos en CLV[4]
Read 14, CLV[5] ' leemos el quinto dígito y lo guardamos en CLV[5]
Read 15, CLV[6] ' leemos el sexto dígito y lo guardamos en CLV[6]
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut "Introduzca su "
LCDOut $fe,$C0, "Clave de Acceso:"
Call Beep ' Generamos un sonido
Consulta:
Call Teclado ' Consultamos el teclado
If VAR1 = 0 Then consulta ' Si no hay una tecla pulsada vuelve a consultar
' Si VAR1 es diferente de cero, significa que pulsamos una tecla, por lo
' tanto generamos un sonido y continuamos…
Call Beep ' Generamos un sonido
' Seguidamente lo que hacemos es almacenar
' en seis variables definidas
' por el programador los dígitos introducidos
' desde el teclado matricial
' para luego ser comparados con los valores
' almacenados en la memoria de datos.
X = X + 1
DIGITO[X] = VAR1 ' El valor de la tecla pulsada lo
' guardamos en la variable correspondiente
If X = 6 Then comprobar ' Si X = 6 estamos guardando en DIGITO[6]
' el último valor introducido desde el
' teclado matricial
GoTo consulta ' Si X es diferente de 6 continuamos
' esperando el siguiente valor a ser
' ingresado desde el teclado
' A partir de la siguiente etiqueta empezamos la comprobación,
' y el formato es:
' Si DIGITO[X] es igual a CLV[X] el digito es correcto,
' y salta a la etiqueta “paseX”,
' si es diferente salta a la subrutina “error”; veamos…
Comprobar:
If DIGITO[1] = CLV[1] Then pase1:GoTo error
pase1:
If DIGITO[2] = CLV[2] Then pase2:GoTo error
pase2:
If DIGITO[3] = CLV[3] Then pase3:GoTo error
pase3:
If DIGITO[4] = CLV[4] Then pase4:GoTo error
pase4:
If DIGITO[5] = CLV[5] Then pase5:GoTo error
pase5:
If DIGITO[6] = CLV[6] Then correcto:GoTo error
' Si los seis dígitos han sido correctos se ejecuta la subrutina correspondiente.
Correcto:
Pause 500
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut " * * * * * * "
LCDOut $fe,$C0, "Clave Correcta!"
Call beep ' Generamos un sonido
Pause 3000 ' Pausa para visualizar el mensaje
GoTo inicio
Error:
Pause 500
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut " * * * * * * "
LCDOut $fe,$C0, " ERROR! "
Call beep ' Generamos un sonido
Call beep ' Generamos un sonido
Call beep ' Generamos un sonido
Pause 1500 ' Pausa para visualizar el mensaje
GoTo clave ' Salta a “clave” para nueva oportunidad
' La siguiente subrutina genera un “Beep” en el Buzzer
' conectado en RC0.
Beep:
High portc.0 ' Estado Lógico Alto para RC0
Pause 100 ' Pausa de 100 milisegundos
Low portc.0 ' Estado Lógico Bajo para RC0
Pause 100 ' Pausa de 100 milisegundos
Return ' Retorna una línea después del llamado "Call"
Teclado:
VAR1 = 0
PORTD.0 = 0 ' Columna 1 = 0
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 1 ' tecla "1"
If PORTD.4 = 0 Then VAR1 = 4 ' tecla "4"
If PORTD.5 = 0 Then VAR1 = 7 ' tecla "7"
If PORTD.6 = 0 Then VAR1 = 10 ' tecla "*"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 0 ' Columna 2 = 0
PORTD.2 = 1 ' Columna 3 = 1
If PORTD.3 = 0 Then VAR1 = 2 ' tecla "2"
If PORTD.4 = 0 Then VAR1 = 5 ' tecla "5"
If PORTD.5 = 0 Then VAR1 = 8 ' tecla "8"
If PORTD.6 = 0 Then VAR1 = 11 ' tecla "0"
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 1 ' Columna 2 = 1
PORTD.2 = 0 ' Columna 3 = 0
If PORTD.3 = 0 Then VAR1 = 3 ' tecla "3"
If PORTD.4 = 0 Then VAR1 = 6 ' tecla "6"
If PORTD.5 = 0 Then VAR1 = 9 ' tecla "9"
If PORTD.6 = 0 Then VAR1 = 12 ' tecla "#"
Return ' Retorna una línea después del llamado "Call"
End
 
Última edición por un moderador:
buenas, expertos en la materia en programacion necesito ayuda para programar un teclado hexadecimal pero lo quiero manejar con el puerto b y un display 7 segmento en el puerto C del pic, y en el puerto D conectar 4 leds en los bits menos significativos. apenas me inicializo en esto es apenas mi primera practica lo veo muy complejo, ya que es apenas es la primera practica y ni eh visto clase teorica estado leyendo tutorial de proton y proteus, El micro q uso es el PIC 16f877 y lo estoy programando en proton. quien tenga algo parecido o por lo menos ideas del teclado 4x4, por favor necesito ayuda de como lograrlo, :confused:
 
Última edición:
Buenas amigos alguien por favor me podría dar una idea de como programar un medidor de distancias con PICBASIC?

Se que usando el comando COUNT con una variable de peso BYTE o WORD se puede lograr pero la cosa es que tengo que hacer para medir entre distancia y tiempo? No se si alguien sabe algo respecto al tema se lo agradecería.
 
mira veras nesesito hacer desplazar letras con leds al momento de hacer girar un motor y no tengo muxa experiencia programando mas o menos esta es la idea
ya todos esos mas o menos esta la idea nose si me puedes ayudar
saludos
 
31587 perdona que no te di las gracias antes amigo. tuve unos dias complicados. no lo pude compilar todavía me tira unos errores pero ya me pongo a analizar un poco. saludoss
 
Atrás
Arriba