' ********************************************************************** ' ** Programma: KAD08av2.BAS - Versione : 1.2 - 06 Marzo 2001 ** ' ** Compiler: BASCOM AVR (IDE V. 1.11.5.0, LIB V. 1.11.5.0) ** ' ** Scheda : KAD 08 ** ' ** Ditta: grifo(r) ITALIAN TECHNOLOGY ** ' ** Via Dell' Artigiano 8/6 40016 San Giorgio di Piano (BO) ** ' ** Tel.+39 051 892 052 Fax +39 051 893 661 ** ' ** http://www.grifo.com http://www.grifo.it ** ' ** sales@grifo.it tech@grifo.it grifo@grifo.it ** ' ** ** ' ** Realizzato da: Graziano GAIBA ** ' ********************************************************************** ' ' Questo programma, attraverso un menu, permette di gestire le risorse a bordo ' della scheda KAD 08, tramite 2 linee TTL pilotate da un micro controllore della ' famiglia 51, ' La gestione di questo programma avviene tramite la seriale RS232, quindi e' ' indispensabile collegare una COM libera del PC al connettore CN2 della K51-AVR. ' Configurare il terminale del BASCOM AVR nel menu OPTION/ COMUNICATION/ ' selezionare la COM e settare il BAUD a 19200, none, 8, 1. ' La scheda utilizzata e' la K51-AVR che va colleganta alla KAD 08 come segue: ' K51-AVR KAD 08 ' L1 (pin4 CN6) ----> SC (pin2 CN1 KAD08) ' L2 (pin5 CN6) ----> SD (pin1 CN1 KAD08) ' Collegare le alimentazioni su entrambe le schede. ' ' ++++++********** ATTENZIONE **********+++++++ ' + + ' + Per compilare correttamente il programma: + ' + 1) aprire il menu Options/Compiler/Chip + ' + 2) impostare a 130 il valore di Stacksize + ' + 3) impostare a 80 il valore di Framesize + ' + + ' ++++++********** ATTENZIONE **********+++++++ ' '*********************************************************************** ' '****************** Direttive del compilatore ************************** ' $regfile = "8515def.DAT" ' AT90s8515 registers list $romstart = &H0 ' code start address $crystal = 5529600 ' micro clock frequence $baud = 19200 ' baud rate ' Configura il timer 0 come timer ed il prescaler che divide il clock per 256 Config Timer0 = Timer , Prescale = 256 ' '****************** Dichiarazione delle costanti *********************** ' Pclk Alias Portd.3 ' linea L1 su CN6 della K51-AVR che Config Pind.3 = Output ' pilota il segnale di Clock. Psda Alias Portd.4 ' linea L2 su CN6 della K51-AVR che Config Pind.4 = Output ' pilota il segnale dei Dati. Const Cler = 12 ' codice di clear screen Const Bel = 7 ' codice di Bell Const Ric = 151 ' genera un interrupt di 4.88 mS ad ' una frequenza di 5.5296MHz. ' '****************** Dichiarazione delle variabili ********************** ' Dim Tasto As Byte ' uso generico Dim Led1 As Bit ' indica lo stato del Led 1 = 1 On Dim Led2 As Bit ' indica lo stato del Led 2 = 1 On Dim Led3 As Bit ' indica lo stato del Led 3 = 1 On Dim Led4 As Bit ' indica lo stato del Led 4 = 1 On Dim C1 As Byte ' codice per DY4/1 Dp1 Alias C1.7 ' indica decimal point di DY4/1 = 1 On Dim C2 As Byte ' codice per DY4/2 Dp2 Alias C2.7 ' indica decimal point di DY4/2 = 1 On Dim C3 As Byte ' codice per DY3/1 Dp3 Alias C3.7 ' indica decimal point di DY3/1 = 1 On Dim C4 As Byte ' codice per DY3/2 Dp4 Alias C4.7 ' indica decimal point di DY3/2 = 1 On Dim C5 As Byte ' codice per DY2/1 Dp5 Alias C5.7 ' indica decimal point di DY2/1 = 1 On Dim C6 As Byte ' codice per DY2/2 Dp6 Alias C6.7 ' indica decimal point di DY2/2 = 1 On Dim C7 As Byte ' codice per DY1/1 Dp7 Alias C7.7 ' indica decimal point di DY1/1 = 1 On Dim C8 As Byte ' codice per DY1/2 Dp8 Alias C8.7 ' indica decimal point di DY1/2 = 1 On Dim N As Byte ' uso generico ' ' ************************************************************************ ' * Le variabili seguenti sono indispensabili per l'interrupt, possono * ' * essere modificate in qualunque momento. * ' ************************************************************************ ' Dim Bit32 As Long ' variabile di 32 bit che contiene lo ' il frame di bit per l'M5451 Dim Bit3 As Byte ' 3 bit per il frame dell' M5451 Dim Cifra As Byte ' contiene la conversione in digit Dim Disp As Byte ' indica il dispaly in visualizzazione Dim Cifh As Byte ' cifra su DY4 e DY3 Dim Cifl As Byte ' cifra su DY2 e DY1 ' ' **************************************************************************** ' '****************** Dichiarazione delle procedure ********************** ' Declare Function Iv() As Long ' Input di Valore decimale Declare Sub Iniz ' inizializzazione variabili ecc. Declare Function Att_key() As Byte ' Attesa pressione tasto Declare Sub Press ' Mes. Premi un tasto per continuare Declare Sub Demo ' esempio gestione display Declare Sub Decimal_point ' Attivazione decimal point Declare Sub Ins_car ' Ins. un carattere ASCII Declare Sub Leds ' gestione On / Off LEDs Declare Sub Sendclk ' emette un impulso di CLK Declare Sub Sinc5451 ' resetta le uscite dell'M5451 Declare Sub Testbit0 ' setta Psda come lo stato del Bit0 Declare Sub Send5451 ' comunica all'M5451 lo stato delle ' uscite, tramite il contenuto della ' variabile a 32+3 bit. Declare Sub Ruota ' Rotazione a sinistra degli 8 display Declare Function Conv14 (byval Cifra As Byte) As Word ' converte un numero da 0 a 127 in 14 ' segmenti vedi codice ASCII Declare Sub Conv_bit (byval Cifh As Byte , Byval Cifl As Byte) ' converte 2 cifre in bit per il 5451 On Timer0 T0_int ' procedura di risposta all'interrupt ' del Timer0 ' '************************* Programma main ****************************** ' Main: Call Iniz ' inizializzazioni delle variabili ecc. N = 0 ' azzero la variabile Do ' visualizzo un messaggio dalla ROM C8 = Lookup(n , Messaggio) ' leggo un carattere del messaggio e ' lo visualizzo su DY1/2 If C8 <> 0 Then ' se il carattere non e' nullo Incr N ' incremento di 1 la variabile Waitms 150 ' ritardo Call Ruota ' rotazione a sinistra dei 8 display End If Loop Until C8 = 0 ' esco solo se il carattere e' = 0 Do Do Print Chr(cler) ; ' cancello lo schermo Print "** DEMO per la KAD 08 abbinata alla K51-AVR REL.1.2 06.03.2001 **" Print Print "1) Esempio di utilizzo" Print "2) Inserire un carattere ASCII da 0 a 127" Print "3) Attivazione del punto decimale" Print "4) Accensione e spegnimento LEDs" Print "5) Reset" Print Print "SELEZIONARE IL MENU DESIDERATO : " Print Tasto = Att_key() ' Attendo un tasto Print "Tasto=" ; If Tasto <> 0 Then Print Chr(tasto); ' visualizzo l'ultimo tasto End If Print Chr(13); ' torno a inizio riga Loop Until Tasto <> 0 ' esco se ho ricevuto un carattere Select Case Tasto Case "1" : Call Demo ' esempio gestione display Case "2" : Call Ins_car ' Ins. un carattere ASCII Case "3" : Call Decimal_point ' Attivazione decimal point Case "4" : Call Leds ' gestione LEDs Case "5" : Led1 = 0 ' spengo il Led 1 Led2 = 0 ' spengo il Led 2 Led3 = 0 ' spengo il Led 3 Led4 = 0 ' spengo il Led 4 C1 = 32 ' attivo DY4/1 il carattere "spazio" C2 = 32 ' attivo DY4/2 il carattere "spazio" C3 = 32 ' attivo DY3/1 il carattere "spazio" C4 = 32 ' attivo DY3/2 il carattere "spazio" C5 = 32 ' attivo DY2/1 il carattere "spazio" C6 = 32 ' attivo DY2/2 il carattere "spazio" C7 = 32 ' attivo DY1/1 il carattere "spazio" C8 = 32 ' attivo DY1/2 il carattere "spazio" Call Press ' Mes. Premi un tasto per continuare Tasto = Att_key() ' Attendo un tasto Case Else : Print Chr(bel); ' tasto non valido End Select Loop ' ' *************** Risposta all'interrupt del Timer0 ************************* ' * Risposta all'interrupt del Timer0 ( il Timer1 e' usato per la seriale) * ' * a intervalli di 5mS (vedi Const Ric) avviene la visualizzazione di 2 * ' * display a 14 segmenti, al prossimo interrupt altri 2 fino ad accenderli * ' * tutti e 8 in 4 passate da 5mS. * ' *************************************************************************** ' T0_int: Stop Timer0 ' fermo il timer0 Timer0 = Ric ' ricarico il valore di partenza Start Timer0 ' partenza del timer0 Select Case Disp ' agisco in base al display scelto Case 0 : Call Conv_bit(c1 , C5) ' preparo i bit per DY4/1 e DY2/1 Incr Disp ' commuto prossima coppia di display Case 1 : Call Conv_bit(c2 , C6) ' preparo i bit per DY4/2 e DY2/2 Incr Disp ' commuto prossima coppia di display Case 2 : Call Conv_bit(c3 , C7) ' preparo i bit per DY3/1 e DY1/1 Incr Disp ' commuto prossima coppia di display Case Is => 3 : Call Conv_bit(c4 , C8) ' preparo i bit per DY3/2 e DY1/2 Disp = 0 ' Ripunto hai display DY4/1 e DY2/1 End Select Call Send5451 ' mando le informazioni al M5451 IC1 Return End ' '************************ Fine del programma *************************** ' ' '**************************** Procedure ******************************** ' ' *************** Inizializzazioni delle variabili ecc. ************************ ' * Questa procedura si occupa di inizializzare le variabili, attiva la * ' * gestione del TIMER 0 in interrupt. * ' * Parametri: nessuno * ' * Ingresso: * ' * Uscita: * ' ****************************************************************************** ' Sub Iniz ' inizializzazione variabili ecc. Pclk = 0 ' abbasso la linea di CLK Psda = 0 ' abbasso la linea di Dati Disp = 0 ' punto hai display DY4/1 e DY2/1 Led1 = 0 ' spengo il Led 1 Led2 = 0 ' spengo il Led 2 Led3 = 0 ' spengo il Led 3 Led4 = 0 ' spengo il Led 4 C1 = 32 ' attivo DY4/1 il carattere "spazio" C2 = 32 ' attivo DY4/2 il carattere "spazio" C3 = 32 ' attivo DY3/1 il carattere "spazio" C4 = 32 ' attivo DY3/2 il carattere "spazio" C5 = 32 ' attivo DY2/1 il carattere "spazio" C6 = 32 ' attivo DY2/2 il carattere "spazio" C7 = 32 ' attivo DY1/1 il carattere "spazio" C8 = 32 ' attivo DY1/2 il carattere "spazio" Timer0 = Ric ' quando il timer0 arriva a 0, ' scatta l'interrupt Enable Interrupts ' abilito l'uso degli interrupt Enable Timer0 ' abilito l'interrupt del timer0 Start Timer0 ' partenza del timer0 End Sub ' ' ***************** Rotazione a sinistra degli 8 display *********************** ' * Questa procedura esegue uno spostamento a sinistra di tutti e 8 i display, * ' * in questo modo e' possibile realizzare delle scritte scorrevoli da destra * ' * verso sinistra, eseguendo la rotazione e poi inserendo il nuovo carattere * ' * su C8 che coincide con DY1/2. * ' * Parametri: nessuno * ' * Ingresso: * ' * Uscita: * ' ****************************************************************************** ' Sub Ruota ' Rotazione a sinistra degli 8 display C1 = C2 ' elimino il carattere su DY4/1, e ' copio il carattere da DY4/2. C2 = C3 ' elimino il carattere su DY4/2, e ' copio il carattere da DY3/1. C3 = C4 ' elimino il carattere su DY3/1, e ' copio il carattere da DY3/2. C4 = C5 ' elimino il carattere su DY3/2, e ' copio il carattere da DY2/1. C5 = C6 ' elimino il carattere su DY2/1, e ' copio il carattere da DY2/2. C6 = C7 ' elimino il carattere su DY2/2, e ' copio il carattere da DY1/1. C7 = C8 ' elimino il carattere su DY1/1, e ' copio il carattere da DY1/2. End Sub ' ' ************************************************************************** ' * Questa procedura prepara i bit da trasmettere all'M5451 (IC1 su KAD 08)* ' * Ogni display e' associato una cifra da C1 a C8, se la cifra contiene * ' * un numero superiore a 127, automaticamente viene attivato il * ' * rispettivo decimal point. * ' * * ' * Parametri: 3 ingresso, 2 uscita * ' * Igresso : var. Disp byte (da 0 a 3), indica quale display verra gestito* ' * * ' * 0 -> DY4/1 e DY2/1 * ' * 1 -> DY4/2 e DY2/2 * ' * 2 -> DY3/1 e DY1/1 * ' * 3 -> DY3/2 e DY1/2 * ' * var. cif_h byte ( da 0 a 127), cifra per DY4 e DY3 * ' * var. cif_l byte ( da 0 a 127), cifra per DY2 e DY1 * ' * * ' * uscita : var. Bit32 Long * ' * La variabile Bit32 ( 4 byte) e' cosi' suddivisa : * ' * Bit32+0 -> byte 0 0..7 indica segmento a,b,c,d,e,f,g,h per DY4 e DY3 * ' * * ' * Bit32+1 -> byte 1 0..6 indica segmento j,k,l,m,n,p,dp per DY4 e DY3 * ' * byte 1.7 indica segmento a per DY2 e DY1 * ' * * ' * Bit32+2 -> byte 2 0..7 indica segmento b,c,d,e,f,g,h,j per DY2 e DY1 * ' * * ' * Bit32+3 -> byte 3 0..5 indica segmento k,l,m,n,p,dp per DY2 e DY1 * ' * byte 3.6 se = 0 attiva i display DY3/2 e DY1/2, LD1 * ' * byte 3.7 se = 0 attiva i display DY3/1 e DY1/1, LD2 * ' * * ' * Bit 3 -> bit 0 se = 0 attiva i display DY4/2 e DY2/2, LD3 * ' * bit 1 se = 0 attiva i display DY4/1 e DY2/1, LD4 * ' * bit 2 se = 0 abilita' i 4 LED. LD1, LDE2, LD3, LD4 * ' * * ' * var. Led1 bit (=1 led acceso) * ' * var. Led2 bit (=1 led acceso) * ' * var. Led3 bit (=1 led acceso) * ' * var. Led4 bit (=1 led acceso) * ' ************************************************************************** ' Sub Conv_bit (byval Cifh As Byte , Byval Cifl As Byte) ' converte le 2 cifre per il 5451 IC1 Local Tmp32 As Long Local Digit_0 As Word , Digit_1 As Word Bit32 = 0 Digit_0 = Conv14(cifh) ' converte un carattere in 14 segmenti ' byte basso a,b,c,d,e,f,g,h per DY4 e DY3 ' byte alto j,k,l,m,n,p,dp per DY4 e DY3 If Cifh > 127 Then ' il carattere e' > di 127 ' attivo il punto decimale Digit_0 = Digit_0 Or &H4000 ' bit 14 = 1 End If Digit_1 = Conv14(cifl) ' converte un carattere in 14 segmenti ' byte 2 b,c,d,e,f,g,h,j per DY2 e DY1 ' byte 3 k,l,m,n,p,dp per DY2 e DY1 ' byte 3.6 = 1 DY1/2 e DY3/2 Off ' byte 3.7 = 1 DY1/1 e DY3/1 Off If Digit_1.0 = 1 Then ' il bit 0 e' attivo Digit_0 = Digit_0 Or &H8000 ' attivo il bit 15 End If Digit_1 = Digit_1 And &HFFFE ' elimino il bit0 Shift Digit_1 , Right ' sposto a destra di un bit If Cifl > 127 Then ' il carattere e' > di 127 ' attivo il punto decimale Digit_1 = Digit_1 Or &H2000 ' bit 13 = 1 End If Digit_1 = Digit_1 Or &HC000 ' mantengo disattivi DY3 e DY1 'Assemblo il valore a 32 bit di bit 32 Bit32 = Digit_0 ' Word bassa di bit 32 Tmp32 = Digit_1 ' Word alta di bit 32 Shift Tmp32 , Left , 16 ' Sposto la word in alto Bit32 = Bit32 + Tmp32 ' Unisco le due word Bit3 = 3 ' bit3.0 = 1 DY2/2 e DY4/2 Off ' bit3.1 = 1 DY2/1 e DY4/1 Off ' bit3.2 = 0 LED1, 2, 3, 4 Off Select Case Disp ' seleziono la coppia display scelta Case 0 : Bit3.1 = 0 ' DY2/1 e DY4/1 On If Led4 = 1 Then ' e' attivo il LED4 Bit3.2 = 1 ' attivo il LED4 End If Case 1 : Bit3.0 = 0 ' DY2/2 e DY4/2 On If Led3 = 1 Then ' e' attivo il LED3 Bit3.2 = 1 ' attivo il LED3 End If Case 2 : Bit32 = Bit32 And &H7FFFFFFF ' DY1/1 e DY3/1 On If Led2 = 1 Then ' e' attivo il LED2 Bit3.2 = 1 ' attivo il LED2 End If Case Is => 3 : Bit32 = Bit32 And &HBFFFFFFF ' DY1/2 e DY3/2 On If Led1 = 1 Then ' e' attivo il LED1 Bit3.2 = 1 ' attivo il LED1 End If End Select End Sub ' ' ********* Converte un numero da 0 a 127 in codice a 14 segmenti ****** ' * * ' * Parametri: 1 ingresso, 1 uscita * ' * ingresso : variabile Cifra tipo byte (da 0 a 127) * ' * uscita: variabile Word (conversione per 14 segmenti) * ' * * ' ********************************************************************** ' Function Conv14(byval Cifra As Byte) As Word ' converte un numero da 0 a 127 in 14 ' segmenti Local Bit8 As Byte Bit8 = Cifra And &H7F ' elimino i numeri superiori a 127 Conv14 = Lookup(bit8 , Tab_16seg) ' leggo in tabella il carattere ASCII ' associato al numero End Function ' ' ************* Comunica all'M5451 IC1 lo stato delle uscite *********** ' * Trasmette il contenuto della variabile Bit32 di tipo Long, e Bit3. * ' * La variabile Bit32 e Bit3 devono essere dichiarate in RAM interna, * ' * in caso contrario non possono essere eseguite le istruzioni in * ' * assembler. * ' * * ' * Parametri: 2 ingresso * ' * ingresso : variabile bit32 Long e Bit3 as byte * ' * uscita : nulla. * ' ********************************************************************** ' Sub Send5451 ' comunica all'M5451 lo stato delle ' uscite, tramite il contenuto della ' variabile a 32+3 bit. Local I As Byte Call Sinc5451 ' Scincronizzo la sequenza Psda = 1 ' start Call Sendclk ' sequenza di start For I = 1 To 32 Call Testbit0 ' emetto i bits da 0 a 31 Call Sendclk ' sequenze da 1 a 32 Shift Bit32 , Right ' pins da 2 a 40 del 5451 ' collegati a segmenti e dp Next I Bit32 = Bit3 ' Inserisco bit3 per inviarla For I = 1 To 3 Call Testbit0 ' emetto i bits da 32 a 334 Call Sendclk ' sequenze da 33 a 35 Shift Bit32 , Right ' pins da 23 a 25 del 5451 Next I Psda = 0 Call Sendclk ' sequenza 36 Call Sendclk ' sequenza 37 End Sub ' ' ****** Sposta lo stato del bit0 dell'accumulatore nel bit Psda ************* ' * Parametri: nessuno * ' * Ingresso: * ' * Uscita: * ' **************************************************************************** ' Sub Testbit0 Psda = Bit32.0 ' Viene trasmesso il bit meno ' significativo di bit32 End Sub ' ' ***************** Emette un impulso di CLK ************************ ' * Parametri: nessuno * ' * Ingresso: * ' * Uscita: * ' ******************************************************************* ' Sub Sendclk Pclk = 0 ' pongo la linea CLK a zero Waitus 2 ' Attende 20 usec Pclk = 1 ' pongo la linea CLK a uno Waitus 2 ' Attende 20 usec End Sub ' ' ***************** Sincronizza la sequenza dell'M5451 ************************* ' * Questa procedura emette 37 impulsi di CLK, questo evita che si sfalsi * ' * la sequenza di dati. * ' * Parametri: nessuno * ' * Ingresso: * ' * Uscita: * ' ****************************************************************************** ' Sub Sinc5451 Local I As Byte Psda = 0 ' pongo la linea dati a zero For I = 1 To 37 ' ciclo ripetuto 37 volte Call Sendclk ' emetto un impulso di CLK Next I End Sub ' ' ************************** Gestione On / Off LEDs **************************** ' * Questa procedura permette di attivare o disattivere i 6 LEDs a bordo della * ' * scheda KAD 08. * ' * Parametri: nessuno * ' * Ingresso: * ' * Uscita: * ' ****************************************************************************** ' Sub Leds ' gestione On / Off LEDs Local T As Byte Print Chr(cler) ; ' cancello lo schermo Print Print "Gestione accensione o spegnimento LEDs" Print "1) On / Off LED 1" Print "2) On / Off LED 2" Print "3) On / Off LED 3" Print "4) On / Off LED 4" Print "5) Esci" Print Print "SELEZIONA IL LEDs DESIDERATO : " Print Do T = Att_key() ' Attendo un tasto Select Case T Case "1" : Led1 = Not Led1 ' Accensione o spegnimento LED 1 Case "2" : Led2 = Not Led2 ' Accensione o spegnimento LED 2 Case "3" : Led3 = Not Led3 ' Accensione o spegnimento LED 3 Case "4" : Led4 = Not Led4 ' Accensione o spegnimento LED 4 End Select Loop Until T = "5" ' esco se viene premuto 5 End Sub ' ' ******************** Inserisco un carattere ASCII *************************** ' * Questa procedura permette di visualizzare un carattere ASCII sui display. * ' * Parametri: nessuno * ' * Ingresso: * ' * Uscita: * ' ***************************************************************************** ' Sub Ins_car ' Ins. un carattere ASCII Local Dis As Long ' indica quale decimal point e' attivo Local T As Byte ' contiene il carattere ricevuto, Print Do Print "Selezionare un display (1...8) ? " ; Dis = Iv() Loop Until Dis > 0 And Dis < 9 ' esco se il valore e' minore di 9 Print Print "Inserire un carattere ASCII : "; Do T = Inkey() ' leggo un carattere dalla seriale Loop Until T <> 0 ' esco se e' arrivato un carattere Print Chr(t) Select Case Dis Case 1 : C1 = T ' visualizzo il carattattere su DY4/1 Case 2 : C2 = T ' visualizzo il carattattere su DY4/2 Case 3 : C3 = T ' visualizzo il carattattere su DY3/1 Case 4 : C4 = T ' visualizzo il carattattere su DY3/2 Case 5 : C5 = T ' visualizzo il carattattere su DY2/1 Case 6 : C6 = T ' visualizzo il carattattere su DY2/2 Case 7 : C7 = T ' visualizzo il carattattere su DY1/1 Case 8 : C8 = T ' visualizzo il carattattere su DY1/2 End Select Call Press ' Mes. Premi un tasto per continuare T = Att_key() ' Attendo un tasto End Sub ' ' ******************** Attivazione decimal point ***************************** ' * Questa procedura permette di gestire tutti e 8 decimal point dei display. * ' * Parametri: nessuno * ' * Ingresso: * ' * Uscita: * ' ***************************************************************************** ' Sub Decimal_point ' Attivazione decimal point Local T As Byte Print Print " Gestione accensione punto decimale" Print " 0) Disattivo i decimal point" Print " 1) Attivazioe DY4/1" Print " 2) Attivazioe DY4/2" Print " 3) Attivazioe DY3/1" Print " 4) Attivazioe DY3/2" Print " 5) Attivazioe DY2/1" Print " 6) Attivazioe DY2/2" Print " 7) Attivazioe DY1/1" Print " 8) Attivazioe DY1/2" Print " 9) Esci" Print Do T = Att_key() ' Attendo un tasto Select Case T Case "0" : Dp1 = 0 ' spengo Dp, azzero il bit7 di C1 Dp2 = 0 ' spengo Dp, azzero il bit7 di C2 Dp3 = 0 ' spengo Dp, azzero il bit7 di C3 Dp4 = 0 ' spengo Dp, azzero il bit7 di C4 Dp5 = 0 ' spengo Dp, azzero il bit7 di C5 Dp6 = 0 ' spengo Dp, azzero il bit7 di C6 Dp7 = 0 ' spengo Dp, azzero il bit7 di C7 Dp8 = 0 ' spengo Dp, azzero il bit7 di C8 Case "1" : Dp1 = 1 ' Accensione Dp 1 Case "2" : Dp2 = 1 ' Accensione Dp 2 Case "3" : Dp3 = 1 ' Accensione Dp 3 Case "4" : Dp4 = 1 ' Accensione Dp 4 Case "5" : Dp5 = 1 ' Accensione Dp 5 Case "6" : Dp6 = 1 ' Accensione Dp 6 Case "7" : Dp7 = 1 ' Accensione Dp 7 Case "8" : Dp8 = 1 ' Accensione Dp 8 End Select Loop Until T = "9" ' esco se viene premuto 9 End Sub ' ' ***************** Demo gestione display ************************************** ' * Questa procedura visualizza tutta la tabella ASCII, facendo scorrere da * ' * destra verso sinistra un carattere alla volta. * ' * Tutti i caratteri che non possono essere visualizzati appaiono con un punto* ' * decimale. * ' * In contemporanea vengonoaccesi i LEDs. * ' * Parametri: nessuno * ' * Ingresso: * ' * Uscita: * ' ****************************************************************************** ' Sub Demo ' Attiva display in demo Local D As Byte , T As Byte ' Uso generico Call Press ' Mes. Premi un tasto per continuare Do For D = 32 To 127 C8 = D Led1 = 0 ' spengo il Led 1 Led2 = 1 ' accendo il Led 2 Led3 = 0 ' spengo il Led 3 Led4 = 1 ' accendo il Led 4 Waitms 100 ' ritardo Led1 = 1 ' accendo il Led 1 Led2 = 0 ' spengo il Led 2 Led3 = 1 ' accendo il Led 3 Led4 = 0 ' spengo il Led 4 Waitms 100 ' ritardo T = Inkey() ' leggo un carattere dalla seriale If T <> 0 Then ' c'e' un carattere Exit For ' esco dal ciclo For Else Call Ruota ' Rotazione a sinistra degli 8 display End If Next D Loop Until T <> 0 ' esco se e' stato premuto un tasto End Sub ' ' ****************** Attesa sospensiva di un tasto *************************** ' * Parametri: 1 uscita * ' * Ingresso: * ' * Uscita: T tipo byte, contiene il codice ricevuto dalla seriale * ' **************************************************************************** ' Function Att_key() As Byte Local T As Byte Do T = Inkey() ' leggo un carattere dalla seriale Loop Until T <> 0 ' attendo che ci sia un carattere Att_key = T ' Restituisco il carattere End Function ' ' ******************************************************************* ' Sub Press ' Mes. Premi un tasto per continuare Print Print Print Print "Premi un tasto per continuare..." Print End Sub ' ' ****************** Inserimento di un valore decimale *********************** ' * Parametri: 1 uscita * ' * Ingresso: * ' * Uscita: tipo byte, contiene il valore digitato tramite la porta seriale * ' **************************************************************************** ' Function Iv() As Long Local Count As Byte ' Numero di caratteri ricevuti Local Key As Byte ' Carattere letto Local Valore As String * 10 ' Stringa complessiva Local Strkey As String * 1 ' Carattere letto -> stringa Count = 0 ' Inizializza contatore Valore = "" ' Inizializza stringa Do Do Key = Inkey() ' Legge un carattere Loop Until Key <> 0 ' Esce se c'e' un carattere If Count < 10 Then ' Letti meno di 10 caratteri? Select Case Key ' Se il tasto letto... Case "0" To "9": ' ...e' una cifra decimale Strkey = Chr(key) ' Convrte in stringa Print Strkey; ' Echo Valore = Valore + Strkey ' Accoda alla stringa totale Incr Count ' Incrementa il contatore End Select End If Loop Until Key = 13 ' Esce con Enter Print ' Va a capo Iv = Val(valore) ' Restituisce il valore End Function ' della stringa ' ' ******************************************************************* ' ' ' ************* Tabella conversione ASCII in 14 segmenti ******************** Messaggio: Data " MENU " , 0 Tab_16seg: ' cod. 00 01 02 03 04 05 06 07 Data &H0000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% ' cod. 08 09 0A 0B 0C 0D 0E 0F Data &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% ' cod. 10 11 12 13 14 15 16 17 Data &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% ' cod. 18 19 1A 1B 1C 1D 1E 1F Data &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% , &H4000% ' cod. 20 SP 21 ! 22 " 23 # 24 $ 25 % 26 & 27 ' Data &H0000% , &H0880% , &H0082% , &H4000% , &H266D% , &H4000% , &H4000% , &H0040% ' cod. 28 ( 29 ) 2A * 2B + 2C , 2D - 2E . 2F / Data &H0039% , &H000F% , &H3FC0% , &H2A80% , &H1000% , &H2200% , &H4000% , &H1100% ' cod. 30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7 Data &H113F% , &H0006% , &H221B% , &H220F% , &H2226% , &H222D% , &H223D% , &H0027% ' cod. 38 8 39 9 3A : 3B ; 3C < 3D = 3E > 3F ? Data &H223F% , &H222F% , &H4000% , &H4000% , &H0500% , &H2208% , &H1040% , &H0A23% ' cod. 40 @ 41 A 42 B 43 C 44 D 45 E 46 F 47 G Data &H02BB% , &H2237% , &H0A8F% , &H0039% , &H088F% , &H2039% , &H2031% , &H023D% ' cod. 48 H 49 I 4A J 4B K 4C L 4D M 4E N 4F O Data &H2236% , &H0889% , &H001E% , &H2530% , &H0038% , &H00B7% , &H0476% , &H003F% ' cod. 50 P 51 Q 52 R 53 S 54 T 55 U 56 V 57 W Data &H2233% , &H043F% , &H2633% , &H222D% , &H0881% , &H003E% , &H1130% , &H083E% ' cod. 58 X 59 Y 5A Z 5B [ 5C \ 5D ] 5E ^ 5F - Data &H1540% , &H0940% , &H1109% , &H0039% , &H0440% , &H000F% , &H0102% , &H2200% ' cod. 60 ` 61 a 62 b 63 c 64 d 65 e 66 f 67 g Data &H0100% , &H2237% , &H223C% , &H2218% , &H221E% , &H2039% , &H2231% , &H023D% ' cod. 68 h 69 i 6A j 6B k 6C l 6D m 6E n 6F o Data &H2234% , &H0800% , &H001E% , &H2530% , &H0880% , &H2A14% , &H2A04% , &H221C% ' cod. 70 p 71 q 72 r 73 s 74 t 75 u 76 v 77 w Data &H2233% , &H2227% , &H0A00% , &H222D% , &H2038% , &H001C% , &H1010% , &H081C% ' cod. 78 x 79 y 7A z 7B { 7C | 7D } 7E ~ 7F Data &H1540% , &H1140% , &H1109% , &H4000% , &H0880% , &H4000% , &H4000% , &H4000% ' ****************************************************************************** '