Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
'****************************************************************
'* 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
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
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