📄 simon_s2.bas
字号:
'****************************************************************
'* Name : Simon_s.BAS *
'* Author : Gianni *
'* Date : 04/02/07 *
'* Version : 1.0 *
'* Notes : Un clone del gioco SIMON says *
'* : when we were young *
'****************************************************************
'
' Set frequenza oscillatore
DEFINE OSC 4
' Set Debug pin port
DEFINE DEBUG_REG PORTB
' Set Debug pin bit
DEFINE DEBUG_BIT 6
' Set Debug baud rate
DEFINE DEBUG_BAUD 2400
' Set Debug mode: 0 = true, 1 = inverted
DEFINE DEBUG_MODE 1
'
@ DEVICE PIC16F84 , XT_OSC , WDT_ON , PROTECT_OFF
'
' uso PORT
'
'PortB.7 pin 13 out
'PortB.6 pin 12 out Tx
'PortB.5 pin 11 out Buzzer
'PortB.4 pin 10 in tasto 4 rigenera sequenza casuale
'PortB.3 pin 9 in tasto 3
'PortB.2 pin 8 in tasto 2
'PortB.1 pin 7 in tasto 1
'PortB.0 pin 6 in tasto 0
'
' pin 16 osc xtal
' pin 15 osc xtal
' pin 4 reset
'PortA.4 pin 3 out led3 verde
'PortA.3 pin 2 out led2 rosso
'PortA.2 pin 1 out led1 giallo
'PortA.1 pin 18 out led0 blu
'PortA.0 pin 17 out
'
'
RandW var word 'numero casuale
TmpW var word 'timeout
Pic_step var byte 'contatore sequenza proposta
Tmp1 var byte 'temporanee
Tmp2 var byte
Lpcnt var byte
Numero var byte 'numero random
Tasto var byte 'ritorna tasto premuto
User_step var byte 'contatore sequenza corretta player
Index var byte 'pointer eeprom
'
Seq_g var byte[23] 'array deposito sequenza generata
'
Flag var byte 'flag vari
Fl_tasto var Flag.0 'tasto premuto valido
Fl_user var Flag.1 'skip ritardo se tocca a user
' var Flag.2 '
' var Flag.3 '
' var Flag.4 '
' var Flag.5 '
' var Flag.6 '
' var Flag.7 '
'
'
Led3 var PortA.4 'pin 3
Led2 var PortA.3 'pin 2
Led1 var PortA.2 'pin 1
Led0 var PortA.1 'pin 18
' var PortA.0 'pin 17
'
' var PortB.7 'pin 13
'Tx var PortB.6 'pin 12 tx uart software
Buzz var PortB.5 'pin 11
Bttn5 var PortB.4 'pin 10 tasto rigenera sequenza
' var PortB.3 'pin 9 tasto 3
' var PortB.2 'pin 8 tasto 2
' var PortB.1 'pin 7 tasto 1
' var PortB.0 'pin 6 tasto 0
'
'
'---------- COSTANTI
'
Max_numeri con 23 'max numero generati limite spazio ram pic
LedON con 0 'led acceso
LedOff con 1 'led spento
Cr con 13 '
Lf con 10
'
'==========================================
'==========================================
'==========================================
Inizio:
'
TRISB = %00011111 'portB configura direzione 0=out 1=in
TRISA = %11100000 'portA configura direzione
PortB = %00011111 'preset uscite
PortA = %11100001 'accende led
'
' B7: RBPU - ENABLE PORT B PULL-UP 1=OFF
' B6: INTEDG - RB0 INT EDGE SEL 0=fronte discesa
' B5: T0CS - TMR0 SOURCE, 0=FOSC/4, 1=RA4 PIN
' B4: T0SE - RA4CLK PIN EDGE SELECT, 0=+VE
' B3: PSA - PRESCALE ASSIGN 0=TIMER, 1=WDG
' B2-0: PS2-0 - PRESCALE RATE 111=256 FOR TIMER (=128 FOR WDT)
'
OPTION_REG = %10000000
'
' -- enable
' B7: GIE - GLOBAL INT enable 0=OFF
' B6: PEIE - PERIPHERAL INTERRUPT enable 0=OFF
' B5: T0IE - TMR0 O/FLOW INT enable 0=OFF
' B4: INTE - RB0 INT enable 0=OFF
' B3: RBIE - PORTB CHANGE-OF-STATE INT enable 0=OFF
' -- flag
' B2: T0IF - TMR0 O'FLOW 1=O/FLOW MUST RESET
' B1: INTF - RB0 INT ACTIVE HIGH
' B0: RBIF - PORTB CHANGE-OF-STATE flag, ACTIVE HIGH
INTCON = 0 'non usato
'
sound Buzz,[100,20]
Flag = 0 'reset tutti flag
RandW = 9339 'inizializza pseudo random
debug cr,lf
while Bttn5 = 0
RandW = RandW + 1 'cambia seme se si preme tasto
wend
gosub Tast_OFF 'controlla rilascio tasti
gosub Genera_seq 'genera sequenza e salva in eeprom
pause 1000
Pic_step = 1 'tiene traccia della sequenza
Play_pic:
if Bttn5 = 0 then 'premuto tasto rigenera ?
pause 30
if Bttn5 = 1 then Play_pic 'falsa lettura
gosub Genera_seq 'crea una nuova sequenza
Pic_step = 1 'riposiziona contatore
endif
gosub Tast_off 'rilascio tasti
if Pic_step > Max_numeri then 'esaurita sequenza
for Lpcnt = 0 to 10 'Winner sound
PortA = %11100001 'accende
sound Buzz,[128,50]
PortA = %11111111 'spegne
sound Buzz,[252,50]
next
gosub Genera_seq 'genera una nuova sequenza
Pic_step = 1
endif
Index = 0 'pointer numeri in array
Lpcnt = 0
Fl_user = 0 'aggiunge ritardo
while Lpcnt < Pic_step 'propone le sequenze
gosub Tast_OFF
Numero = Seq_g[Index] 'recupera sequenza
gosub Accende
debug dec numero," "
Index = Index + 1
Lpcnt = Lpcnt + 1
wend
debug cr,lf
'play user
User_step = 0
FL_user = 1
Index = 0
while Pic_step > User_step 'finche non eguaglia
TmpW = 0 'timeout
repeat
gosub Timeout 'se si rimane addormentati avvisa
gosub Get_tasti 'attende user prema tasto
until Fl_tasto = 1
if tasto = 4 then Play_pic 'rigenera sequenza
'
debug dec Tasto," "
gosub Tast_OFF 'attende rilascio tasti
Numero = Seq_g[Index] 'recupera sequenza
if Tasto = Numero then 'controlla se risposta esatta
gosub Accende
User_step = User_step + 1
Index = Index + 1 'passo seguente
else
Lpcnt = 120 'sequenza errata
repeat
sound Buzz,[Lpcnt,15]
Lpcnt = Lpcnt - 10
pause 40
until Lpcnt < 20
Pic_step = 1 'riparte da inizio
pause 300
goto Play_pic
endif
wend
debug cr,lf 'sequenza corretta
PortA = %11100001 'accende tutti
pause 100
PortA = %11111111 'led spenti
Pic_step = Pic_step + 1
pause 300
goto Play_pic 'ripassa al pic
'
'###############################
' procedure
'##############################
'
Accende:
select case Numero
case 0
Led0 = ledON
sound Buzz,[50,20]
case 1
Led1 = ledON
sound Buzz,[75,20]
case 2
Led2 = ledON
sound Buzz,[100,20]
case 3
Led3 = ledON
sound Buzz,[125,20]
end select
PortA = %11111111 'spegne tutti led
if Fl_user = 0 then pause 300 'skip intervallo tra sequenze se user
return
'
Genera_seq:
debug cr,lf,lf 'giu 2 righe
Index = 0 'inizio deposito dati
Tmp1 = 0 'conta quanti numeri ha generato
repeat
PortA = %11101101 'effetto genera numero
random RandW
Numero = RandW.lowbyte & 3 'riduce numero casuale tra 0 e 3
Seq_g[Index] = Numero 'memorizza numero
debug dec Numero," " 'per debug e per barare
Tmp1 = Tmp1 + 1
Index = Index + 1
pause 20
PortA = %11110011 'effetto genera numero
pause 20
until Tmp1 > Max_numeri 'sequenza Max. di 24 numeri
PortA = %11111111 'spegne led
debug cr,lf
return
'
Get_tasti:
Fl_tasto = 0 'nessun tasto valido
Tmp1 = ~ PortB ' I lettura tasti invertiti
Tmp1 = Tmp1 & %00011111 'lascia solo i tasti
if Tmp1 = 0 then No_tasti
pause 20 'debounce
Tmp2 = ~ PortB ' II lettura tasti invertiti
Tmp2 = Tmp2 & %00011111 'lascia solo i tasti
if Tmp1 <> Tmp2 then Get_tasti 'compara letture se diverse ripete
Fl_tasto = 1 'suppone tasto valido
select case Tmp1 'assegna il valore corretto ai tasti
case %00001000 'tasto 3
Tasto = 3
case %00000100 'tasto 2
Tasto = 2
case %00000010 'tasto 1
Tasto = 1
case %00000001 'tasto 0
Tasto = 0
case %00010000 'tasto resequence
Tasto = 4
case else 'non ammesso + tasti premuti
sound Buzz,[250,100] 'segnala anomalia
Fl_tasto = 0 'tasto non valido
end select
No_tasti:
return
'
Tast_OFF:
Tmp1 = ~ PortB ' tasti invertiti
Tmp1 = Tmp1 & %00011111
if Tmp1 > 0 then Tast_OFF 'attende rilascio tasti
return
'
Timeout:
pause 1 '
TmpW = TmpW + 1
if TmpW > 20000 then 'nessun tasto dopo 20 sec
PortA = %11100001 'flash led
sound Buzz,[192,5] 'make noise
PortA = %11111111
TmpW = 0 'ripristina timeout
endif
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -