Διασύνδεση της τυποποιημένης παράλληλης θύρας - Nibble Mode
Nibble Mode
Ο nibble τρόπος είναι ο προτιμημένος τρόπος της ανάγνωσης 8 μπιτ δεδομένων χωρίς την τοποθέτηση της θύρας στον αμφίδρομο τρόπο και χρησιμοποίηση των γραμμών Data. Ο τρόπος χρησιμοποιεί Quad 2 line to 1 line multiplexer για να διαβάσει ένα nibble δεδομένων σε έναν χρόνο. Κατόπιν "μεταπηδά" στον άλλο και διαβάζει το άλλο nibble. Το λογισμικό μπορεί έπειτα να χρησιμοποιηθεί για να κατασκευαστεί από τα δύο nibble ένα byte. Το μόνο μειονέκτημα αυτής της τεχνικής είναι ότι είναι πιο αργή. Απαιτεί τώρα μερικές I/O οδηγίες για να διαβάσει τη μια ψηφιολέξη, και απαιτεί τη χρήση ενός εξωτερικού ολοκληρωμένου κυκλώματος.
Η λειτουργία του 74LS157, Quad 2 line to 1 line multiplexer είναι αρκετά απλή. Ενεργεί απλά ως τέσσερις διακόπτες. Όταν η εισαγωγή A/B είναι χαμηλή, οι εισαγωγές Α επιλέγονται. Π.χ. 1A περνά μέσω 1Y, το 2Α κατευθείαν στο 2Y κ.λπ.... Όταν το A/B είναι υψηλό, οι εισαγωγές Β επιλέγονται. Τα Pin Υ συνδέονται στο Status Port της παράλληλης θύρας, με έναν τέτοιο τρόπο ώστε να αντιπροσωπεύει το MSnibble του Status Register. Ενώ αυτό δεν είναι απαραίτητο, καθιστά το λογισμικό ευκολότερο.
Για να χρησιμοποιήσουμε αυτό το κύκλωμα, πρώτα πρέπει να αρχικοποιήσουμε τον πολυκλαδωτη να μεταφέρει είτε το Α είτε το Β. Θα διαβάσουμε το LSnibble πρώτα, κατά συνέπεια πρέπει να τοποθετήσουμε το A/B χαμηλό. Το strobe είναι ανεστραμμένο, κατά συνέπεια πρέπει να θέσουμε σε 1 το bit 0 του Control Port για να πάρουμε έναν χαμηλό στο Pin 1.
outportb(CONTROL, inportb(CONTROL) | 0x01); /* Select Low Nibble (A)*/
Αφού το LSnibble έχει επιλεχτεί, μπορούμε να διαβάσουμε το LSnibble από το Status Port. Σημειώστε ότι η Busy γραμμή είναι ανεστραμμένη, εντούτοις δεν θα την αντιμετωπίσουμε ακόμα. Ενδιαφερόμαστε μόνο για το MSnibble του αποτελέσματος, κατά συνέπεια κάνουμε AND το αποτέλεσμα με 0xF0, για να καθαρίσουμε το LSnibble.
a = (inportb(STATUS) & 0xF0); /* Read Low Nibble */
Τώρα είναι ώρα να μετατοπίσουμε το nibble που μόλις διάβασε στο LSnibble μιας μεταβλητής a,
a = a >> 4; /* Shift Right 4 Bits */
Είμαστε τώρα στο ήμισυ εκεί. Είναι ώρα να πάρουμε το MSnibble, κατά συνέπεια πρέπει να αντιστρέψουμε τον πολυκλαδωτη για να επιλέξουμε τις εισόδους Β. Κατόπιν μπορούμε να διαβάσουμε το MSnibble και να βάλουμε τα δύο μαζί για να κάνουμε μια ψηφιολέξη,
outportb(CONTROL, inportb(CONTROL) & OxFE); /* Select High Nibble (B)*/
a = a |(inportb(STATUS) & 0xF0); /* Read High Nibble */
byte = byte ^ 0x88;
Οι τελευταίες αντιστροφές των δύο γραμμών ανέστρεψαν τα bit που διαβάστηκαν μέσα στην Busy Line. Μπορεί να είναι απαραίτητο να προστεθούν καθυστερήσεις στη διαδικασία, εάν τα αποτελέσματα που επιστρέφονται είναι ανακριβή.