Περιεχόμενα
Είσοδος
Αναζήτηση
Ποιοι είναι εδώ
Δημοσκόπηση
Parallax Οθόνη LCD
ΠΕΡΙΕΧΟΜΕΝΑ
- Εισαγωγή
- Διασύνδεση
- Ρύθμιση του ρυθμού Baud
- Εμφάνιση Κειμένου
- Εμφάνιση Αριθμών με Formatters
- Χαρακτήρες Ελέγχου – Χειρισμός Θέσης Κέρσορα
- Ολίσθηση κειμένου
- Προγραμματίζοντας ένα Κυλιόμενο Παράθυρο (Sliding Window)
- Χαρακτήρες ορισμένοι από τον χρήστη (Custom Characters)
- Χαρακτήρες ASCII
Εισαγωγή
To τερματικό debug ουκ ολίγες φορές είναι χρήσιμο για να εμφανίζουμε αποτελέσματα πράξεων και εντολών στην οθόνη ή ακόμη και να θέτουμε τον Basic Stamp σε «λειτουργία» εκσφαλμάτωσης. Ωστόσο κάτι τέτοιο απαιτεί την διασύνδεση του μικροελεγκτή με έναν ηλεκτρονικό υπολογιστή. Σε περιπτώσεις που δεν δύναται η διασύνδεση του Basic Stamp με ηλεκτρονικό υπολογιστή και θέλουμε να λειτουργεί αυτόνομα, σε βιομηχανικές εφαρμογές που φέρουν αισθητήρια όργανα ή ρομπότ που λειτουργούν ενεργειακά αυτόνομα όπως στην περίπτωση της πτυχιακής εργασίας θέλουμε τα αποτελέσματα να φαίνονται κάπου χωρίς να έχουμε το ρομπότ συνδεδεμένο ανά πάσα στιγμή σε έναν υπολογιστή. Έτσι θα χρησιμοποιήσουμε μια LCD οθόνη.
Στις παρακάτω εικόνες βλέπουμε διάφορες LCD οθόνες. Είναι πολύ εύκολο κανείς να αντιληφθεί την χρησιμότητα αυτών των οθονών που συναντάμε από ρολόγια χειρός έως φορητούς υπολογιστές και ψηφιακούς παλμογράφους! Οι εφαρμογές τους είναι άπειρες και μας διευκολύνουν στην καθημερινότητα.
Εικόνα 1 Παραδείγματα Οθόνης LCD
Συνεπώς φανταστείτε πόσο διαφορετικό είναι ένα κύκλωμα το οποίο φέρει μια τέτοια οθόνη από ένα που είναι απλό χωρίς εξόδους προς τον χρήστη. Ακόμη και τα projects ενός Basic Stamp γίνονται διαδραστικά και ο χρήστης έχει μια πιο «άμεση» επικοινωνία ακόμη και με τα πιο χαμηλού επιπέδου υποσυστήματα του μικροελεγκτή.
Οι οθόνες LCDs της parallax είναι αρκετά λειτουργικές χαμηλού κόστους και μπορούν πολύ εύκολα να προστεθούν και να ελεγχθούν από έναν Basic Stamp μικροελεγκτή. Οι οθόνες LCDs είναι είτε 2 γραμμών και 16 χαρακτήρων είτε 4γραμμών και 16 χαρακτήρων και παρέχουν αναδίπλωση κειμένου ώστε το κείμενο να εμφανίζεται σωστά στην οθόνη. Επιπλέον οι σειριακές αυτές οθόνες παρέχουν στον χρήστη τον πλήρη έλεγχο πάνω στις βασικές και στις πιο εξελιγμένες λειτουργίες τους επιτρέποντας του να μετακινήσει τον κέρσορα οπουδήποτε στην οθόνη με μια εντολή ή να ανοίξει και να κλείσει την οθόνη πάλι με μια εντολή. Υποστηρίζουν τους ίδιους ακριβώς χαρακτήρες που υποστηρίζει κ το τερματικό της εντολής Debug στην οθόνη του υπολογιστή(Δεκαδικό ASCII 32-127). Επίσης δίνει την δυνατότητα στο χρήστη να ορίσει έως και 8 δικούς του χαρακτήρες (custom characters) και να εμφανίζονται οπουδήποτε επιθυμεί στην οθόνη. Οι οθόνες LCD είναι συνήθως παράλληλες και απαιτούν σε μια τυπική διασύνδεση με τον μικροελεγκτή 6 pins I/O. Ωστόσο η Parallax κατάφερε να δημιουργήσει μια σειριακή οθόνη βάζοντας έναν μικροελεγκτή ώστε να μετατρέπει τα σειριακά μηνύματα που έρχονται από τον Basic Stamp σε μορφή παράλληλη που αναγνωρίζει η οθόνη. Έτσι κατάφεραν να μειώσουν τα pins σε 3! Δύο για την τροφοδοσία και ένα για την επικοινωνία.
Διασύνδεση
Για την διασύνδεση της LCD όπως λέχθηκε παραπάνω χρειάζονται μονάχα 3 pins παρακάτω φαίνεται το σχηματικό διάγραμμα και αναλύονται στα παρακάτω σχήματα το μέγεθος και οι μηχανικές λεπτομέρειες για την τοποθέτηση της οθόνης.
Εικόνα 2 Διασύνδεση οθόνης με τον Basic Stamp
Ο πίνακας παρακάτω δείχνει τις απαιτήσεις τάσης και ρεύματος μιας σειριακής LCD με τον φωτισμό της ανοιχτό και κλειστό. Από την στιγμή που το ρεύμα που απαιτεί για την λειτουργία της ξεπερνά τις δυνατότητες του Basic Stamp module θα πρέπει να τροφοδοτήσει ο χρήστης την οθόνη με εξωτερική τροφοδοσία τάσης 5 Volt και φυσικά να ικανοποιεί και τις ανάγκες ρεύματος αυτής.
Εικόνα 3 Πίνακας Τάσης και Ρεύματος που χρειάζονται οι LCD
Εικόνα 4 Διαστάσεις και Στοιχεία Τοποθέτησης
Ρύθμιση του ρυθμού Baud
Αφότου συνδέσουμε την οθόνη θα πρέπει να επιλέξουμε τον ρυθμό μεταγωγής χαρακτήρων (Baud rate) με τον οποίο θα στέλνουμε τα δεδομένα από τον Basic Stamp στην οθόνη. Οι υποστηριζόμενοι ρυθμοί είναι τρεις 2,400, 9,600 και 19,200 Baud. Για να επιλέξουμε ποιον ρυθμό baud θα χρησιμοποιήσουμε πρέπει να θέσουμε τους διακόπτες που βρίσκονται στο πίσω μέρος της οθόνης στις αντίστοιχες θέσεις. Στον παρακάτω πίνακα φαίνονται οι αντιστοιχίες των θέσεων των διακοπτών με την ρυθμό μεταγωγής δεδομένων που δείχνει η κάθε μια.
| MODE | SW1 | SW2 |
| TEST | OFF | OFF |
| 2.400 | ON | OFF |
| 9.600 | OFF | ON |
| 19.200 | ON | ON |
Εικόνα 5 Πισω μέρος Οθόνης LCD
Ο παραπάνω πίνακας δείχνει μια κατάσταση που ονομάζεται TEST. Εάν θέσουμε τους δύο διακόπτες σε κατάσταση OFF, δηλαδή θέσουμε το TEST MODE στην οθόνη μας θα εμφανιστεί το κείμενο
Parallax, Inc.
www.parallax.com
Αυτό είναι το δοκιμαστικό κείμενο που επιβεβαιώνει την καλή λειτουργία της οθόνης και δείχνει πως οι συνδέσεις έγιναν σωστά. Επιπλέον μας επιτρέπει να αυξομειώσουμε την φωτεινότητα (contrast) της οθόνης με το ποτενσιόμετρο που φέρει στο πίσω μέρος και φαίνεται στο σχήμα παραπάνω ως ένας μπλε κύβος με μία βίδα στη μέση. Αφότου τελειώσουμε όλες αυτές τις διαδικασίες αρχικοποίησης- ρύθμισης μπορούμε να επιλέξουμε τον επιθυμητό ρυθμό που θα χρησιμοποιήσουμε στην εφαρμογή μας.
Εμφάνιση Κειμένου
Αφού πλέον ο χρήστης έχει καθορίσει τις ρυθμίσεις η οθόνη είναι έτοιμη να λάβει κείμενο. Για να εμφανίσουμε έναν χαρακτήρα αρκεί να στείλουμε τον κωδικό ASCII του χαρακτήρα ή τον ίδιο τον χαρακτήρα μέσα σε « » στην σειριακή θύρα που έχουμε ορίσει να λειτουργεί ως θύρα αποστολής στο σωστό baud rate.
Όταν η οθόνη λάβει έναν χαρακτήρα τον εμφανίζει στην τρέχουσα θέση του κέρσορα και μετακινεί τον κέρσορα κατά μία θέση δεξιά. Όταν ανοίγουμε για πρώτη φορά την LCD ο κέρσορας βρίσκεται στην πρώτη γραμμή και στην ακραία αριστερή θέση όπως συνηθίζεται.
Αν στείλουμε στην οθόνη σειρά αλφαριθμητικών αντί για έναν μόνο χαρακτήρα παρατηρούμε ότι αν η σειρά ξεπερνά το πλήθος χαρακτήρων που μπορεί να πάρει μια σειρά στην οθόνη (16 χαρακτήρες στην δική μας περίπτωση) τότε το κείμενο αναδιπλώνεται στην επόμενη γραμμή αυτόματα. Αυτό θα γίνεται συνεχώς και η αναδίπλωση θα συνεχίζεται στις επόμενες γραμμές έως ότου γεμίσει η οθόνη και η τελευταία γραμμή θα αναδιπλωθεί στην αρχή δηλαδή στην πρώτη γραμμή. Συνεπώς κανένας χαρακτήρας από αυτούς που ορίζει και στέλνει ο χρήστης δεν πρόκειται να χαθεί αφού σε κάθε περίπτωση εμφανίζεται το κείμενο στην οθόνη. Ωστόσο αυτό δεν σημαίνει ότι θα είναι πάντα και το επιθυμητό αποτέλεσμα αφού αναδιπλώνεται αυτόματα. Για να ελεγχθεί κάτι τέτοιο υπάρχουν τρόποι να ορίσουμε συγκεκριμένες θέσεις εκτυπώσεις κτλ πράγματα που θα αναλύσουμε παρακάτω.
Όπως αναφέρθηκε μπορούμε να στείλουμε αριθμούς, κείμενο, ειδικούς χαρακτήρες διαμόρφωσης ή και δικούς μας χαρακτήρες στην οθόνη, σε σειριακή μορφή με τον τρόπο που λειτουργεί η εντολή DEGUB στον υπολογιστή. Στην ουσία η εντολή DEBUG είναι μια ειδική περίπτωση μιας πιο γενικής εντολής που ονομάζεται SEROUT. Η εν λόγω εντολή έχει πολλές χρήσεις μερικές από τις οποίες περιλαμβάνουν την αποστολή μηνυμάτων σε σειριακές LCDs , επικοινωνία μεταξύ δύο Basic Stamp επεξεργαστών και υπολογιστών. Έτσι παρακάτω θα δείξουμε μερικά παραδείγματα αυτής της εντολής για να κατανοήσουμε πως μπορούν να σταλούν αριθμοί, χαρακτήρες ελέγχου κτλ. Επιπλέον πρέπει να αναφερθεί ότι οι χαρακτήρες είναι όμοιοι με αυτούς που χρησιμοποιούνται για την εντολή DEBUG. Όσον αφορά βέβαια τους χαρακτήρες ελέγχου είναι διαφορετικοί αλλά σύντομα ο αναγνώστης θα δύναται να αντιστοιχεί τις παραμέτρους CR, CLS, HOME και CRSRXY της εντολής DEBUG με τους αντίστοιχους χαρακτήρες ελέγχου για να πραγματοποιεί διαμόρφωση στην έξοδο της οθόνης.
Αντιθέτως με το τερματικό της εντολής Debug που εμφανίζεται στον ηλεκτρονικό υπολογιστή και δεν θέλει καμία παράμετρο αρχικοποίησης το LCD πρέπει πριν από την χρήση του να ανοίξει. Έτσι πρέπει ο χρήστης να στείλει την τιμή 22 από τον Basic Stamp στην οθόνη για να την ενεργοποιήσει.
Παράδειγμα : SEROUT 14,84,[22]
H SEROUT όπως φαίνεται έχει τρεις παραμέτρους. Η πρώτη παράμετρος επιτρέπει στον χρήστη να δηλώσει τον αριθμό PIN που θέλει να ενεργοποιήσει για την αποστολή δεδομένων σειριακά. Το PIN τίθεται σε κατάσταση Εξόδου. Επιπλέον μπορούμε να ορίσουμε και για έξοδο το PIN 16 το οποίο είναι ανύπαρκτο σε φυσική μορφή και αν κάνουμε κάτι τέτοιο ο Basic Stamp θα στείλει δεδομένα από το PIN 1 που χρησιμοποιείται συνήθως κατά την διαδικασία κατεβάσματος. Η δεύτερη παράμετρος είναι ο ρυθμός αποστολής χαρακτήρων το γνωστό Baud Rate που είναι το 84 (αντιστοιχεί σε ρυθμό μετάδοσης 9600) και τέλος μέσα σε αγκύλες είναι το κείμενο που θέλουμε να στείλουμε. Στην προκειμένη περίπτωση η τιμή 22 είναι ένα παράδειγμα χαρακτήρα ελέγχου για το άνοιγμα της οθόνης.
Εδώ θα κάνουμε μια αναφορά στην σειριακή επικοινωνία καθώς θεωρείται η πιο δημοφιλής για την σύνδεση ηλεκτρονικών συσκευών μεταξύ τους. Δύο είναι οι βασικοί τύποι σειριακής επικοινωνίας. Η σύγχρονη και η ασύγχρονη. Η εντολή SEROUT λειτουργεί με την αρχή του Ασύγχρονης επικοινωνίας και στέλνει έτσι τα δεδομένα. Κατά την Ασύγχρονη επικοινωνία όλα βασίζονται στον ακριβή χρονισμό. Δηλαδή και ο αποστολέας και ο παραλήπτης έχουν ρυθμιστεί να στέλνουν δεδομένα σε όμοιους χρόνους. Αυτό εκφράζεται συνήθως ως ρυθμός αποστολής bit στην μονάδα του χρόνου και μετράται ως bits per seconds εφόσον δηλώνει τον αριθμό bits που στέλνονται από τον αποστολέα στον παραλήπτη σε ένα δευτερόλεπτο. Θα λέγαμε ότι αυτό είναι η ταχύτητα της επικοινωνίας μεταξύ των δύο. Κατ΄ επέκταση αυτό το μέγεθος δηλώνει το baud rate που είναι ο αριθμός χαρακτήρων που στάλθηκαν σειριακά στη μονάδα του χρόνου.
Χωρίς να ορίσουμε τον ρυθμό αποστολής χαρακτήρων (baudrate) στις παραμέτρους της εντολής SEROUT αυτή δεν πρόκειται να λειτουργήσει. Όπως προαναφέρθηκε ήδη κατά την αρχικοποίηση μιας LCD οθόνης ρυθμίσαμε το baud rate. Έτσι για να δείξουμε στην SEROUT τα βασικά χαρακτηριστικά με τα οποία θα επικοινωνήσει με την LCD χωρίς προβλήματα και αδιάκοπα πρέπει να ορίσουμε αυτή τη παράμετρο.
Παρακάτω φαίνεται ο πίνακας που δίνει η Parallax.
|
Baud Rate (Ρυθμός Baud) |
8-bit No Parity INVERTED |
8-bit No Parity TRUE |
7-bit Even Parity INVERTED |
7-bit Even Parity TRUE |
| 300 | 19697 | 3313 | 27889 | 11505 |
| 600 | 18030 | 1646 | 26222 | 9838 |
| 1200 | 17197 | 813 | 25389 | 9005 |
| 2400 | 16780 | 396 | 24972 | 8588 |
| 4800 | 16572 | 188 | 24764 | 8380 |
| 9600 | 16468 | 84 | 24660 | 8276 |
Στην πρώτη στήλη αναγράφεται ο ρυθμός Baud που θέλουμε να χρησιμοποιήσουμε και στις διπλανές στήλες αναγράφονται οι τιμές που αντικατοπτρίζουν με έναν αριθμό τις ρυθμίσεις των flags που πρέπει να γίνουν ώστε να πραγματοποιηθεί σειριακή επικοινωνία μεταξύ του BS2 και μιας οθόνης LCD ή κάποια άλλη συσκευή. Για παράδειγμα για να χρησιμοποιήσουμε ρυθμό 9600 baud με 8 data bits χωρίς Bit Ισοτιμίας θα δώσουμε στην εντολή SEROUT στην παράμετρο που έχει για Baud την τιμή 84. Ο πίνακας αυτός δημιουργήθηκε από την εταιρία για να έχουμε τον πλήρη έλεγχο της σειριακής επικοινωνίας και να παραμετροποιούμε άμεσα και απλά το πλήθος των τιμών που χρειάζονται για μια σειριακή επικοινωνία. Δηλαδή εκτός από το Baud με μια τιμή να ρυθμίζουμε και το πλήθος των bits που θέλουμε να αποτελούν ένα χαρακτήρα (π.χ. 7 ή 8) το αν θα έχουμε bit Ισοτιμίας κτλ.
Για παράδειγμα θα μπορούσαμε να εκτυπώσουμε ένα αλφαριθμιτικό από το PIN 14 στην LCD με ρυθμό 9600 baud, bits Δεδομένων 8 και χωρίς ισοτιμία δίνοντας την εντολή SEROUT 14,84,[“Hello World”]
Εν γένει και προς χάριν των παραδειγμάτων αλλά και στην πράξη για το ρομπότ θα χρησιμοποιήσουμε την τιμή 84 γιατί θα στέλνουμε σε ρυθμό 9600 baud αλλά και γιατί τα 8 bits δεδομένων χωρίς bit ισοτιμίας είναι μια πολύ συνηθισμένη μορφή.
Παραπάνω δόθηκε μια αναφορά στους χαρακτήρες ελέγχου. Εκτός από το 22 που είναι για το άνοιγμα της οθόνης υπάρχουν και άλλοι. Για παράδειγμα σε οθόνες που έχουν φωτισμό τις λεγόμενες Backlit LCD της Parallax υπάρχουν οι χαρακτήρες 17 που είναι για το άνοιγμα του φωτισμού και 18 για το κλείσιμο αντίστοιχα. Εκτός αυτών συνηθίζεται και θεωρείται καλή τακτική κατά το άνοιγμα μια οθόνης με τον χαρακτήρα ελέγχου 22 να αρχικοποιούμε την οθόνη καθαρίζοντας την με την παράμετρο 12. Και συνήθως χρειάζεται και μια παύση των 5 miliseconds για να ολοκληρωθεί η διαδικασία.
Έτσι έχουμε την εντολή:
SEROUT 14,84,[22,12]
PAUSE 5
Ας δούμε τώρα και μια αντιστοιχία της εντολής DEBUG του Τερματικού στον υπολογιστή με την εντολή SEROUT στην LCD. Θα εκτυπώσουμε ένα αλφαριθμητικό και θα αλλάξουμε γραμμή.
DEBUG "Βλέπετε το Κείμενο",CR,"To Debug Δουλεύει"
SEROUT 14,84,[“ Βλέπετε το Κείμενο",12,"H LCD Δουλεύει"]
Θα μπορούσαμε να βελτιώσουμε το αποτέλεσμα της παραπάνω εντολής αν βάζαμε και χαρακτήρες ελέγχου ώστε να αρχικοποιηθεί η LCD δηλαδή να γίνει και καθαρισμός της οθόνης εκτός από εκτύπωση.
Έτσι έχουμε:
SEROUT 14,84,[22,12]
PAUSE 5
SEROUT 14,84,[“ Βλέπετε το Κείμενο",12,"H LCD Δουλεύει"]
Ένα άλλο απλό παράδειγμα με χαρακτήρες ελέγχου είναι το παρακάτω όπου ανοιγοκλείνουμε μια οθόνη.
DO
PAUSE 600
SEROUT 14,84,[22]
PAUSE 400
SEROUT 14,84,[21]
LOOP
Έτσι η οθόνη μας θα αναβοσβήνει παραμένοντας ανοιχτή για 400msecond και κλειστή για 600. Θα μπορούσαμε να βάλουμε άλλη μια εντολή κειμένου κάτω από την SEROUT με παράμετρο 22 ώστε να εμφανίζεται κάποιο κείμενο κατά την διάρκεια που η οθόνη είναι ανοιχτή.
Εμφάνιση Αριθμών με Formatters
Οι περισσότεροι Formatters που χρησιμοποιούνται στο Τερματικό DEBUG μπορούν επίσης να χρησιμοποιηθούν με την σειριακή LCD οθόνη της Parallax. Ο διαμορφωτής DEC είναι συνήθως ο πιο χρήσιμος για την εκτύπωση αριθμών αλλά μπορούν εξίσου να χρησιμοποιηθούν οι διαμορφωτές DIG, REP ASC , SDEC και οι περισσότεροι από τους άλλους. Για παράδειγμα αν θέλουμε να εκτυπώσουμε την ακέραια τιμή ενός μετρητή (μεταβλητή) ονομαζόμενος counter μπορούμε να χρησιμοποιήσουμε μια εντολή όπως αυτή : SEROUT 14,84, [DEC counter]
Πιο πρακτικά ας δούμε το παρακάτω παράδειγμα όπου θέτουμε σε εφαρμογή τον μετρητή μέσα από μια δομή επανάληψης και εκτυπώνουμε κάθε φορά την τιμή που αυτός παίρνει.
Counter VAR Byte
SEROUT 14,84,[22,12]
PAUSE 5
FOR counter=0 TO 12
SEROUT 14,84,[DEC counter," "]
PAUSE 500
NEXT
END
Το αποτέλεσμα που θα παίρναμε από το παραπάνω κομμάτι κώδικα φαίνεται στην παρακάτω εικόνα.
Εικόνα 6 Αποτελέσματα παραπάνω κώδικα
Η LCD στο παρόν παράδειγμα είναι μόνο δύο γραμμών και 8 χαρακτήρων. Έτσι βλέπουμε πως το κείμενο όταν ξεπερνά το μέγεθος χαρακτήρων που χωρά μια γραμμή αυτόματα αναδιπλώνεται στην κάτω γραμμή. Σε περίπτωση που το κείμενο ήταν ακόμη μεγαλύτερο από ότι χωράει και στην οθόνη δηλαδή χρειαζόταν και μια τρίτη γραμμή σε περίπτωση δηλαδή που στην εντολή FOR βάζαμε τον counter να φτάνει σε τιμές μεγαλύτερες του 14 το κείμενο πάλι θα αναδιπλωνόταν αλλά αυτή τη φορά από την πρώτη γραμμή και θα αντικαθιστούσε τους χαρακτήρες που ήδη γράφτηκαν στην πρώτη σειρά κ.ο.κ.
Χαρακτήρες Ελέγχου – Χειρισμός Θέσης Κέρσορα
Όταν στέλνουμε έναν χαρακτήρα στην οθόνη ο χαρακτήρας εκτυπώνεται στην τρέχουσα θέση του κέρσορα και αμέσως μετά ο κέρσορας μετακινείται μία θέση δεξιότερα. Σχετικά με αυτό υπάρχουν και κάποιοι χαρακτήρες ελέγχου για να χειριζόμαστε την θέση που βρίσκεται ο κέρσορας και το που θέλουμε να εκτυπώσουμε έναν χαρακτήρα. Σε αυτούς συμπεριλαμβάνονται το backspace (μετατόπιση αριστερά), η μετατόπιση δεξιά, η αλλαγή γραμμής κτλ.
Η εντολή της μετατόπισης αριστερά ( backspace) ορίζεται από τον ακέραιο αριθμό DEC 8 ως παράμετρος στην εντολή SEROUT, ενώ η εντολή της μετατόπισης δεξιά ορίζεται ως τον ακέραιο αριθμό DEC 9. Αυτές είναι πολύ χρήσιμες εντολές για να μετακινούμε τον κέρσορα οπουδήποτε θέλουμε και να αντικαθιστούμε ένα συγκεκριμένο κείμενο. Εκτός αυτού οι εντολές αυτές έχουν την δυνατότητα να αναδιπλώνουν και τον κέρσορα, δηλαδή αν φτάσουμε στο τέλος μιας γραμμής και δώσουμε τον αριθμό DEC 9 o κέρσορας θα πάει στην αριστερότερη θέση της επόμενης γραμμής. Αν πάλι είμαστε στην τελευταία γραμμή θα μετατοπιστεί στην ακραία αριστερή θέση της πρώτης γραμμής. Με τον ακέραιο αριθμό DEC 13 ορίζουμε την αλλαγή γραμμής, αλλά επίσης ο κέρσορας μετακινείται στην αριστερότερη θέση αυτής. Άλλη μια πολύ βασική εντολή χειρισμού θέσης κέρσορα είναι η εντολή για αρχικοποίηση της οθόνης. Αυτή ενεργοποιείται με τον ακέραιο αριθμό DEC 12 και έχει αποτέλεσμα να διαγράφονται τα πάντα από την οθόνη και ο κέρσορας να μετακινείται στην ακραία αριστερή θέση στην πρώτη γραμμή. Έχει δηλαδή το ίδιο αποτέλεσμα με την εντολή ανοίγματος της οθόνης χωρίς να στείλουμε περαιτέρω χαρακτήρες. Εκτός από την τελευταία εντολή που αναφέραμε καμία από τις παραπάνω δεν επηρεάζει τους χαρακτήρες που είναι ήδη στην οθόνη παρά μόνο αν στείλει ο χρήστης νέους χαρακτήρες προς αντικατάσταση.
Επιπλέον υπάρχουν και χαρακτήρες απευθείας κίνησης του κέρσορα σε συγκεκριμένα σημεία στην οθόνη. Οι εντολές αυτές για την οθόνη 4 γραμμών και 0 χαρακτήρων έχουν εμβέλεια από τον ακέραιο DEC 128 έως τον ακέραιο DEC 207 και μπορούν να μετακινήσουν τον κέρσορα σε 20 διαφορετικές θέσεις της κάθε γραμμής στην οθόνη. Στον πίνακα που ακολουθεί φαίνεται για κάθε τιμή που παίρνει το DEC ποια θα είναι η αντίστοιχη θέση στην οθόνη. Δίνεται επίσης και στην δεύτερη στήλη του ο αντίστοιχος δεκαεξαδικός αριθμός για κάθε ακέραιο.
Στην παρακάτω εικόνα μπορούμε να δούμε μια αντιστοιχία των ακέραιων αυτών αριθμών σε θέσεις σε μια LCD δύο γραμμών. Αντίστοιχα ισχύουν και για μια LCD 4 γραμμών, σύμφωνα με τον πίνακα που δείξαμε.
Εικόνα 7 Αντιστοιχίες Ακεραίων με θέσεις στην οθόνη
Ας δούμε τώρα ένα παράδειγμα. Θα εμφανίσουμε εδώ ένα αλφαριθμητικό κατά μήκος της πρώτης γραμμής με καθυστέρηση από χαρακτήρα σε χαρακτήρα 200ms. Η εντολή θα εμφανίσει τους χαρακτήρες “L”, “I”, “N”, “E”, ”-“ και “1”με απόσταση ίση μεταξύ τους κατά μήκος της πρώτης γραμμής με εμφάνιση ένα χαρακτήρα ανά 200 mseconds.
SEROUT 14,84, 200, [128, “L”,131,”I”,134,”N”,137,”E”,140,”-“,143,”1”]
Τώρα έστω ότι θέλουμε να εκτυπώσουμε κείμενο σε διαφορετική γραμμή ή να αρχίσουμε από την δεύτερη ή Τρίτη γραμμή χωρίς να χρησιμοποιήσουμε το Enter αλλά με τους ακεραίους που εξετάζουμε.
Τώρα για παράδειγμα αν θέλουμε να εκτυπώσουμε την έκφραση “ALL DONE” και το ΑLL να εμφανίζεται στην αρχή της πρώτης γραμμής ενώ το DONE στην μέση της τρίτης, θα μπορούσαμε να δώσουμε την εντολή:
SEROUT 14, 84, [148,”ALL”, 174,”DONE”]
Επίσης θα μπορούσαμε με τις εντολές αυτές να κάνουμε κείμενο να ολισθαίνει από ένα σημείο της γραμμής σε ένα άλλο. Για παράδειγμα ο παρακάτω κώδικας κάνει το κείμενο που εμφανίζεται στην 2η γραμμή να κινείται από τα δεξιά στα αριστερά:
FOR index = 9 TO 0
SEROUT 14, 84, [148 + index, "Line-2 "]
PAUSE 250
NEXT
και ο παρακάτω κώδικας κάνει το ίδιο κείμενο να κινείται από αριστερά προς δεξιά στην ίδια γραμμή:
FOR index = 0 TO 9
SEROUT 14, 84, [148 + index, " Line-2"]
PAUSE 250
NEXT
Θα μπορούσαμε να συνδιάσουμε τα δύο παραπάνω κομμάτια κώδικα μέσα σε έναν ατέρμον βρόχο DO LOOP και να κάνουμε το κείμενο να κινείται από αριστερά προς δεξιά και από δεξιά προς αριστερά συνεχόμενα.
Για να διαγράψουμε χαρακτήρες όπως είδαμε από όλα τα προηγούμενα παραδείγματα και θεωρίες πρέπει να μετακινήσουμε τον κέρσορα στο σημείο που μας ενδιαφέρει και να στείλουμε προς εκτύπωση το κενό, δηλαδή τον χαρακτήρα “ “.
Ολίσθηση κειμένου
Πολλές φορές θέλουμε να εμφανίσουμε σε μια οθόνη στην ίδια γραμμή περισσότερους χαρακτήρες από ότι αυτή χωράει. Έτσι χρησιμοποιούμε την ολίσθηση. Με την ολίσθηση το κείμενο ξεκινά από την ακραία δεξιά θέση μιας γραμμής και κινείται προς τα αριστερά έναν χαρακτήρα την φορά.
Εικόνα 8 Κείμενο μεγαλύτερο από την χωρητικότητα γραμμής της οθόνης
H μέθοδος ολίσθησης που θα αναλύσουμε και θα χρησιμοποιήσουμε σε κάποια παραδείγματα είναι διαφορετική από αυτήν που προαναφέρθηκε στο παράδειγμα με την δεύτερη γραμμή που εμφανίζει το κείμενο “Line-2”. Ο βασικός λόγος ότι είναι διαφορετική είναι ότι σε μεγάλα αλφαριθμητικά η LCD της Parallax εφαρμόζει αυτόματα την αναδίπλωση κειμένου, πράγμα που θέλουμε να αποφύγουμε στην προκειμένη περίπτωση.
Κατά την ολίσθηση ο πρώτος χαρακτήρας εκτυπώνεται στην δεξιότερη θέση της οθόνης στην γραμμή που επιθυμούμε. Μετά από μια μικρή καθυστέρηση το πρόγραμμα μετακινεί τον κέρσορα στην δεύτερη θέση από τα δεξιά και τυπώνει στην οθόνη και τον πρώτο χαρακτήρα αλλά και τον δεύτερο. Η διαδικασία συνεχίζεται με τον ίδιο τρόπο έως ότου εκτυπωθούν όλοι οι χαρακτήρες που χωρούν στην γραμμή σε πρώτη φάση και ο κέρσορας φτάσει στο αριστερότερο άκρο της ίδιας γραμμής. Τότε ο κέρσορας χρειάζεται να κάνει συνεχώς αυτή την κίνηση από δεξιά προς τα αριστερά μέχρις ότου εκτυπωθούν όλοι οι χαρακτήρες που περιλαμβάνει το αλφαριθμητικό.
Η προγραμματιστική μέθοδος που θα αναλύσουμε ονομάζεται κυλιόμενο παράθυρο (sliding-window). Εκτός ότι αποτελεί μια πολύ χρήσιμη μέθοδος για το LCD της Parallax η μέθοδος αυτή χρησιμοποιείται για όταν κάνουμε scroll με της πλαϊνές μπάρες για να αλλάξουμε σελίδα ή να μετακινηθούμε αριστερά ή δεξιά σε προγράμματα όπως τον Basic Stamp Editor, τον επεξεργαστή κειμένου Word, τον browser Internet Explorer κτλ. Επιπλέον χρησιμοποιείται και σε προγράμματα που εκπέμπουν και συλλέγουν TCP/IP πακέτα. Έτσι πλέον γνωρίζετε ότι κάθε φορά που τρέχετε ένα πρόγραμμα με πλαϊνές μπάρες κύλισης τρέχουν από πίσω περισσότερα από ένα κομμάτι κώδικα τύπου sliding-window στο background.
Προγραμματίζοντας ένα Κυλιόμενο Παράθυρο (Sliding Window)
Μπορούμε να χρησιμοποιήσουμε κυλιόμενο κείμενο ώστε να εκτυπώσουμε έν μεγάλο μήνυμα σε μια οθόνη λίγων χαρακτήρων. Ας υποθέσουμε ότι έχουμε ένα «παράθυρο» 4 χαρακτήρων στην πρώτη γραμμή γιατί θέλουμε να εκτυπώνουμε και άλλα πράγματα ταυτόχρονα στις υπόλοιπες θέσεις της γραμμής. Ο σκοπός μας είναι να εκτυπώνουμε ολισθαίνοντας το κείμενο μέσα σε αυτό το παράθυρο, προσέχοντας κάθε φορά να μην αντικαταστήσουμε κανέναν χαρακτήρα (δηλαδή χωρίς να χαθεί κανένας χαρακτήρας). Στις παρακάτω εικόνες φαίνεται η πρώτη φάση αρχικοποίησης της μεθόδου και το βήμα 0 αυτής.
Εικόνα 9 Αρχικοποίηση και βήμα 0 μεθόδου Sliding - Window
Αφού περάσει μια χρονική στιγμή ο χαρακτήρας “M” μετακινείται αριστερότερα κατά μια θέση δηλαδή στην θέση 136 και τοποθετείται στην θέση 137 ο χαρακτήρας “e”. Είμαστε τώρα στο βήμα 1. Αφού εκτυπωθούν αυτοί οι χαρακτήρες μετακινούνται κατά μια θέση αριστερά και εκτυπώνεται στην θέση 137 ο χαρακτήρας “s”, ο χαρακτήρας “M” βρίσκεται πλέον στην θέση 135 και ο χαρακτήρας “e” στη θέση 136. Είμαστε πλέον στο βήμα 2. Παρακάτω στις εικόνες φαίνονται αυτά τα δύο βήματα και αποτελούν συνέχεια των 2 πρώτων εικόνων.
Εικόνα 10 Μέθοδος Sliding -Window βήματα 1 και 2
Στο επόμενο βήμα μετακινούμε τον κέρσορα στην θέση 134 και εκτυπώνουμε από εκεί και μετά την λέξη οπότε έχουμε συμπληρώσει πλήρως το παράθυρο και έχουμε μέσα την φράση “Mess”. Στο βήμα 4 τώρα, το “M” μένει εκτός παραθύρου και εκτυπώνεται η φράση “essa”. Εδώ ο κέρσορας δεν μετακινείται αριστερότερα αλλά διατηρεί την θέση του και απλά μετατοπίζονται από εδώ και στο εξής οι χαρακτήρες. Στις παρακάτω εικόνες φαίνονται όσα είπαμε παραπάνω.
Εικόνα 11 Μέθοδος Sliding - Window βήματα 3 και 4
Ο κέρσορας πλέον παραμένει στην θέση 134 και οι χαρακτήρες από 2 έως 5 συνεχίζουν την διαδικασία στο βήμα 5 πλέον. Αυτή η ακολουθία χαρακτήρων ορίζεται από την κεφαλή και την ουρά (Head and Tail characters). Το παράθυρο συνεχίζει να «ολισθαίνει» και το αναφέρουμε σε εισαγωγικά γιατί στην ουσία ολισθαίνουν οι χαρακτήρες μέσα σε αυτό για τα επόμενα βήματα με τον ίδιο τρόπο ώσπου φτάσουμε 9 που εκτυπώνεται και ο τελευταίος χαρακτήρας και 10 που εκτυπώνονται οι τελευταίοι κενοί χαρακτήρες. Αυτά φαίνονται στις επόμενες εικόνες.
Εικόνα 12 Μέθοδος Sliding - Window βήματα 9 και 10
Θα εξετάσουμε τώρα ένα κομμάτι κώδικα που υλοποιεί την μέθοδο που αναλύσαμε.
Ονομασία Προγράμματος : ScrollMessage.bs2
' Ολίσθηση κειμένου σε παράθυρο 4 χαρακτήρων σε μια LCD
' {$STAMP BS2} ' BASIC Stamp Directive
' {$PBASIC 2.5} ' PBASIC Directive
MessageStart DATA @ 2, "Message " ' Μήνυμα και 4 κενοί χαρακτήρες
MessageEnd DATA
cursorStart VAR Byte ' Θέση πρώτου Χαρακτήρα
head VAR Byte ' Αρχή του εμφανιζόμενου κείμενου
tail VAR Byte ' Τέλος του εμφανιζόμενου κειμένου
pointer VAR Byte ' Δείκτης διεύθυνσης EEPROM
character VAR Byte ' Αποθήκευση ενός χαρακτήρα
SEROUT 14, 84, [22, 12] ' Άνοιγμα και καθαρισμός οθόνης
PAUSE 5 ' Καθυστέρηση τάξεως 5 mseconds
cursorStart = 137 ' Δεξιότερος χαρακτήρας του παραθύρου
head = 0 ' Αρχικοποίηση κεφαλιού και ουράς
tail = 0 ' του μηνήματος
DO WHILE tail < (MessageEnd - MessageStart) ' Βρόχος Ολίσθησης
SEROUT 14, 84, [cursorStart] ' Τοποθέτηση κέρσορα στην δεξιότερη θέση του παραθύρου
SEROUT 14, 84, [21] ' Κλείσιμο Οθόνης
PAUSE 140 ' Χρόνος αδράνειας που χρειάζεται για να εξαφανισθούν οι χαρακτήρες
FOR pointer = head TO tail ' Εκτύπωση νέων χαρακτήρων
READ pointer + MessageStart, character
SEROUT 14, 84, [character]
NEXT
SEROUT 14, 84, [22] ' Άνοιγμα οθόνης
PAUSE 180 ' Χρόνος αδράνειας για να εμφανιστούν οι χαρακτήρες
cursorStart = cursorStart - 1 MIN 134 ' Μείωση μέχρις ότου να φτάσει ο κέρσορας στα αριστερά του παραθύρου
tail = tail + 1 ' Αύξηση του δείκτη ουράς
' Αύξηση του δείκτη κεφαλιού αν ο δείκτης ουράς είναι μεγαλύτερος από το πλάτος του παραθύρου.
IF (tail > 3) THEN head = head + 1 ELSE head = 0
LOOP ' Τέλος βρόχου ολίσθησης
END ' BASIC Stamp -> Mode χαμηλής ενέργειας. (Low Power Mode)
Χαρακτήρες ορισμένοι από τον χρήστη (Custom Characters)
Το σειριακό LCD έχει την ικανότητα να αποθηκεύει έως και 8 custom χαρακτήρες που ορίζει ο χρήστης. Αυτοί οι χαρακτήρες αποθηκεύονται στην RAM και είναι αναγκαίο να οριστούν ξανά, από την στιγμή που σταματήσουμε την τροφοδοσία στον Basic Stamp. Ο χρήστης μπορεί να εμφανίσει αυτούς τους χαρακτήρες στέλνοντας εντολές ακεραίων από DEC 0 έως DEC 7. Οι χαρακτήρες αυτοί εκτυπώνονται στην τρέχουσα θέση του κέρσορα.
Οι χαρακτήρες που ορίζονται από τον χρήστη έχουν πλάτος 5 pixels και ύψος 8 pixels. Κάθε χαρακτήρας αποθηκεύεται ως σειρά 8 byte δεδομένων οπού τα πρώτα 5 bit του κάθε byte αντιπροσωπεύουν μια γραμμή Pixels στον χαρακτήρα. Τα υπόλοιπα 3 HIGH bits του κάθε byte αγνοούνται. Με την τιμή 1 στο κάθε bit ορίζουμε το χρώμα μαύρο και με την τιμή 0 τo κενό (δηλαδή σε εκείνο το σημείο είναι άχρωμο). Η τελευταία γραμμή των pixels ( εικονοστοιχείων ) παραμένει συνήθως κενή δηλαδή είναι όλα τα bits μηδενικά για να φαίνεται ο κέρσορας.
Ας δούμε ένα παράδειγμα. Εδώ θα ορίσουμε έναν χαρακτήρα το οποίο θα μοιάζει με το διαμάντι και θα εμφανιστεί στην οθόνη. Θα ορίσουμε τον κώδικα και θα τον φορτώσουμε στον Basic Stamp και θα διατηρηθεί μέχρι να αφαιρέσουμε την πηγή τάσης του. Το PIN που θα χρησιμοποιήσουμε είναι το 14 και ο ρυθμός αποστολής χαρακτήρων τα 9600 baud.
' {$STAMP BS2}
SEROUT 14, 84, [250] ' Όρισε έναν custom χαρακτήρα
' Τώρα στείλε τα 8 bytes αυτού
SEROUT 14, 84, [0] ' 0 = %00000
SEROUT 14, 84, [4] ' 4 = %00100 *
SEROUT 14, 84, [14] ' 14 = %01110 * * *
SEROUT 14, 84, [31] ' 31 = %11111 * * * * *
SEROUT 14, 84, [14] ' 14 = %01110 * * *
SEROUT 14, 84, [4] ' 4 = %00100 *
SEROUT 14, 84, [0] ' 0 = %00000
SEROUT 14, 84, [0] ' 0 = %00000
SEROUT 14, 84, [2] ' Εμφάνισε τον νέο χαρακτήρα που όρισε ο χρήστης
Χαρακτήρες ASCII
Ο πίνακας παρακάτω παραθέτει όλους τους χαρακτήρες ASCII που είναι δυνατόν να εμφανιστούν με to σειριακό LCD της Parallax. Όλοι αυτοί οι χαρακτήρες (DEC 32 εως DEC 127) είναι οι στάνταρ χαρακτήρες ASCII εκτός από την
αντίστροφη κάθετος ‘\’ (DEC 92) και την περισπωμένη (DEC 126). Το σειριακό LCD έρχεται προγραμματισμένο με αυτούς τους δύο χαρακτήρες ως custom. Έτσι για να εμφανίσουμε το backslash μπορούμε να δώσουμε στην SEROUT απευθείας την τιμή DEC 0 και για την περισπωμένη την τιμή DEC 1 αντίστοιχα. Φυσικά, μπορεί ανά πάσα στιγμή ο χρήστης να αντικαταστήσει αυτούς τους δύο χαρακτήρες με τους δικούς του custom.

