PDA

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



CHRIS_PAP
14-03-10, 16:00
Καλησπέρα σας

Θέλω να προγραμματίσω τον ΑΤ89C51AC2 ώστε να εμφανίζει στην οθονη "alarm off" και

1) Αν πατήσω * να εμφανίσει "alarm new pass1"

2)Αν πατήσω # να εμφανίσει "alarm new pass1"

αν δεν πατηθεί κάτι από αυτά να συνεχίζει να δειχνει "alarm off" μέχρι κάποιο να πατηθεί.

Ο τρόπος που σύνδεσα την οθόνη και το πληκτρολόγιο στον μικροελεγκτή, φαίνονται στα 2 συννημένα αρχεία. Το πληκτρολόγιο είναι το ίδιο που φαίνεται στην 3η συνημμένη εικόνα. Χρησιμοποιώ το archimedes microvision για assembler. Με το πρόγραμμα που παραθέτω εμφανίζει στν οθόνη μόνο το "alarm off" μήνυμα.

Το πρόγραμμα αποτελείται από 3 αρχεία .a51, το κυρίως, οι ρουτίνες της οθόνης και η ρουτίνα σάρωσης του πληκτρολογίου, τα οποία αποτελούν ένα πρότζεκτ. Χρησιμοποιώ το archimede μVision για assembler.

Έχετε κάποια ιδέα για το που κάνω το λάθος;

klik
15-03-10, 14:46
Αν δεν έχεις βγάλει άκρη ακόμα:

στην οθόνη δεν κατάλαβα γιατί έβαλες LATCH. Η οθόνη απο μόνη της έχει latch (που μανδαλώνεις με το σήμα Enable της oθόνης).

Το πληκτρολόγιο το σύνδεσες με τις 4 γραμμές στα +5V μέσω αντιστάσεων αρα περιμένεις στην έξοδο (διασταύρωση με Χ πλήκτρο) να έχεις +5V (αν πατήθηκε το πλήκτρο) ή ασύνδετο (αν δεν πατήθηκε).
Ο μικροελενκτής αυτός απο ότι θυμάμε έχει σε όλες τις εξόδους pull up αντιστάσεις, αρα οι ασυνδετες ακίδες δίνουν TRUE. Εσυ με το πληκτρολόγιο οταν πατιώντε πλήκτρα δίνουν TRUE, αρα έχεις πάντα TRUE σε όλα τα πλήκτρα. Βάλε τις αντιστασεις του πληκτρολογίου προς τη γη αντί για τα +5.

Το πρόγραμμα δεν το είδα ακόμα. Δες αυτά που είπα και περιέγραψε αναλυτικά τα προβλήματα που αντιμετωπίζεις

CHRIS_PAP
15-03-10, 15:44
Αν δεν έχεις βγάλει άκρη ακόμα:

στην οθόνη δεν κατάλαβα γιατί έβαλες LATCH. Η οθόνη απο μόνη της έχει latch (που μανδαλώνεις με το σήμα Enable της oθόνης).

Το πληκτρολόγιο το σύνδεσες με τις 4 γραμμές στα +5V μέσω αντιστάσεων αρα περιμένεις στην έξοδο (διασταύρωση με Χ πλήκτρο) να έχεις +5V (αν πατήθηκε το πλήκτρο) ή ασύνδετο (αν δεν πατήθηκε).
Ο μικροελενκτής αυτός απο ότι θυμάμε έχει σε όλες τις εξόδους pull up αντιστάσεις, αρα οι ασυνδετες ακίδες δίνουν TRUE. Εσυ με το πληκτρολόγιο οταν πατιώντε πλήκτρα δίνουν TRUE, αρα έχεις πάντα TRUE σε όλα τα πλήκτρα. Βάλε τις αντιστασεις του πληκτρολογίου προς τη γη αντί για τα +5.

Το πρόγραμμα δεν το είδα ακόμα. Δες αυτά που είπα και περιέγραψε αναλυτικά τα προβλήματα που αντιμετωπίζεις


Ο μικροελεγκτής αυτός όντως έχει pull up αντιστασεις σε ολες τις θυρες εκτός της P0. Εγω το συνδεσα στην P2 απευθείας χωρίς να χρησιμοποιήσω αντιστάσεις. Στις εικονες που παραθέτω φαίνεται ο τροπος με τον οποίο συνδέεται το πληκτρολόγιο στο μικροελεγκτή καθως και το διάγραμμα ροής για την ρουτίνα σάρωσης την οποία παραθέτω και εδώ

public SCAN2
sevenseg segment code
rseg sevenseg

SCAN2: ;ρουτίνα σάρωσης πληκτρολογίου
MOV R0,#11101111B ;δείχνει την πρώτη στήλη
MOV R2,#0 ;μηδενισμός μετρητή στηλών
NEXT_COL:
MOV P2,R0 ;ενεργοποιεί την στήλη
MOV R3,P2 ;διαβάζει τις γραμμές
MOV R4,#0 ;μηδενίζει το μετρητή γραμμών
NEXT_LINE:
MOV A,R3 ;ελέγχει αν έχει πατηθεί
RRC A ;κάποιο πλήκτρο
MOV R3,A
JNC PRESSED ;αν C=0 βρέθηκε πλήκτρο πατημένο
INC R4 ;αλλιώς επόμενη γραμμή
CJNE R4,#4,NEXT_LINE
MOV A,R2
ADD A,#4
MOV R2,A ;αυξάνει το μετρητή στηλών κατά 4
SETB C
MOV A,R0
RLC A
MOV R0,A ;επόμενη στήλη
CJNE R2,#16,NEXT_COL ;τέλος σάρωσης?
MOV R5,#0FFH ;επιστρέφει FF αν δεν πατήθηκε πλήκτρο
MOV A,R5
JMP TELOS
PRESSED: ;επιστρέφει τον κωδικό του πλήκτρου που
MOV A,R2 ;πατήθηκε
ADD A,R4
MOV R5,A
TELOS:
RET


END



Το πρόβλημα μου είναι ότι εμφανίζει το αρχικό μήνυμα "alarm off" ή όποιο άλλο μήνυμα γράψω να εμφανίζεται αρχικά (δλδ το "κομμάτι" που αφορά τη εμφάνιση στην οθόνη, λειτουργεί) αλλά δεν εμφανίζει τα άλλα μηνυματα όταν πατήσω # ή *. Δλδ η ρουτίνα της σάρωσης του πληκτρολογίου ή κάποιες διακλαδώσεις στο κυρίως πρόγραμμα δεν λειτουργούν σωστά.

Το πληκτρολόγιο έχει 8 pin. Το 1 είναι αυτό που είναι κάτω από το 0 ή αυτό που είναι κάτω από τη δίεση;

klik
15-03-10, 15:52
άκυρο, θα το δω αργότερα.

γράψε όμως ακριβώς ποιά ακίδα είναι συνδεδεμένη που.
Στο χαρτόνι που είχε το πληκτρολόγιο όταν το αγόρασες, είχε την πληροφορία ποιά ακίδα αφορά οριζόντια γραμμή και ποιά κάθετη.

CHRIS_PAP
15-03-10, 16:02
Δυστυχώς το χω χάσει το χαρτόνι Klik. Αν σε βοηθάει να σου πω πως η ακίδα που είναι κάτω απο το 0 είναι στην Ρ2.0 και η τελευταία ακίδα που είναι κάτω από το # είναι στην Ρ2.7.
Σ' ευχαριστώ για τον χρόνο σου.

giannhssdra
15-03-10, 16:18
για το πληκτρολογιο δες λιγο αυτο
απλα η διαφορα ειναι οτι συνδεσα αλλιως τις στηλες
ΣΥΝΔΕΣΗ ΑΠΟ Ρ2.7-Ρ2.4 ΣΤΑ 1-4 ΤΟυ KEYBOARD ΔΛΔ ΑΠΟ 1Η ΣΤΗΛΗ ΕΩΣ 4Η.
ΤΑ Ρ2.3-Ρ2.0 ΠΑΝΕ ΣΤΑ 5-8 ΤΟΥ KEYBOARD ΔΛΔ ΑΠΟ 1Η ΓΡΑΜΜΗ ΕΩΣ 4Η
εσενα σε ενδιαφερει μονο μεχρι το "ΕΚΕΙ" γιατι απο εκει και κατω απλα παιρνει εναν αριθμο απο τον πινακα στο τελος και τον βγαζει στο 7segment
εισαι αυτοματισμου η απλα διαβαζεις απο το βιβλιο?

CSEG AT 0
SCN: MOV R0,#01111111B
MOV A,R0
MOV R2,#00H
NEXTCOL: MOV R4,#00H
MOV P2,A
MOV A,P2
NEXTLIN:
RRC A
JNC EKEI
INC R4
CJNE R4,#04H,NEXTLIN
MOV A,R2
ADD A,#04H
MOV R2,A
SETB C
MOV A,R0
RRC A
MOV R0,A
CJNE R2,#0BH,NEXTCOL
JMP SCN
EKEI: MOV A,R2
ADD A,R4
CALL GETNUM
MOV P0,A
JMP SCN

GETNUM: INC A
MOVC A,@A+PC
RET

DB 0EH,0F8H,099H,0F9H ;F,7,4,1
DB 0C0H,80H,92H,0A4H ;0,8,5,2
DB 06H,98H,82H,0B0H ;E,9,6,3
DB 40H,46H,00H,08H ;D,C,B,A


END

CHRIS_PAP
15-03-10, 16:37
Αυτοματισμού ήμουν, απλά κάνω κάτι πειράματα τώρα και τα χω ξεχάσει. Ευτυχώς βρήκα τις σημειώσεις και τις ασκήσεις που είχα κάνε τότε

δλδ να βάλω αυτό


CSEG AT 0
SCN: MOV R0,#01111111B
MOV A,R0
MOV R2,#00H
NEXTCOL: MOV R4,#00H
MOV P2,A
MOV A,P2
NEXTLIN:
RRC A
JNC EKEI
INC R4
CJNE R4,#04H,NEXTLIN
MOV A,R2
ADD A,#04H
MOV R2,A
SETB C
MOV A,R0
RRC A
MOV R0,A
CJNE R2,#0BH,NEXTCOL
JMP SCN
end

giannhssdra (http://www.hlektronika.gr/forum/member.php?u=40904) η ακίδα που είναι κάτω απο το 0 είναι η 1; Εχω χάσει το χαρτάκι από το πληκτρολόγιο γι αυτό ρωτάω.

Για να δοκιμάσουμε....

giannhssdra
15-03-10, 16:45
ναι δοκιμασε το ειναι σωστο.
απλα ετσι οπως το αφησες απλα σκαναρει και δεν κανει τπτ
εκει που λεει JNC EKEI αυτο σημαινει οτι κατι πατηθηκε αρα πανε στο ΕΚΕΙ ελενχεις αν ειναι το πληκτρο που θελεις(* η #)και κανεις οτι ειναι να κανεις παρακατω.
τωρα με την οθονη δεν μπορω να σε βοηθησω και εγω τωρα αρχιζω να την ψαχνω και να την διαβαζω.απλα μια ερωτηση αυτη η διαδικασια που κανεις στο ρεσετ στην αρχη με τις καθυστερησεις ειναι απαραιτητη και γιατι?
επισης αυτο που σου ειπε ο kliκ αν για 74hc573 ,αν δουλευεις την οθονη με 8bit για μεταφορα τοτε σε συμφερει το 573 για να σου παρει μονο μια θυρα ,αλλιως αν το κανεις με 4bit δεν χρειαζετε απλα βαζεις το Ε το W/R,και RS της οθονης σε ξεχωριστα pin

CHRIS_PAP
15-03-10, 17:27
EXTRN CODE (lcdinit,lcdchar,POSIT_CURSOR,lcdstr,LCDCMD)

CURSPOS data 50h

CSEG AT 0H


CALL LCDINIT ;Αρχικοποιηση οθονης
MOV CURSPOS,#0 ;Τοποθετηση του κερσορα στην αρχη της πανω γραμμης
MOV DPTR,#STRING1 ;Εγγραφη στην οθονη του πρωτου string
CALL LCDSTR

STRING1:
DB 'ALARM OFF'

SCAN2: MOV R0,#01111111B
MOV A,R0
MOV R2,#00H
NEXTCOL: MOV R4,#00H
MOV P2,A
MOV A,P2
NEXTLIN:
RRC A
JNC routaster
INC R4
CJNE R4,#04H,NEXTLIN
MOV A,R2
ADD A,#04H
MOV R2,A
SETB C
MOV A,R0
RRC A
MOV R0,A
CJNE R2,#0BH,NEXTCOL
JMP SCAN2

routaster:
CJNE A,#3h,ACTION2 ; ΑΝ ΔΕΝ ΠΑΤΗΘΗΚΕ ΤΟ # ΠΑΝΕ ΣΤΗΝ ACTION2 ΔΕς ΑΝ ΠΑΤΗΘΗΚΕ ΤΟ *

ENTER_NEW_PASS2:
CALL LCDINIT ;An?eei?iecoc ieiico
MOV CURSPOS,#0 ;Oi?ieaococ oio eanoina ooci an?c oco ?aiu anaiico
MOV DPTR,#STRING2 ;Aaanaoc ooci ieiic oio ?nuoio string
CALL LCDSTR
STRING2:
DB ' ENTER NEW PASS1 '
jmp telos1
ACTION2: CJNE A,#0Bh,SCAN2 ;ΑΝ ΔΕΝ ΠΑΤΗΘΗΚΕ ΤΟ * ΞΑΝΑΣΑΡΩΣΕ

ENTER_NEW_PASS3:
CALL LCDINIT ;An?eei?iecoc ieiico
MOV CURSPOS,#0 Oi?ieaococ oio eanoina ooci an?c oco ?aiu anaiico
MOV DPTR,#STRING3 ;Aaanaoc ooci ieiic oio ?nuoio string
CALL LCDSTR
STRING3:
DB ' ENTER NEW PASS2 '
jmp telos1


telos1:

END




Έκαν αυτό το κυρίως πρόγραμμα, και σε ένα αλλο αρχείο έβαλα τις ρουτινες της οθόνης. Θα το δοκιμάσω το βράδυ όμως



giannhssdra για ποιες καθυστερήσεις μιλάς; Για της οθόνης;

giannhssdra
15-03-10, 17:44
ναι στο ρεσετ κανεις 15ms καθυστερηση μετα λες 1η εντολη 32 ,2η,3η ...
ολα αυτα γιατι τα κανεις ?και πρεπει να γινονται παντα στο ρεσετ?

CHRIS_PAP
15-03-10, 19:56
giannhssdra δες την φωτο για να καταλάβεις τους λόγους. Δυστυχώς το πρόγραμμα δεν τρέχει σωστά.

Μου εμφανίζει μόνο Alarm off.

Μήπως κάνω λάθος την σύγκριση; Στην ρουτίνα scan2, ο κωδικός του πλήκτρου αν βρεθει πατημένο, που αποθηκεύεται;

giannhssdra
15-03-10, 20:31
1)πρεπει να βαλεις τα pin του keyboard οπως σου ειπα
2)αυτο το κομματι μεχρι πριν το "EKEI" ειναι για να σκαναρει αν πατηθηκε κατι.απο την στιγμη που πατηθηκε πρεπει να βαλεις συνθηκες ωστε να μην συνεχιζει να τρεχει αν δεν το αφησει ο χρηστης και να αν ειναι σωστο να σου βγαλει το μνμ που θελεις.
πρεπει να ελενχεις αν ειναι σωστο με τις επιλογες σου (* η #) αν δεν πατηθηκε κατι απο τα δυο συνεχισε να σκαναρεις
αν ομως πατηθηκε βαλε πρωτα να μνμ που θελεις στην οθονη και μετα μεινε εκει μεχρι να αφησει ο χρηστης το μπουτον

το μνμ πως στο βγαζει?εκει που δηλωνεις STRING DB 'ALARM OFF' το περνας στον dptr και μετα?

CHRIS_PAP
15-03-10, 21:07
Τα πιν μπήκαν όπως είπες.

Εβαλα συνθήκες αντί για το ΕΚΕΙ να πηγαίνει στην routaster όπου γίνεται συγκριση του Α με τον δεκαεξαδικο κωδικο του * και αν ειναι ιδιοι πρεπει να γραψει ENTER NEW PASS1 και παει στην END και τελος

Αν δεν ειναι ιδιοι να συγκρινει τον Α με τον δεκαεξαδικο κωδικό του # και αν ειναι ιδιοι να εμφανίζει ENTER NEW PASS2 και παει στην END και τελος

Αν όχι ξανγυρνάει στην scan2 και σαρώνει το πληκτρολογιο πάλι

Μήπως με τις εντολες CJNE αλλάζει το περιεχόμενο του και άδικα κάνω συγκρίσεις;

Με την ρουτίνα σαρώματος που μου έστειλες που αποθηκευεται ο κωδικός του τυχόντος πατημένου πλήκτρου;

giannhssdra
15-03-10, 22:27
λοιπον η συνδεση θα γινει :το Ρ2.7 εως το Ρ2.4 στα πιν 1 εως 4
και τα Ρ2.3 εως το Ρ2.0 στα πιν 5 εως 8 του keyboard
και το κοιτας απο τα αριστερα προς τα δεξια 1,2,3,4,5,6,7,8
πρωτη στηλη ειναι η 1,4,7,*
και πρωτη γραμμη το *,0,#,D
αρα το πρωτο πληκτρο ειναι το * (1,1)

1 2 3 Α (3,7,B,F)
4 5 6 B (2,6,A,E)
7 8 9 C (1,5,9,D)
* 0 # D (0,4,8,C)

στα δεξια ειναι ο αριθμος που θα εχει ο Α μετα το πατημα του αντισοιχου πληκτρου
οποτε για * συγκρινεις με #00Η και για # με #08Η

η cjne απλα τις συγκρινει.αν ειναι ισα την προσπερναει και παει στην παρακατω εντολη .αν δεν ειναι ισα παει εκει που του λες να παει.
τωρα κανοντας την συγκριση αν ο πρωτος αριθμος ειναι μεγαλυτερος απο τον 2ο τοτε η σημαια του κρατουμενου γινετε 0 αλλιως γινετε 1 (αν και τωρα δεν σου χρειαζετε)

CHRIS_PAP
15-03-10, 23:18
Ναι έτσι όπως τα λες το σύνδεσα το πληκτρολόγιο και συνέτεξα το παρακάτω πρόγραμμα

EXTRN CODE (lcdinit,lcdchar,POSIT_CURSOR,lcdstr,LCDCMD)

CURSPOS data 50h

CSEG AT 0H


CALL LCDINIT ;Αρχικοποιηση οθονης
MOV CURSPOS,#0 ;Τοποθετηση του κερσορα στην αρχη της πανω γραμμης
MOV DPTR,#STRING1 ;Εγγραφη στην οθονη του πρωτου string
CALL LCDSTR

STRING1:
DB 'ALARM OFF'

SCAN2: MOV R0,#01111111B
MOV A,R0
MOV R2,#00H
NEXTCOL: MOV R4,#00H
MOV P2,A
MOV A,P2
NEXTLIN:
RRC A
JNC routaster
INC R4
CJNE R4,#04H,NEXTLIN
MOV A,R2
ADD A,#04H
MOV R2,A
SETB C
MOV A,R0
RRC A
MOV R0,A
CJNE R2,#0BH,NEXTCOL
JMP SCAN2

routaster:
CJNE A,#3h,ACTION2 ; ΑΝ ΔΕΝ ΠΑΤΗΘΗΚΕ ΤΟ # ΠΑΝΕ ΣΤΗΝ ACTION2 ΔΕς ΑΝ ΠΑΤΗΘΗΚΕ ΤΟ *

ENTER_NEW_PASS2:
CALL LCDINIT ;Αρχικοποιηση οθονης
MOV CURSPOS,#0 ;Τοποθετηση του κερσορα στην αρχη της πανω γραμμης
MOV DPTR,#STRING2 ;Εγγραφη στην οθονη του string2
CALL LCDSTR
STRING2:
DB ' ENTER NEW PASS1 '
jmp telos1
ACTION2: CJNE A,#0Bh,SCAN2 ;ΑΝ ΔΕΝ ΠΑΤΗΘΗΚΕ ΤΟ * ΞΑΝΑΣΑΡΩΣΕ

ENTER_NEW_PASS3:
CALL LCDINIT ;Αρχικοποιηση οθονης
MOV CURSPOS,#0 ;Τοποθετηση του κερσορα στην αρχη της πανω γραμμης
MOV DPTR,#STRING3 ;Εγγραφη στην οθονη του πρωτου string3
CALL LCDSTR
STRING3:
DB ' ENTER NEW PASS2 '
jmp telos1


telos1:

END


Δυστυχώς ακόμα δεν λειτουργεί σωστά. Μόνο ALARM OFF δείχνει.

giannhssdra
16-03-10, 09:40
εσυ κανεις ελενχο για το * με το 03Η και για την # με το 0ΒΗ που ειναι λαθος.
με το * κανε με το #00Η και με την # κανε με το #08Η
δοκιμασε το και πες μου
.
επισης αυτο με την αρχικοποιηση της οθονης πρεπει να το κανεις καθε φορα πριν γραψεις κατι στην οθονη η μονο μια φορα στο ρεσετ?

CHRIS_PAP
19-03-10, 13:57
Αποφάσισα να το κάνω λίγο πιο εύκολο για να δω τι φταίει.

Θα στέλνω έναν χαρακτήρα να εμφανίζεται ( Α ) να εμφανίζεται και όταν πατάω * εμφανίζει έναν άλλο χαρακτήρα ( ! ).

Εμφανίζεται το Α τώρα, αλλά όταν πατάω * εξαφανίζεται το Α και δεν εμφανίζει τίποτα. Δηλαδή κάνει σωστά την σύγκριση του πατημενου πλήκτρου, καταλαβαίνει ότι πατήθηκε το *, αλλά δεν εμφανίζει τον χαρακτήρα.

Μπορεί κάποιος να βοηθήσει;

Ακολουθεί το κυρίως πρόγραμμα εδώ και στο συνημμένο όλο το πρότζεκτ.


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

CURSPOS data 50h

CSEG AT 0H

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

MAIN:

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

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

JMP EXIT
ACTION2: JMP MAIN
EXIT:

END

CHRIS_PAP
25-03-10, 15:57
Τελικά μπόρεσα να το κάνω. Το λάθος ήταν πολύ απλό.

Τωρα θέλω όταν πατώ # και εμφανιζει " στην πάνω σειρα, όποτε πατώ κάποιο πλήκτρο να εμφανιζει στην κατω σειρα ενα *.


Προς το παρον οταν πατω # εμφανιζει το " πανω και ενα αστερακι στην μεση χωρις να εχω πατησει κατι.

Υποπτεύομαι ότι πρέπει να βάλω μια delay μετά την CALL LCDCHAR; Εισαγωγή του χαρακτήρα "


γιατί αντιλαμβάνεται το πάτημα του πλήκτρου # και εμφανίζει αμέσως το *

Πόση καθυστέρηση προτείνεται και πως μπορώ να την πετύχω;

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


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

CURSPOS data 50h

CSEG AT 0H

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

MAIN:

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

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

JMP HALT
ACTION2:
mov A, R5
CJNE A,#0Bh,MAIN
CALL LCDCLS ;καθαρισμος οθονης
MOV CURSPOS,#8 ;Μετακινουμε τον κερσορα στην μεση της πανω γραμμης
CALL POSIT_CURSOR ; της οθονης
MOV A,# 22h
CALL LCDCHAR; Εισαγωγή του χαρακτήρα "



PROTOPSIFIO:

call SCAN2

MOV A,R5
CJNE A,#0FFh,GRAPSE ; Εβαλα το FF γιατι αυτό δίνουμε στην υπορουτινα σαρωσης πληκτρολογιου αν δεν πατηθει καποιο πληκτρο
jMP EPANELABE


GRAPSE:
MOV CURSPOS,#22 ;Μετακινουμε τον κερσορα στην κατω γραμμη
CALL POSIT_CURSOR ; της οθονης
MOV A,# 2Ah
CALL LCDCHAR; Εισαγωγή του χαρακτήρα *
JMP HALT

EPANELABE :
JMP PROTOPSIFIO

HALT: JMP HALT

END

giannhssdra
25-03-10, 16:43
δεν καταλαβα ποιο ειναι το προβλημα σου.σου βγαζει το αστερακι χωρις να πατησεις τπτ?
η καθυστερηση μπορει να γινει με δυο τροπους
1)η να την κανεις με εναν χρονιστη και να περιμενεις την σημαια
2)με καταχωρητες πχ
mov r0,#0ffh
loop: mov r1,#0ffh
loop1:djnz r1,loop1
djnz r0,loop
τψρα αφου ξερεις τον χρονο καθε εντολης μπορεις να υπολογισεις το χρονο και να βαλεις οτι τιμες θελεις και οσεσς loop θελεις