Michael18964 Geschrieben 12. Juli 2006 Geschrieben 12. Juli 2006 Ich muss fürs Abitur eine Jahresarbeit machen und bei der muss ich eine Stoppuhr in Assembler programmieren, mit RIDE!! Ich habe schon Timer und Interrupter soweit schon programmiert, aber ich weiß nicht wie man die Matrix-Tastatur und die LCD-Anzeige ansteuert! Könnte mir da jemand helfen? Ist wichtig für mein Abi und ich habe nurnoch eine Woche dafür Zeit Das ist das was ich bisjetzt habe, ist das bis jetzt richtig? und könnte das jemand vervollständigen? ;timer2.a51 ;Timer0-Interrupt alle 65 ms ;Ausgabe Lauflicht LEDs an P2 $include (reg52.inc) ORG 0000h ljmp init ;Das eigentliche Programm beginnt hinter ORG 000Bh ;den Interrupt-Einsprung-Adressen ljmp count_isr ;******* Initialisierung ************************************************************************************* init: mov TMOD, #00000010b mov TL0, #6d mov TH0, #6d mov TCON, #00010000b SETB ET0 SETB EA ;******** Hauptprogramm ************************************************************************* haupt: sjmp haupt ;Warten auf Interrupts count_isr: INC R0 CJNE R0, #4d, marke1 MOV R0, #0h ;r0 auf 0 zurück setzen INC R1 ;1/1000sec CJNE R1, #10d, marke1 ;solange r1 zählen bis 10mal durchgelaufen und somit 1/100sec gedauert hat MOV R1, #0h ;r1 auf 0 zurück setzen INC R2 ;1/100 CJNE R2, #10d, marke1 ;solange r2 zählen bis 10mal durchgelaufen und somit 1/10sec gedauert hat MOV R2, #0h ;r2 auf 0 zurück setzen INC R3 ;1/10 CJNE R3, #10d, marke1 ;solange r3 zählen bis 10mal durchgelaufen und somit 1sec gedauert hat ;r3 und somit die 1/10sec ausgeben MOV R3, #0h ;r3 auf 0 zurück setzen INC R4 ;sec CJNE R4, #60d, marke1 ;solange r4 zählen bis 60mal durchgelaufen und somit 1min gedauert hat ;r4 und somit die sec ausgeben MOV R4, #0h ;r4 auf 0 zurück setzen INC R5 ;min CJNE R5, #60d, marke1 ;solange r5 zählen bis 60mal durchgelaufen und somit 1h gedauert hat ;r5 und somit die min ausgeben MOV R5, #0h ;r5 auf 0 zurück setzen INC R6 ;min CJNE R6, #60d, marke1 ;solange r6 zählen bis 24mal durchgelaufen und somit 1d gedauert hat ;r6 und somit die h ausgeben MOV R6, #0h ;r6 auf 0 zurück setzen marke1: RETI END Zu den Hardwareangaben: Mikrocontroller 8051 LCD 16 Zeichen Breit und 2 Zeilen hoch Normale Matrix-Tastatur 0-9 Zeichen und Stern und Raute Danke schonmal im Vorraus! PS: Falls es im Falschen Thread ist, dann bitte verschieben diesen Post in den richtigen Bereich, wusste nicht wo es hin gehört!! mfg Michael Zitieren
Michael18964 Geschrieben 14. Juli 2006 Autor Geschrieben 14. Juli 2006 kann mir keiner helfen? schade, ich blick das überhaupt nicht mfg michael Zitieren
Guybrush Threepwood Geschrieben 14. Juli 2006 Geschrieben 14. Juli 2006 hmm du könntest dein Problem auch mal hier rein stellen. Da gibts ein paar Leute die dir evtl helfen könnten... Zitieren
goblack3 Geschrieben 14. Juli 2006 Geschrieben 14. Juli 2006 Hy, also heut abend hab ich kein kopf mehr dafür noch alles zu machen. muss mir den rest erst mal in ruhe anschauen aber sieht eigentlich schonmal ganz gut aus aber so weit schonmal: -dein einzeiler "haupt" ist eine endlos schleife,du solltest keine marke:rolleyes: benutzen, du solltest "sjmp $" benutzen um auf den interrupt zu warten (ist besser so) -hast du vielleicht eine includedatei mit unterprogrammen für den LCD? so müsstest du den wert nur in das vom unterprogramm verwendete register schreiben und das unterprogramm aufrufen -für was brauchst du denn eine tastatur für eine uhr?:confused: aber hier der code dafür (als u-prog), musst eben nur noch den port umstellen bei mir ist das p0 wie du ja siehst start: MOV P0,#1110$1111b JB P0.0,m2 MOV p1,#0000$0110b m2: MOV P0,#1110$1111b JB P0.1,m3 MOV p1,#0101$1011b m3: MOV P0,#1110$1111b JB P0.2,m4 MOV p1,#0100$1111b m4: CALL sek MOV P0,#1101$1111b JB P0.0,m5 MOV p1,#0110$0110b m5: MOV P0,#1101$1111b JB P0.1,m6 MOV p1,#0110$1101b m6: MOV P0,#1101$1111b JB P0.2,m7 MOV p1,#0111$1101b m7: CALL sek MOV P0,#1011$1111b CALL sek JB P0.0,m8 MOV p1,#1000$0111b m8: MOV P0,#1011$1111b JB P0.1,m9 MOV p1,#1111$1111b m9: MOV P0,#1011$1111b JB P0.2,mstern MOV p1,#1110$1111b mstern: CALL sek MOV P0,#0111$1111b CALL sek JB P0.0,m0 MOV p1,#1011$1111b m0: MOV P0,#0111$1111b JB P0.1,mraute MOV p1,#33h mraute: MOV P0,#0111$1111b JB P0.2,m1 MOV p1,#37h m1: ; CALL sek JMP start sek: MOV 79H,#1 zsek1: MOV 78H,#2 zsek2: MOV 77H,#4 DJNZ 77H,$ DJNZ 78H,zsek2 DJNZ 79H,zsek1 RET bis dann Zitieren
Michael18964 Geschrieben 16. Juli 2006 Autor Geschrieben 16. Juli 2006 die tastatur brauch ich dazu, weil das eine stoppuhr ist, mit der tastatur stopp und starte ich das ganze schonmal vielen dank goblack3, werd mir deine infos mal durch den kopf gehen lassen mfg michael Zitieren
goblack3 Geschrieben 16. Juli 2006 Geschrieben 16. Juli 2006 wenn ich dir beim LCD noch helfen soll, dann sollte ich wissen ob du ein schon vorhandenes u-programm hast (z.b. von deiner schule eins erhalten hast):confused: bei mir geht das z.b. so um eine zeichenkette auf dem LCD auszugeben ;lcd-initialisierung //wird dir aber wahrscheinlich nichts bringen,da ich ja ein anderes u-prog habe call init ;lcd-initialisierung call dis_on1 ;einstellungen für ohne blinkenden cursor call display call clear ;bildschirm löschen mov r5,#0h ; call pos ;positionsangabe mov dptr,#text ;springt zur marke text und holt sich diesen ab, indem die zeichebfolge in den datapointer(dptr) geschrieben wird call lcdsend ;sendet zeichenfolge text: db "von goblack3",0 ;text der angezeigt werden soll ;um ein einzelnes zeichen anzuzeigen mov r0,#48d ;48d ist die ziffer 0 im ascii-code m: call zeichen call sek inc r0 sjmp m achtung: den teil mit db "text",0 musst du ganz am ende des programms hinschreiben, aber natürlicch vor den include-dateien und dem end:mod: Zitieren
Michael18964 Geschrieben 17. Juli 2006 Autor Geschrieben 17. Juli 2006 hey ja schon haben unterprogs bekommen für lcd und matrix aber ka wie ich die einbauen kann bzw. was ich hinschreiben muss damit was ausgegeben wird... Zitieren
Michael18964 Geschrieben 18. Juli 2006 Autor Geschrieben 18. Juli 2006 also mein etziges prob ist wie schreib ich den dass rein dass zb r3 also die 1/10sek ausgeben werden bzw auch r4 r5 usw. eben alles zusammen...und wie macht man da ne leerstelle damit zwischen sekunde minute usw. immer eine zeile frei bleibt? ich habs etz mal so gemacht könnte das funktionieren wäre aber glaub ohne leerstellen und zeigt es dann auch alles gleichzeitig an? INC R5 ;1/10 CJNE R5, #10d, marke1 ;solange r5 zählen bis 10mal durchgelaufen und somit 1sec gedauert hat MOV anzeigen, R5 ;r5 und somit die 1/10sec ausgeben MOV R5, #0h ;r5 auf 0 zurück setzen und wie mach ich dass damit man zb auf 1drückt und die stoppuhr anfängt und wenn man 2drückt stoppt...bzw. dass man eben dass interrupt starten lässt und stoppen wie gesagt unterprogs hab ich für alles...sollt ich die auch ganz posten? mfg michael Zitieren
goblack3 Geschrieben 18. Juli 2006 Geschrieben 18. Juli 2006 hy, -ja schick mir die u-progs mal an goblack3@web.de -das mit dem leerzeichen da schau mal im ascii-code (sehr hilfreich bei assembler) z.b. bei: http://www.inf.hs-anhalt.de/Service/ASCII-Code.htm Leerzeichen ist: 32d oder 20h, jenachdem welche schreibform du verwendest ich bevorzuge normalerweise die hexschreibform(ist leichter umzurechnen) -also zu dem "aber ka wie ich die einbauen kann bzw.was ich hinschreiben muss damit was ausgegeben wird..." du musst dann ein einzelnes zeichen ausgeben: ;um ein einzelnes zeichen anzuzeigen mov r0,#48d ;48d ist die ziffer 0 im ascii-code m: call zeichen call sek inc r0 sjmp m du musst das ja in einer schleife durchlaufen lassen,ist ja klar bei der stoppuhr da du ja hochzählst.du schreibst den momentanen wert der gerade angezeigt werden soll also z.b. jede einzelne sekunde nach dieser zählschleife in das register, das dafür vorgesehen ist, um ein einzelnes zeichen auszugeben. bei mir ist das r0,wie du ja siehst. ich weiß jetzt nur die adresse von r5(in hex)nicht auswendig,musst eben in deinen datenblättern nachschauen,da man ja nicht "mov r0,r5" machen darf sowiet ich gerade weiß,aber mov r0,hex-adresse von r5, also z.b.: marke: INC R3 CJNE R3, #10d, marke mov r0,#hex-adresse von r3 call zeichen ;zeichen ist ein u-prog das ich benutzte MOV R3, #0h ;r3 auf 0 zurück setzen -als nächstes:wieso machst du immer CJNE R4, #60d, marke1 z.b. ? die schleife läuft ja so immer nur einmal durch und springt dann zurück ins hauptprogramm. ich würde es so machen: marke: INC R1 ;1/1000sec CJNE R1, #10d, marke ;solange r1 zählen bis 10mal durchgelaufen und somit 1/100sec gedauert hat MOV R1, #0h ;r1 auf 0 zurück setzen marke1: INC R2 ;1/100 CJNE R2, #10d, marke1 ;solange r2 zählen bis 10mal durchgelaufen und somit 1/10sec gedauert hat MOV R2, #0h ;r2 auf 0 zurück setzen marke2: INC R3 ;1/10 CJNE R3, #10d, marke2 ;solange r3 zählen bis 10mal durchgelaufen und somit 1sec gedauert hat mov r0,#hex-adresse von r3 call zeichen ;zeichen ist ein u-prog das ich benutzte MOV R3, #0h ;r3 auf 0 zurück setzen marke3: INC R4 ;sec CJNE R4, #60d, marke3 ;solange r4 zählen bis 60mal durchgelaufen und somit 1min gedauert hat mov r0,#hex-adresse von r4 call zeichen ;zeichen ist ein u-prog das ich benutzte MOV R4, #0h ;r4 auf 0 zurück setzen marke4: INC R5 ;min CJNE R5, #60d, marke4 ;solange r5 zählen bis 60mal durchgelaufen und somit 1h gedauert hat mov r0,#hex-adresse von r5 call zeichen ;zeichen ist ein u-prog das ich benutzte MOV R5, #0h ;r5 auf 0 zurück setzen marke5: das läuft doch 60*mal durch und nicht ? INC R6 ;min _/ / CJNE R6, #60d, marke5 ;solange r6 zählen bis 24mal durchgelaufen und somit 1d gedauert hat mov r0,#hex-adresse von r6 call zeichen ;zeichen ist ein u-prog das ich benutzte MOV R6, #0h ;r6 auf 0 zurück setzen so ich hoffe mal ich hab nichts vergessen oder falsch gemacht:) wenn doch dann sorry. achja tut das mit der matrix-tastatur denn überhaupt, zum testen kannste das ja einfach nur auf der 7-segment-anzeige machen, falls du auf deinem board/platine eine drauf hast. ich hab den atmel t89c51cc01 mit 8051-Architektur ach und nerven tut das nicht gruß daniel Zitieren
Michael18964 Geschrieben 18. Juli 2006 Autor Geschrieben 18. Juli 2006 also danke mal aber ist dass etz nicht so dass wenn ich es so mache: marke0: CJNE R0, #4d, marke1 MOV R0, #0h ;r0 auf 0 zurück setzen marke: INC R1 ;1/1000sec CJNE R1, #10d, marke ;solange r1 zählen bis 10mal durchgelaufen und somit 1/100sec gedauert hat MOV R1, #0h ;r1 auf 0 zurück setzen marke1: INC R2 ;1/100 CJNE R2, #10d, marke1 ;solange r2 zählen bis 10mal durchgelaufen und somit 1/10sec gedauert hat MOV R2, #0h ;r2 auf 0 zurück setzen müsste ich nicht immer auf marke0 zurück gehen da sonst doch r1, r2 usw. zu schnell erhöht wird. sprich es läuft 4mal bei marke0 durch somit wird r1 um eins erhöht und ist es ungleich 10 wird r1 wieder um eins erhöht ist dass dann nicht zu schnell es sollte ja wieder genau 1000µs dauern damit ich auf die richtige zeit hab... achja und warum: mov r0,#hex-adresse von r5 hex von adresse r5 ist klar aber warum r0 bzw. muss ich dann in dem unterprog vom lcd prog r0 irgendwie als ausgabe definieren? und dass mit der matrix tastatur müssen wir machen genau so dass lcd display dass prob ist ich muss dass morgen eingeltich abgeben und vortragen^^ ach und noch was wir haben nix bekommen wo die hex adressen von r1 r2 usw. stehen hast du ne ahnung wo man die her bkeommen könnte? weil der lehrer hat erstens überhaupt kein plan und hilft net und ich seh ihn vor der abgabe nimmer;-) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.