Gracias por tu pronta respuesta , Lord
Esto es lo que quiero correr en el 16F628 que funciona bien en el 16F84.
Estan definidas para cuatro modos pero solo esta el programa para modo 1.
El programa lo que hace es seleccionar unidades , decenas , centenas y unidad de mil (4 digitos) Ej 0386 milisegundos , esperar este tiempo y activar una salida.
'MODO 1 EN mS 9999
'DEFINICION DE PINES
'PORTB.4 = SALIDA SONORA BEEP
'PORTB.5 = DIGITO
'PORTB.6 = POSICION U, D , C ,UM. MODO MODO1 , ... MODO4.
'PORTB.7 = START
'PORTB.2 = ENTRADA
'PORTA.0-4 = LCD
'PORTB.3 = LCD
define LCD_BITS 4
define LCD_LINES 2
U VAR BYTE ;unidad modo 1
D VAR BYTE ;decena 1
C VAR BYTE ;centena 1
UM VAR BYTE ; unidad de mil 1 9999 ms.total 10.000 ms = 10 seg.
co VAR BYTE ; variable selecciona numero , unid dec cent um .
cur VAR BYTE 'VARIABLE SELECCIONA MODO1.
ST var byte
mode var byte
t1 var word
w0 var word
U = 0 : D = 0 : c = 0 : UM = 0
co = 0 : cur = 0
PAUSE 500
lcdout $fe,1,"Melectro" , $fe,$c0 ," 2006 "
PAUSE 1500
Lcdout $fe, 1 , " Modo 1 "
'lcdinit: Lcdout $fe, 1 , "Seleccio", $fe,$c0 ,"ne Modo"
pause 1000
if portb.6 = 0 then ; SELECCIONA MODO
select case mode
mode = mode + 1
if mode > 4 then mode = 1
case 1 call modo1
case 2 call modo2
case 3 call modo3
case 4 call modo4
end select
endif
'if portb.4 = 1 then lcdinit
; ****************** MODO 1 ***************************
'MODO 1 EN mS 9999
modo1:
curs: cur = cur + 1
if cur > 4 then cur = 1
'lcdout $fe,1,"cur = ",#cur
;pause 500
if cur = 1 then call inicio_u
if cur = 2 then call inicio_d
if cur = 3 then call inicio_c
if cur = 4 then call inicio_um
goto curs
return
INICIO_U:
Lcdout $fe,1,"M1 Unid",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
pause 250
if portb.7 = 0 then call start
if portb.6 = 0 then call curs
IF PORTB.5 = 0 AND cur = 1 THEN
'Pause 250
U = U + 1
IF U > 9 THEN U = 0
endif
GOTO INICIO_U
RETURN
INICIO_D:
Lcdout $fe,1,"Dec",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
pause 250
if portb.7 = 0 then call start
if portb.6 = 0 then call curs
IF PORTB.5 = 0 AND cur = 2 THEN
;call start
'Pause 250
D = D + 1
IF D > 9 THEN D = 0
endif
GOTO INICIO_D
RETURN
INICIO_C:
Lcdout $fe,1,"cen",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
pause 250
if portb.7 = 0 then call start
if portb.6 = 0 then call curs
IF PORTB.5 = 0 AND cur = 3 THEN
;call start
'Pause 250
C = C + 1
IF C > 9 THEN C = 0
endif
GOTO INICIO_C
RETURN
INICIO_UM:
Lcdout $fe,1,"Umil",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
pause 250
if portb.7 = 0 then call start
if portb.6 = 0 then call curs
IF PORTB.5 = 0 AND cur = 4 THEN
'Pause 250
Um = Um + 1
IF Um > 9 THEN Um = 0
endif
GOTO INICIO_Um
RETURN
start: 'pause 500
lcdout $fe,1," ",#UM,#C,#D,#U ," MS"
pause 100
pulsin portb.2,0,w0
if w0 <> 0 then disparo
goto start
disparo: low portb.4
T1 = (UM*1000+c*100+d*10+u)
'lcdout $fe,1," ", #T1 , " ms"
pause T1
high portb.4
pause 100
low portb.4
'pause 1000
'low portb.4
return