' ********************************************************************** ' * File: Corso_BASCOMAVR_055.BAS * ' * Versione: 1.1 * ' * Data: 12.12.09 * ' * Ambiente sviluppo: Bascom-AVR Demo Ver. 1.11.9.1 + * ' * + AVR bootloader grifo(r) Ver. 1.2 * ' * Schede: GMM AM08 + GMM TST3 * ' * Sviluppato da: GRIFO(r) Italian Technology * ' * via Dell'Artigiano 8/6 * ' * 40016 S. Giorgio di Piano (BO) * ' * Tel. +39 051 892052 Fax. +39 051 893661 * ' * http://www.grifo.com http://www.grifo.it * ' * Autore: Gianluca Angelini * ' ********************************************************************** ' Programma di esempio 055 del corso BASCOM AVR. ' Programma di gestione di un pannello operatore QTP 03 tramite linea seriale ' sw asincrona aggiuntiva, in interrupt. ' Il programma comunica con la QTP 03 con un protocollo fisico di 4800 Baud, ' 8 Bit x chr, 1 Stop bit, Nessuna parità impostato sulla linea seriale sw. ' Al fine di semplificare il programma, la seriale sw è gestita tramite le ' istruzioni ad alto livello del BASCOM dedicate alla console; quest'ultime ' vengono ridirezionate sulla seriale sw al posto della seriale hw, tramite ' un apposito selettore definito nel sorgente. ' Dal punto di vista elettrico la linea seriale della QTP 03 può essere sia ' RS 232 che TTL e può quindi essere collegata al Mini Modulo sia con un driver ' (es. MSI 01) che direttamente. ' Le funzionalità del programma riguardano un piccolo sottoinsieme di quelle ' offerte dalla QTP 03 e sono selezionabili da operatore tramite un menù sulla ' console dotata di monitor e tastiera, collegata alla seriale hw, con un ' protocollo fisico costante a 19200 Baud, 8 Bit x chr, 1 Stop bit, Nessuna ' parità. ' Questa console può coincidere con un sistema in grado di gestire una ' comunicazione seriale in RS 232. Al fine di semplificarne l'uso si può ' usare un PC dotato di una linea COMx, che esegue un programma di emulazione ' terminale come HYPERTERMINAL o l'omonima modalità offerta dal BASCOM AVR ' (vedere Configurazioni IDE). ' Il programma funziona solo se la GMM AM08 è montata sullo zoccolo Z2 della ' GMM TST3!! ' ' Aggiunte: $SERIALINPUT, $SERIALOUTPUT, PUSHALL, POPALL. ' ' 12/12/09: Corso_BASCOMAVR_055.BAS - Ver 1.1 - By G.A. ' Prima versione. ' ' '*************************** Configurazioni IDE ******************************** ' NOTE: per usare correttamente questo programma demo, eseguire i seguenti ' punti: ' 1) Controllare la presenza del file M8DEF.DAT nella directory di ' installazione del BASCOM-AVR e se non disponibile copiarlo e dopo ' rilanciare l'IDE. ' 2) Nella finestra "Options | Compiler | Chip" impostare: ' Chip: m8def.dat ' XRAM: None ' HW Stack: 64 ' Soft Stack: 32 ' Framesize: 64 ' XRAM waitstate: disattivo ' External Access Enable: disattivo ' 3) Nella finestra "Options | Communication" settare: ' COM port = la linea del PC collegata alla GMM AM08, tramite la GMM TST3 ' Baudrate = 19200 ' Parity = None ' Databits = 8 ' Stopbit = 1 ' Handshake = None ' Emulation = TTY ' Font = Terminal, Normale, 12 punti, colore bianco ' Backcolor = Navy ' 4) Al termine della compilazione, della programmazione del codice nella ' GMM AM08, aprire la finestra di emulazione terminale del BASCOM AVR con ' l'opzione: Tools | Terminal emulator (Ctrl+T) ed a questo punto resettare ' o riaccendere il Mini Modulo. '********************** Direttive del compilatore ****************************** $regfile "M8DEF.DAT" ' File di definizione microcontrollore usato $romstart = &H0 ' Indirizzo inizio codice in FLASH $crystal = 7372800 ' Frequenza quarzo del microcontrollore $hwstack = 64 ' Spazio per stack hardware $swstack = 32 ' Spazio per stack software $framesize = 64 ' Spazio per frame $map ' Genera informazioni di debug $baud = 19200 ' Velocità comunicazione seriale: 19200 Baud ' Altri parametri sono fissi a: 8 bit x chr ' 1 Stop bit ' No parity $serialinput = Handle_consoleinp ' Ridireziona console input $serialoutput = Handle_consoleout ' Ridireziona console output '******************************* Definizioni *********************************** ' Le risorse usate dal programma sono collegate come illustrato nella seguenti ' tabelle: ' !!! N.B. Sulla GMM TST3 i jumper devono essere posizionati come segue: ' J1 in 2-3 ; J2 in 1-2 ; J3 in 1-2 ; J5 in 2-3 ; J7 in 2-3 ; J8 in 2-3 ' J9 in 2-3 !!! ' ' Segnale Risorsa pin Z2 pin Segnale Segnale uP ' software GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' RX SW CN4.16 24 18 PD3 INT1 PD3 INT1 ' TX SW CN4.13 23 17 PD4 T0 PD4 ' ' Segnale pin COMx pin CN5 pin Z2 pin Segnale Segnale uP ' PC DB9 GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' TX 3 3 9 3 RxD RS232 PD0 ' RX 2 2 10 4 TxD RS232 PD1 ' GND 5 5 20 14 GND - ' Da questa tabella si ricava che il cavo di collegamento tra la COM del PC ed ' il CN5 della GMM TST3 è un normale cavo dritto o prolunga. Volendolo ' richiedere alla grifo(r) si deve specificare il codice CCR 9+9E. Pinrx Alias Ddrd.0 ' Bit con direzione segnale collegato a RxD GMM AM08 Pintx Alias Ddrd.1 ' Bit con direzione segnale collegato a TxD GMM AM08 ' Flag di stato per la linea seriale hw Ri Alias Ucsra.7 ' Flag chr ricevuto su linea seriale hw Ti Alias Ucsra.5 ' Flag trasmissione possibile su linea seriale hw '************************ Dichiarazioni costanti ******************************* Const Cret = 13 ' Codice ASCII di ritorno di carrello Const Lf = 10 ' Codice ASCII di nuova linea Const Bell = 7 ' Codice ASCII di bell Const Esc = 27 ' Codice ASCII di escape '************************ Dichiarazioni variabili ****************************** Dim Crxsw As Byte ' Carattere ricevuto da ssriale sw Dim Ctxsw As Byte ' Carattere da trasmettere su seriale sw Dim Rxcsw As Byte ' Carattere ricevuto in interrupt Dim Bufrx(5) As Byte ' Buffer di ricezione per 5 caratteri Dim Wpntrx As Byte ' Puntatore scrittura buffer ricezione Dim Rpntrx As Byte ' Puntatore lettura buffer ricezione Dim Isrxsw As Bit ' Flag carattere ricevuto da seriale sw Dim Conssw As Bit ' Flag che selezione il dispositivo di console (0=ser.hw, 1=ser.sw) Dim Ischr As Bit ' Flag dalla console status per chr disponibile Dim Chrx As Byte ' Carattere ricevuto dalla console status Dim Cur_qtp As Byte ' Parametro per tipo cursore della QTP Dim Buz_qtp As Byte ' Stato buzzer QTP Dim Col_qtp As Byte ' Parametri per posizione cursore della QTP Dim Row_qtp As Byte Dim Tout As Byte ' Contatore timeout Dim Gstr As String * 22 ' Stringa per visualizzazione valori e messaggi Dim G As Single ' Variabile per grandezza da visualizzare Dim Choice As Byte ' Operazione scelta Dim Hlpb As Byte ' Variabile di aiuto ad uso generico '************************ Dichiarazioni procedure ****************************** On Int1 Ricev_sw ' Procedura di risposta ad INT1 Declare Sub Iniser_sw() ' Inizializza e predispone uso seriale sw Declare Sub Closeser_sw() ' Chiude e termina uso seriale sw Declare Sub Isrxser_sw() ' Gestisce ricezione seriale sw Declare Sub Txser_sw() ' Trasmette carattere su seriale sw Declare Sub Consolesta() ' Controlla stato della console ' Procedure per QTP 03 Declare Sub Clear_qtp() ' Cancella tutto il display della QTP Declare Sub Cur_type_qtp(byval Cur_qtp As Byte) ' Setta tipo cursore della QTP Declare Sub Buz_attr_qtp(byval Buz_qtp As Byte) ' Setta stato Buzzer della QTP Declare Sub Pos_cur_qtp(byval Col_qtp As Byte , Byval Row_qtp As Byte) ' Posiziona cursore della QTP Declare Sub Wt_eerdy_qtp() ' Attende EEPROM della QTP pronta Declare Sub Keyp_qtp() ' Gestione pressione tasti QTP 03 '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Conssw = 0 ' Console su seriale hw Print ' Separa precedenti rappresentazioni su console Print Print " Gestione QTP 03 con GMM AM08+GMM TST3" ' Le istruzioni d'uso non vengono mostrate su console in modo da ridurre il codice ' del programma e poterlo quindi compilare con la versione demo del compilatore. ' Effettuare seguenti operazioni prima di usare il programma: ' - Montare Mini Modulo su Z2 della GMM TST3; ' - Configurare QTP 03 a 4800 Baud, 1 Stop tramite suo SETUP LOCALE; ' - Collegare linea seriale sw da CN4 GMM TST3 a CN3 QTP 03; ' - Configurare J1, J2 QTP 03 per collegamento effettuato (linea TTL od RS 232); ' - Fornire un adeguata alimentazione alla QTP 03. ' Inizializza la lseriale sw per una velocità di 4800 Baud, 8 Bit x chr, ' 1 stop Bit, Nessuna parità sui segnali di I/O definiti nella precedente ' tabella. ' Nel sorgente le due istruzioni che seguono devono precedere ogni istruzione ' che usa la seriale sw. Open "comd.4:4800,8,N,1" For Output As #1 ' Associa segnale usato come linea di trasmissione, a canale 1 Open "comd.3:4800,8,N,1" For Input As #2 ' Associa segnale usato come linea di ricezione, a canale 2 Call Iniser_sw() ' Inizializza e predispone uso seriale sw Do 'Il programma verifica i tasti della QTP 03 e quando premuti emette un avviso 'sonoro e rappresenta un messaggio sul display. Inoltre consente di effettuare 'le seguenti operazioni: Conssw = 0 ' Console su seriale hw Print Print "Vedere sorgente per uso." Print Print "Attiva/Disattiva rappr. accensione" Print "Cancella" Print "Grandezza" Print "Buzzer" Print "Scelta:"; Do Conssw = 1 ' Console su seriale sw Call Keyp_qtp() ' Gestione pressione tasti QTP 03 Conssw = 0 ' Console su seriale hw Call Consolesta ' Verifica se tasto premuto su console e lo preleva Loop Until Ischr = 1 ' Ripete fino a tasto premuto su console Choice = Chrx And &HDF ' Salva chr ricevuto=scelta effettuata inb maiuscolo Printbin Choice ' Rappresenta scelta effettuata Print Select Case Choice ' Controlla scelta effettuata Case "D": ' Scelta Disattiva rappresentazione di accensione Conssw = 1 ' Console su seriale sw Printbin Esc ; 150 ; 8 ; 255 ; 1 ; 0 ; 0 ; 0 ' Disattiva rappresentazione di accensione: ESC 150 cmb nmess lungh shift r c Conssw = 0 ' Console su seriale hw Case "A": ' Scelta Disattivazione rappresentazione di accensione Input "Inserire msg.(max. 20 chr): " , Gstr Conssw = 1 ' Console su seriale sw ' Imposta rappresentazione di accensione del solo messaggio 0, statico ' (senza scorrimento), all'inizio del display Hlpb = Len(gstr) ' Forza lunghezza messaggio a 20 caratteri If Hlpb >= 20 Then ' Se lunghezza uguale o superiore Gstr = Left(gstr , 20) ' Mantiene i primi 20 caratteri Else ' Lunghezza inferiore Hlpb = 20 - Hlpb ' Aggiunge spazi per arrivare a 20 caratteri Gstr = Gstr + Space(hlpb) End If Printbin Esc ; 33 ; 67 ; 0 ' Memorizza messaggio 0: ESC ! C n.mess csr.0÷car.19 Print Gstr; Call Wt_eerdy_qtp() ' Attende EEPROM della QTP pronta Printbin Esc ; 150 ; 8 ; 0 ; 1 ; 0 ; 0 ; 0 ' Attiva rappresentazione di accensione: ESC 150 cmb nmess lungh shift r c Conssw = 0 ' Console su seriale hw ' Settaggio effettuato. Spegnere e riaccendere la QTP per vederne gli effetti." Case "C": ' Scelta cancellazione display Conssw = 1 ' Console su seriale sw Call Clear_qtp() ' Cancella display della QTP Conssw = 0 ' Console su seriale hw Case "G": ' Scelta rappresentazione dato numerico su display Print "Rappr. in corso; premere tasto QTP per ultimare.."; Conssw = 1 ' Console su seriale sw Call Cur_type_qtp(0) ' Disattiva cursore Call Pos_cur_qtp(1 , 1) ' Posiziona cursore QTP ad inizio prima riga Print "Grandezza =" ; ' Rappresenta etichetta su QTP Do ' Ciclo che mostra valore numerico Call Pos_cur_qtp(13 , 1) ' Posiziona cursore a fine etichetta Hlpb = Rnd(255) ' Simula acquisizione grandezza G = Hlpb / 10 ' Simula una cifra decimale sulla grandezza Gstr = Fusing(g , "00.#") ' Visualizza grandezza formattata Print Gstr ; Waitms 500 Call Consolesta ' Verifica se tasto premuto su console e lo preleva Loop Until Ischr = 1 ' Ripete fino a tasto premuto su console Call Cur_type_qtp(85) ' Attiva cursore blocco lampeggiante Conssw = 0 ' Console su seriale hw Case "B": ' Scelta attivazione Buzzer QTP Print "Buzzer Attivo,Disattivo,Intermittente:"; Do Choice = Waitkey() ' Attende scelta utente valida Choice = Choice And &HDF ' La converte in in maiuscolo Loop Until Choice = "A" Or Choice = "D" Or Choice = "I" Printbin Choice ' Rappresenta scelta convertita Print Buz_qtp = Choice ' Salva scelta=stato Buzzer QTP Conssw = 1 ' Console su seriale sw Call Buz_attr_qtp(buz_qtp) ' Setta stato Buzzer della QTP Conssw = 0 ' Console su seriale hw Case Else: ' Scelta non valida Printbin &H07 ' Emette un BEL di avviso sulla console End Select Loop ' Fine ciclo infinito Disable Interrupts ' Disabilitazione generale interrupt Call Closeser_sw() ' Chiude e termina uso seriale sw End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Procedura risposta ad INT1 attivato dallo Start bit del carattere ricevuto. ' Questa tecnica può essere sfruttata solo se il segnale di ricezione della ' seriale sw (RX SW) è in grado di generare interrupt sul fronte di discesa. ' La tecnica inoltre non rende sospensiva la ricezione dalla stessa seriale ' liberando di inutile lavoro il microcontrollore. ' Ingresso: Wpntrx = attuale puntatore scrittura buffer ricezione ' Uscita: Wpntrx = attuale puntatore scrittura buffer ricezione aggiornato ' Bufrx() = Buffer di ricezione con carattere ricevuto Ricev_sw: Get #2 , Rxcsw ' Riceve chr appena iniziato con seriale sw, associata a canale 2 Bufrx(wpntrx) = Rxcsw ' Salva chr ricevuto nel buffer ricezione Incr Wpntrx ' Incrementa puntatore scrittura in modo circolare If Wpntrx > 5 Then Wpntrx = 1 End If Gifr.7 = 1 ' Resetta flag INTF1 per cancellare tutte Return ' le transizioni del chr ' Inizializza e predispone uso seriale sw ' Ingresso: Nulla ' Uscita: Wpntrx = puntatore scrittura buffer ricezione inizializzato ' Rpntrx = puntatore lettura buffer ricezione inizializzato Sub Iniser_sw() Wpntrx = 1 ' Inizializza puntatore scrittura buffer ricezione Rpntrx = 1 ' Inizializza puntatore lettura buffer ricezione Config Int1 = Falling ' INT1 triggera su fronte discesa Enable Int1 ' Attiva interrupt INT1 Enable Interrupts ' Abilitazione generale interrupts End Sub ' Gestisce ricezione seriale sw ' Ingresso: Rpntrx = attuale puntatore lettura buffer ricezione ' Uscita: Rpntrx = attuale puntatore lettura buffer ricezione aggiornato ' Isrxsw = flag carattere ricevuto da seriale sw ' Crxsw = eventuale carattere ricevuto Sub Isrxser_sw() If Wpntrx <> Rpntrx Then ' Verifica se carattere ricevuto tramite INT1 e salvato nel buffer circolare Crxsw = Bufrx(rpntrx) ' Preleva carattere ricevuto da buffer ricezione Incr Rpntrx ' Incrementa puntatore lettura in modo circolare If Rpntrx > 5 Then Rpntrx = 1 End If Isrxsw = 1 ' Indica carattere ricevuto e prelevato Else Isrxsw = 0 ' Indica carattere non ricevuto End If End Sub ' Trasmette carattere su seriale sw, provvedendo a disabilitare gli interrupts ' in modo da non variare le temporizzazioni e quindi il frame del carattere ' in trasmissione. ' Ingresso: Ctxsw = carattere da trasmettere ' Uscita: Nulla Sub Txser_sw() Disable Interrupts ' Disabilitazione generale interrupt Put #1 , Ctxsw ' Trasmette carattere su seriale sw, associata a canale 1 Enable Interrupts ' Abilitazione generale interrupt End Sub ' Chiude e termina uso seriale sw. ' Nel sorgente le due istruzioni che seguono devono venire dopo tutte le ' istruzioni che usano la seriale sw. ' Ingresso: Nulla ' Uscita: Nulla Sub Closeser_sw() Close #1 ' Chiude canali associati alla seriale sw Close #2 End Sub '*********************** Procedure gestione console **************************** ' Procedura che restituisce il console status del dispositivo attualmente ' selezionato dalla variabile: Conssw = 0 -> linea seriale hw ' = 1 -> linea seriale sw ' nella variabile Ischr e l'eventuale carattere, nella variabile Chrx Sub Consolesta If Conssw = 0 Then ' Controlla dispositivo scelto Ischr = Ri ' Dispositivo = linea seriale hw: salva flag chr ricevuto da seriale hw If Ischr = 1 Then ' Se chr ricevuto da seriale hw Chrx = Udr ' Preleva chr ricevuto da seriale hw End If Else Call Isrxser_sw() ' Verifica e riceve carattere da seriale sw Ischr = Isrxsw ' Salva variabili per seriale sw su variabili per console Chrx = Crxsw End If End Sub ' Procedura che gestisce la console input di un carattere dal dispositivo ' attualmente selezionato dalla variabile: Conssw = 0 -> linea seriale hw ' = 1 -> linea seriale sw ' La procedura è scritta in BASCOM invece che in assembler in modo da ' semplificarne la scrittura e la comprensione: questa scelta peggiora le ' prestazioni di esecuzione, ma in modo accettabile. !Handle_consoleinp: Pushall ' Salva tutti i registri del microcontrollore If Conssw = 0 Then ' Controlla dispositivo scelto Do ' Dispositivo = linea seriale hw Loop Until Ri = 1 ' Attende ricezione chr da seriale hw Chrx = Udr ' Preleva chr ricevuto da seriale hw Else ' Dispositivo = linea seriale sw Do Call Isrxser_sw() ' Verifica e riceve carattere da seriale sw Loop Until Ischr = 1 ' Attende ricezione chr da seriale sw Chrx = Crxsw ' Copia chr ricevuto salvato in Crxsw End If Popall ' Ripristina tutti i registri del microcontrollore lds R24, {chrx} ' Restituisce chr ricevuto e salvato, in R24 Return ' Procedura che gestisce la console output di un carattere sul dispositivo ' attualmente selezionato dalla variabile: Conssw = 0 -> linea seriale hw ' = 1 -> linea seriale sw ' La procedura è scritta in BASCOM invece che in assembler in modo da ' semplificarne la scrittura e la comprensione: questa scelta peggiora le ' prestazioni di esecuzione, ma in modo accettabile. !Handle_consoleout: STS {Ctxsw},R24 ' Salva chr da inviare (salvato in R24) in Ctxsw Pushall ' Salva tutti i registri del microcontrollore If Conssw = 0 Then ' Controlla dispositivo scelto Do ' Dispositivo = linea seriale hw Loop Until Ti = 1 ' Attende trasmettitore seriale hw libero Udr = Ctxsw ' Invia chr (salvato in R24) su seriale hw Else ' Dispositivo = linea seriale sw Call Txser_sw() ' Trasmette carattere su seriale sw End If Popall ' Ripristina tutti i registri del microcontrollore Return '*********************** Procedure gestione QTP 03 **************************** ' Cancella tutto il display della QTP e riporta cursore in HOME ' Ingresso: Nulla ' Uscita: Nulla Sub Clear_qtp() Printbin 12 ' Manda comando cancella pagina: FF End Sub ' Setta tipo cursore della QTP in base al parametro passato ' Ingresso: Cur_qtp = tipo cursore (0->disattivo, 85->lampeggiante, 255->fisso) ' Uscita: Nulla Sub Cur_type_qtp(byval Cur_qtp As Byte) Select Case Cur_qtp Case 0 : Printbin Esc ; 80 ' Manda comando disattivazione cursore: ESC P Case 85 : Printbin Esc ; 81 ' Manda comando attivazione cursore lampeggiante: ESC Q Case 255 : Printbin Esc ; 79 ' Manda comando attivazione cursore fisso: ESC O End Select End Sub ' Setta Buzzer della QTP in base al parametro passato ' Ingresso: Buz_qtp = stato buzzer ("D"->disattivo, "I"->intermittente, "A"->attivo) ' Uscita: Nulla Sub Buz_attr_qtp(byval Buz_qtp As Byte) Printbin Esc ; 50 ; 255 Select Case Buz_qtp Case "D" : Printbin 0 ' Manda comando Buzzer disattivo: ESC 2 255 0 Case "I" : Printbin 85 ' Manda comando Buzzer intermittente: ESC 2 255 85 Case "A" : Printbin 255 ' Manda comando Buzzer attivo: ESC 2 255 255 End Select End Sub ' Posiziona cursore della QTP sulla posizione definita dai parametri passati, ' che partono da 1 ' Ingresso: Col_qtp = Colonna del cursore ' Row_qtp = Riga del cursore ' Uscita: Nulla Sub Pos_cur_qtp(col_qtp As Byte , Row_qtp As Byte) Printbin Esc ; 89 ' Manda comando posizionamento cursore: Hlpb = Row_qtp + 31 ' ESC Y r+32 c+32 Printbin Hlpb Hlpb = Col_qtp + 31 Printbin Hlpb End Sub ' Attende EEPROM della QTP pronta, con un timeout di sicurezza di circa 500 ' millisecondi ' Ingresso: Nulla ' Uscita: Nulla Sub Wt_eerdy_qtp() Tout = 0 ' Azzera contatore timeout Do Printbin Esc ; 51 ' Manda comando richiesta disponibilità EEPROM: ESC 3 Waitms 100 ' Attende tempo per ricezione risposta Call Consolesta ' Verifica se ricevuta risposta a comando Incr Tout ' Incrementa contatore timeout If Ischr = 1 Then ' Se risposta ricevuta: la controlla If Chrx = 6 Then ' Se EEPROM QTP pronta Tout = 6 ' Setta per uscita immediata End If End If Loop Until Tout >= 5 ' Ripete fino a EEPROM pronta o timeout scaduto End Sub ' Gestione pressione tasti QTP 03. Verifica se ci sono tasti premuti sulla ' QTP 03 ed in caso affermativo emette un avviso sonoro e rappresenta una ' ijndicazione sulla seconda riga del display. ' Ingresso: Nulla ' Uscita: Nulla Sub Keyp_qtp() Call Consolesta ' Verifica se tasto premuto su QTP 03 e lo preleva If Ischr = 1 Then ' Se tasto premuto Call Pos_cur_qtp(1 , 2) ' Posiziona cursore QTP su inizio seconda riga Print "Tasto QTP premuto:"; ' Rappresenta indicazione su display Printbin Chrx ' Aggiunge tasto premuto su display Select Case Chrx ' Controlla chr ricevuto=codice tasto premuto Case "1": ' Tasto 1 QTP premuto Printbin Bell ' Emette 1 beep con Buzzer QTP Case "2": ' Tasto 2 QTP premuto Printbin Bell ' Emette 2 beep con Buzzer QTP Waitms 200 ' Ritardo per separazione beep Printbin Bell Case "3": ' Tasto 3 QTP premuto Printbin Bell ' Emette 3 beep con Buzzer QTP Waitms 200 ' Ritardo per separazione beep Printbin Bell Waitms 200 Printbin Bell End Select End If End Sub '******************* Fine procedure usate dal programma ************************