Assembler Programm


Recommended Posts

Silvesterbummler

Ich brauche dringend Hilfe zu einer Aufgabenstellung:

Tastenauswertung mit Anzeige am LCD: Je nach gedrückter Taste ist deren Code auszuwerten und am LCD anzuzeigen. "Code xx (binär) entspricht Taste yy (dezimal)".

Wer kann mir dabei helfen?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Silvesterbummler

hinzufügen möchte ich noch:

Es soll verwendet werden:

µC: SAB 80C517A

Programm: Keil µVision

µC-Board mit 12 Tasten (von 0-11) - diese sollen ausgewertet werden

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

romazone.org

hab dein problem wie versprochen in die tu graz newsgroup gepostet - hier die erste antwort:

Ein wenig schwierig, wenn man nicht genau weiß, wie das Board aufge-

baut ist.

Ich denke mal, es handelt sich vielleicht um eine 4x3-Matrix-Tastatur.

Wenn dem so ist, kann man über einen Port bzw. über einen externen

Adressdekoder eine der Steuerleitungen auf 1 setzen und die anderen

auf 0 belassen. Danach kann man die Leseleitungen abfragen und somit

herausfinden, welche Taste gedrückt wurde.

Z.B. Steuerleitungen => '0100'

    Leseleitungen  <=  '100'

würde bedeuten, 1. Taste in der zweiten Reihe gedrückt. Verwendet man

für Steuer- und Leseleitungen je ein Nibble hätte man z.B. den Binär-

wert 0100 0100 = 44h für diese Taste. Der dezimale Wert wäre je nach

Zählweise (von oben, von unten, wie beim Taschenrechner) 4 oder 7

oder so.

S  >-----+-----+-----+

T        |    |    |

E        |    |    |

U  >-----+-----+-----+

E        |    |    |

R        |    |    |

L  >-----+-----+-----+

E        |    |    |

I        |    |    |

T  >-----+-----+-----+

U        |    |    |

N        |    |    |

G        v    v    v

          LESELEITUNGEN

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Silvesterbummler
Musst du genau diesen µC verwenden ?

Oder geht ein PIC von Microchip auch ?

ja, ich muss den Infineon SAB 80C517A verwenden!

zur Ergänzung:

Das µC-Board, auf dem gearbeitet wird, sieht so aus:

post-29-1074183286.jpg

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

  • 2 weeks later...
Silvesterbummler
hab die neuen infos wieder gepostet - werde mich melden wenns lösungsvorschläge gibt! :winke:

gibts was neues?

P.S.:

Die Initialisierung für das Hitachi-Display ist schon erledigt.

;***************************LCD.ASM***************************************

;***************Hitachi - LCD - Display : Unterprogramme******************

;-------------------------------------------------------------------------

$NOMOD51

$INCLUDE(REG517A.INC)

; LCD-Controller: HD 44780; Ansteuerung über P5.1 ...P5.7 

; 2 Zeilen, 4 Bit-Ansteuerung

; P5.1 = RS  P5.2 = R/W  P5.3 = E    P5.4 .. P5.7 = DB4 .. DB7

; temporär benötigte Register während der Abarbeitung : R1,R2,R4,R5,R6

; permanent benötigte Register für Variablenübergabe in Oneascout und DATAtoLCD:

;                                in R4 steht die Position (Adresse),

;      in R5 das ASCII - Zeichen

; Permanent benötigter Datenbereich: DATA : 7Eh,7Fh für DPTR

PUBLIC LCD_init,datatolcd,oneascout,lcd_write_reg,lcd_busy,lcd_enable,lcd_clr_home

lcd_port  equ    0f8h        ;Port 5

LCDINITIAL segment code      ; verschiebbares Code - Segment

          RSEG LCDINITIAL

;***************************************************************************

; Unterprogramm LCD_INIT

; Voraussetzungen: keine            Bedarf:  R1,R4,R6

lcd_init:  mov r1,#0ffh            ;Verzoegerungsschleife f?r 15ms,

            mov r6,#30d            ;Die Verz"gerungsschleifen sind f?r 12MHz Systemtakt ausgelegt!

loop:      djnz r1,loop

            djnz r6,loop           

            mov lcd_port,#00110000b ;Function set, 8 Bit-Init. A5=A4=1

            call lcd_enable    ;macht setb en clrb en

            mov r6,#9d              ;Verz"gerungsschleife 4,1ms

loop2:      djnz r1,loop2

            djnz r6,loop2

            call lcd_enable    ;noch einmal

            mov r1,#100d            ;Verz"gerungsschleife 100us

loop3:      djnz r1,loop3

            call lcd_enable

            mov lcd_port,#00100000b ;Interfacelaenge = 4Bit, Function set

            call lcd_enable    ; DL = 0, D3 bis D0 = egal

            call lcd_busy

            mov r4,#00101000b      ;jetzt endlich 4Bit:progr. 2 Zeilen, 5*7

            call lcd_write_reg    ;unteres und dann oberes Nibble senden

            mov r4,#00001000b      ;Display off

            call lcd_write_reg

            mov r4,#00001100b      ;Display on

            call lcd_write_reg

            mov r4,#00000110b      ;entry mode : Bewegungsrichtung Cursor rechts

            call lcd_write_reg

            call lcd_clr_home      ;clear display

            call lcd_home

            ret

;*************weitere  Unterprogramme***********************************************

lcd_home:  mov r4,#2d              ;Cursor Home (00H,DD RAM Adr. bleibt!)

            jmp lcd_write_reg

           

lcd_clr_home:

            mov r4,#1d              ;Clear Home

            jmp lcd_write_reg

;************************LCD_ENABLE***************************************************************       

; Voraussetzungen: keine            Bedarf:  keiner

lcd_enable: setb lcd_port.3        ;Enable 1 setzen

            clr lcd_port.3          ;Enable 0 setzen

            ret

;************************LCD.BUSY******************************************************                       

; Voraussetzungen: keine            Bedarf:  keiner

;Busyflag prüfen und gegebenenfalls warten

lcd_busy:  mov lcd_port,#11110100b ;Port auf Eingabe schalten, R/W = 1

lcd_busy_en:

            setb lcd_port.3        ;Enable auf 1

            jb lcd_port.7,noch_busy ;noch busy ?, busy bit = P5.7

            clr lcd_port.3          ;Enable auf 0

            call lcd_enable        ;Dummyread f?r die unteren 4Bits

            ret

noch_busy:  clr lcd_port.3          ;Enable auf 0

            call lcd_enable        ;Dummyread f?r die unteren 4Bits

            jmp lcd_busy_en

;************************Unterprogramm Lcd_Write_reg**********************

;Voraussetzungen: R4 mit LCD - Adresse        Bedarf:  R4

;Adresse in R4 am LCD-Modul einstellen

lcd_write_reg:

            call lcd_busy

            mov a,#11110000b        ;das obere Nibble ausmaskieren

    anl a,r4

    mov lcd_port,a         

            call lcd_enable        ;und ausgeben

            mov a,#00001111b        ;das untere Nibble ausmaskieren

            anl a,r4

            swap a                  ;Nibbles tauschen

            mov lcd_port,a

            call lcd_enable        ;und ausgeben

            ret

;*****************************ONEASCOUT*************************************

; Voraussetzungen: R4,R5 mit Werten            Bedarf:  R4,R5

;schreibt ein ASCII -Zeichen (in R5) auf Adresse (in R4) des LCD raus

Oneascout:  push acc

            push PSW

            call lcd_write_reg      ;

            call lcd_busy

            mov a, r5            ;oberes Nibble senden

            anl a, #11110000b

            mov lcd_port,a         

            setb lcd_port.1        ;RS = 1

            call lcd_enable        ;und ausgeben

            mov a, r5              ;unteres Nibble senden

            swap a

            anl a,#11110000b        ;

            mov lcd_port,a

            setb lcd_port.1        ;RS = 1

            call lcd_enable        ;und ausgeben

      pop PSW

            pop acc

            ret                  ;

;**********************DATAtoLCD************************************************

; Voraussetzungen: DPTR mit Adresse des Strings

; Bedarf:  R2,R4,R5  DATA: 7E, 7F als Zwischenspeicher für DPTR

; Schreibt Datenstring (2mal 20 Zeichen max. zweizeiliges Display ) aus ROM

; zeichenweise nach R5, die Adresse nach R4 und ueber ONEASCOUT aufs  Display

; Abbruchbedingung ist '0' nach String

; String darf nicht länger als 40 Zeichen sein. 2.Zeile = 21. Zeichen,vorher Blanks!

DATAtoLCD:  push acc

            push PSW

            Mov R2, #00H        ; Zeichenzaehler

            mov 7Eh,dpl          ; DPTR sichern

    mov 7Fh,dph

output:    mov dpl,7Eh          ; DPTR für auszugebenden Text   

            mov dpH,7Fh

            mov a,R2

            movc a,@a+DPTR      ; ASCII - Zeichen in den Acc

            jnz naechster;

            pop PSW

            pop acc

            Ret                  ; Ausgabe beendet

naechster:  mov r5, a            ; ASCII - Zeichen nach R5

            mov dptr,#zeichenadr ; Zeichenadresse

            mov a,R2            ; und nach R4

            movc a,@a+dptr

            inc R2

            mov r4,a

            call oneascout

            jmp output

;******************************************************************************

Zeichenadr:  ;Position(Adresse) d. Zeichen (zweizeilig, 2*20 Zeichein)immer gleich

    db 80H,81h,82h,83h,84h,85h,86h,87h,88h,89h,8ah,8bh,8ch,8dh,8eh,8fh

    db 90H,91h,92h,93h

    db 0c0h,0c1h,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H,0C8H,0C9H,0cah,0cbh,0cch,0cdh,0ceh,0cfh

    db 0d0h,0d1h,0d2H,0d3H

;******************************************************************************   

end 

Bräuchte eigentlich nur mehr die Assembler-Routine für die Aufgabenstellung (1. Post)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...


  • Folge uns auf Facebook

  • Partnerlinks

  • Unsere Sponsoren und Partnerseiten

  • Wer ist Online

    • Keine registrierten Benutzer online.