El programa:
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_EJEMPLO_23_1
'Descripcion: Generando numeros aleatorios con el Timer0, Dado Electronico
'Micro: PIC16F88 / 8mhz reloj interno
'Fecha/Autor: 22-25/7/07, By COS, PSI v7.41
'Version: 1.1
'Usando Function y Proc
'Se calcula el numero mediante una Funcion.
'El primer numero de entrada de la funcion es el numero maximo y
'el segundo numero de la funcion es el numero minimo.
'nueva rutina para el control de los led mediante Proc.
'Version: 1.0
'Calcula numero aleatorio
'**************************************************************************************
Define CONFIG = 0x2f50 'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc 'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8 'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1 'Activar para simulación
'Puertos del LCD---------------------------------------------
Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'el bus de datos sera el puerto A
Define LCD_DBIT = 0 'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7 'se usara el RB7 como RS
Define LCD_EREG = PORTB 'el bit de control E sera del puerto B
Define LCD_EBIT = 6 'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000 'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'Definicion de puertos------------------------------------------
ANSEL = %00010000 'Los pin I/O digitales y RA4 analogico
CMCON = 0x07 'Comparador a off
OSCCON = 0x7e 'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff 'Puerto A como entradas
TRISB = 0xff 'Puerto B como entradas
'TRISA.4 = 1 'Como entrada (RA4, adc)
'TRISA.6 = 1 'Como entrada (RA6, tecla S1)
'TRISA.5 = 1 'Como entrada (RA5, tecla S2)
TRISB.3 = 0 'Como salida RB3
TRISA.7 = 0 'Como salida RA7
TRISB.0 = 0 'Como salida RB0
PORTB.3 = 1 'Luz lcd a on (RB3)
PORTA.7 = 1 'Led amarillo a off (RA7), negado
PORTB.0 = 1 'Led verde a off (RB0), negado
'-----------------------------------------------------------------
Lcdinit 'Inicializa el LCD sin cursor.
'Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7 'led amarillo
Symbol led_verde = PORTB.0 'led verde
Symbol luz_lcd = PORTB.3 'retroiluminacion del lcd
Symbol s1 = RA6 'tecla S1
Symbol s2 = RA5 'tecla S2
'Variables generales-----------------------------------------------
Dim n_random As Byte 'contendra el numero deseado
'------------------------------------------------------------------
WaitMs 500 'Espera medio segundo
Lcdout "Pulse una Tecla" 'Imprime en el lcd
Call led(_off, _off) 'Inicializa los led a off
n_random = random(0, 0) 'Inicializa random (timer0)
'Rutinas principal ------------------------------------------------
main: 'Comienza el programa principal
If s1 = 0 Then 'Si la tecla es pulsada
While s1 = 0 'Espera mientras esta pulsada la tecla
Wend
Call led(_on, _nc) 'Ilumina led_amarillo, no modifica led verde
n_random = random(6, 1) 'Funcion que genera numero aleatorio
Lcdcmdout LcdLine2Home 'Cursor del lcd al principio linea 2
Lcdout "El Numero: ", #n_random, " " 'Imprime la plantilla y el resultado en el lcd
WaitMs 300 'Espera 0.3 segundos
Call led(_off, _nc) 'Apaga led_amarillo, no modifica led verde
Endif
Goto main 'Impide que termine la rutina principal
End
'Calcula numeros aleatoriios, n_max = numero maximo y n_min = numero minimo
Const _on = 0 'Led encendido
Const _off = 1 'Led apagado
Const _nc = 2 'No cambia
Function random(n_max As Byte, n_min As Byte) As Byte
OPTION_REG.T0CS = 0 'Selecciona reloj interno
n_max = (n_max + 1) - n_min 'Arregla el numero maximo
random = (TMR0 Mod n_max) + n_min 'Siendo n_max el numero maximo y + n_min valor minimo
End Function
'Controla el estado de los led, call (x,x)
Proc led(amarillo As Byte, verde As Byte)
If amarillo = 0 Then RA7 = 0 'Led amarillo a on
If amarillo = 1 Then RA7 = 1 'Led amarillo a off
If verde = 0 Then RB0 = 0 'Led verde a on
If verde = 1 Then RB0 = 1 'Led verde a off
End Proc