⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simon_s2.bas

📁 sms based home control
💻 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 + -