AT89C51AC2 επικοινωνία με lcd και 16 ψηφιο πληκτρολόγιο

συζητήσεις για assembly

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
CHRIS-PAP
Δημοσιεύσεις: 4
Εγγραφή: 12 Μαρ 2010 13:41

AT89C51AC2 επικοινωνία με lcd και 16 ψηφιο πληκτρολόγιο

Δημοσίευση από CHRIS-PAP » 19 Μαρ 2010 11:01

Έχω συνδέσει στην θύρα P2 του 8051 ενα 16ψηφιο πληκτρολόγιο και στην θύρα P0 μια οθόνη LCD 2*16.

Θέλω η οθόνη να μου δείχνει έναν χαρακτήρα και όταν πατάω * να μου εμφανίζει εναν άλλο και όταν πατάω # να μου εμφανίζει έναν τρίτο.

Οι ρουτίνες εγγραφής στην οθόνη και σάρωσης του πληκτρολογίου λειτουργούν. Όταν πατάω όμως * ή # εξαφανίζεται ο αρχικός χαρακτήρας που εμφανιζόταν και δεν δείχνει κάτι. Σας παραθέτω και ολόκληρο τον κώδικα για να δείτε και σεις. Ο κώδικας αποτελείται απο 3 αρχεια .a51 που εμπεριέχονται σε ένα πρότζεκτ.

Πιστεύω ότι υπάρχει κάποιο σφάλμα στην διακλάδωση μετα την σύγκριση του πατημένου πλήκτρου με τον κωδικό ascii του * και του #.

Μπορώ να δηλώσω μια μεταβλητή και να εκτελώ την εντολή CJNE με αυτή αντί για τον Α;
Μήπως μετά την διακλαδωση δεν πρέπει να ξανα-αρχικοποιήσω την οθόνη, αλλά να βάλω μια υπορουτινα (που θα δηλωθει στο αρχειο με τις ρουτινες οθονης) η οποία θα καθαρίζει την οθόνη και έπειτα να γράφω τον χαρακτήρα που θέλω;

Παραθέτω και δω τον κώδικα του κυρίως προγράμματος καθώς εδώ πιστεύω ότι βρίσκεται το πρόβλημα

Κώδικας: Επιλογή όλων

EXTRN CODE (lcdinit,lcdchar,POSIT_CURSOR,SCAN2)

CURSPOS data 50h

CSEG AT 0H

CALL LCDINIT ;Αρχικοποιηση της οθονης 
MOV CURSPOS,#8 ;Μετακινουμε τον κερσορα στην μεση της πανω γραμμης 
CALL POSIT_CURSOR   ; της οθονης
MOV A,# 41h		
CALL LCDCHAR; Εισαγωγή του χαρακτήρα    Α
             
MAIN: 

	CALL SCAN2                   ;μια πλήρης σάρωση
MOV A,R5                     ;κωδικός πλήκτρου
CJNE A,#03h,ACTION2           ; ΑΝ ΔΕΝ ΠΑΤΗΘΗΚΕ ΤΟ # ΠΑΝΕ ΣΤΗΝ ACTION2 ΔΕς ΑΝ ΠΑΤΗΘΗΚΕ ΤΟ *

ENTER_NEW_PASS2: 
              CALL LCDINIT	;Αρχικοποιηση της οθονης 
              MOV CURSPOS,#24 ;Μετακινουμε τον κερσορα στην μεση της πανω γραμμης 
              CALL POSIT_CURSOR   ; της οθονης
              MOV A,# 21h		
              CALL LCDCHAR; Εισαγωγή του χαρακτήρα    !

			jmp telos1
ACTION2: CJNE A,#0Bh,MAIN	;ΑΝ ΔΕΝ ΠΑΤΗΘΗΚΕ ΤΟ * ΞΑΝΑΣΑΡΩΣΕ
	
ENTER_NEW_PASS3: 
              CALL LCDINIT	;Αρχικοποιηση της οθονης 
              MOV CURSPOS,#24; Μετακινουμε τον κέρσορα στην μέση της κάτω γραμμής  
              CALL POSIT_CURSOR ;της οθόνης
              MOV A,# 22h
              CALL LCDCHAR	; Εισαγωγή του χαρακτήρα "

                          
                         
telos1: 
END
Συνημμένα
ΚΩΔΙΚΑΣ ΓΙΑ ΧΑΡΑΚΤΗΡΕΣ.rar
(6.32 KiB) Μεταφορτώθηκε 214 φορές

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

AT89C51AC2 επικοινωνία με lcd και 16 ψηφιο πληκτρολόγιο

Δημοσίευση από LightForce » 20 Μαρ 2010 12:32

Ηι CHRIS-PAP,

Δεν μπορώ παρά να υποθέσω ότι η συνδεσμολογία της κατασκευής σου σου είναι σωστή, αν είχα τρόπο να τρέξω τον κώδικα CHRIS-PAP ίσως να μπορούσα να βοηθήσω.
Πως παίρνουν τις συγκεκριμένες ASCII τιμές οι χαρακτήρες # *
Οι ρουτίνες εγγραφής στην οθόνη και σάρωσης του πληκτρολογίου λειτουργούν
Οπότε μπορείς να γράψεις πρόγραμμα όπου πατώντας πλήκτρα εμφανίζεται ο χαρακτήρας στην οθόνη. Π.χ πατάς Q W E R T Y και το εμφανίζει.
Τότε -χωρίς να γνωρίζω το σετ του 8051- ίσως το πρόβλημα να βρίσκεται στις εντολές σύγκρισης.

CHRIS-PAP
Δημοσιεύσεις: 4
Εγγραφή: 12 Μαρ 2010 13:41

AT89C51AC2 επικοινωνία με lcd και 16 ψηφιο πληκτρολόγιο

Δημοσίευση από CHRIS-PAP » 21 Μαρ 2010 15:45

LightForce το 16 ψηφιο πληκτρολόγιο έχεις τους αριθμούς από 0-1 και τα γράμματα a b c d. Και γω εκει πιστευω είναι το προβλημα αλλα οι εντολές για συγκριση στην ασσεμπλι είναι αυτές.

CHRIS-PAP
Δημοσιεύσεις: 4
Εγγραφή: 12 Μαρ 2010 13:41

AT89C51AC2 επικοινωνία με lcd και 16 ψηφιο πληκτρολόγιο

Δημοσίευση από CHRIS-PAP » 30 Μαρ 2010 15:05

Πέτυχα τον αρχικό μου στόχο. Τώρα αντί για χαρακτήρες θα ήθελα να εμφανίζει κάποια πρόταση. Όταν ξεκινάω το πρόγραμμα να βγαζει το MINIMA1 και όταν πατάω το * να βγάζει το MINIMA2

Το πρόγραμμα μου όμως στην αρχή εμφανίζει το MINIMA1 και από κάτω στην lcd οθονη to ΜΙΝΙΜΑ2 χωρίς να έχω πατήσει το *. Γιατί διαβάζει και τα δύο δηλωμένα string; Μήπως πρέπει να τα δηλώσω αλλιώς;

Ιδού το κυρίως πρόγραμμα

Κώδικας: Επιλογή όλων

EXTRN CODE (lcdinit,lcdchar,POSIT_CURSOR,LCDCLS,SCAN2,LCDSTR)

CURSPOS data 50h

CSEG AT 0H

CALL LCDINIT ;Áñ÷éêïðïéçóç ôçò ïèïíçò 
MOV CURSPOS,#4 ;Ìåôáêéíïõìå ôïí êåñóïñá óôçí ìåóç ôçò ðáíù ãñáììçò 
CALL POSIT_CURSOR   ; ôçò ïèïíçò
MOV DPTR,#STRING1	;Åããñáöç óôçí ïèïíç ôïõ ðñùôïõ string
CALL LCDSTR

             
MAIN: 

	CALL SCAN2                   ;ìéá ðëÞñçò óÜñùóç
MOV A,R5                     ;êùäéêüò ðëÞêôñïõ
CJNE A,#03h,ACTION2         ; ÁÍ ÄÅÍ ÐÁÔÇÈÇÊÅ ÔÏ * ÐÁÍÅ ÓÔÇÍ ACTION2 ÄÅò ÁÍ ÐÁÔÇÈÇÊÅ ÔÏ #

              CALL LCDCLS	;êáèáñéóìïò ïèïíçò
              MOV CURSPOS,#0 ;Ìåôáêéíïõìå ôïí êåñóïñá óôçí ìåóç ôçò ðáíù ãñáììçò 
              CALL POSIT_CURSOR   ; ôçò ïèïíçò
	      MOV DPTR,#STRING2	;Åããñáöç óôçí ïèïíç ôïõ ðñùôïõ string
	      CALL LCDSTR

...........
.........
..........

HALT: JMP HALT




STRING1:
DB ' minima1 '

STRING2:
DB ' minima2 '

END

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

AT89C51AC2 επικοινωνία με lcd και 16 ψηφιο πληκτρολόγιο

Δημοσίευση από LightForce » 30 Μαρ 2010 16:17

Βάζε τον κώδικα σου στα post σε code tags CHRIS-PAP, διαβάζεται ευκολότερα.

Διάβασε την ρουτίνα LCDSTR που τυπώνει το string, πιθανόν να δέχεται NULL terminated strings.

Κώδικας: Επιλογή όλων

DB ' minima1 ',0

CHRIS-PAP
Δημοσιεύσεις: 4
Εγγραφή: 12 Μαρ 2010 13:41

AT89C51AC2 επικοινωνία με lcd και 16 ψηφιο πληκτρολόγιο

Δημοσίευση από CHRIS-PAP » 13 Απρ 2010 17:10

Δίκιο είχες LightForce. Σ' ευχαριστώ πολύ.


Μια άλλη δυσκολία που αντιμετωπίζω είναι η εξής.

Όταν πατάω ένα πλήκτρο από το πληκτρολόγιοη αξία του αποθηκευεται στον καταχωρητή R5. Αυτό την αξία θέλω να την αποθηκεύσω σε μια θέση μνήμης για μια σύγκριση που θα κάνω σε μετέπειτα κομμάτι του προγράμματος, αλλά και να την στέλνω στον καταχωρητή Α για να κάνω αμέσως μια συγκριση αυτου του πλήκτρου.

Πώς γίνεται την τιμή από τον R5 να την στείλω και σε μια θέση μνήμης π.χ. 40h και στον Καταχωρητη Α;

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

AT89C51AC2 επικοινωνία με lcd και 16 ψηφιο πληκτρολόγιο

Δημοσίευση από LightForce » 16 Απρ 2010 01:04

Παρακαλώ.
Με MOV εντολή θα γίνεται.
Το link ίσως σε βοηθήσει.

Απάντηση

Επιστροφή στο “Assembly”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες