hi, ich wollt ne Steuerung für mein 2 Controller LCD schreiben...wenn eine Variable 1 ist soll der nächste befehl übersprungen werden wie macht man sowas. bei den Vergleichen geht das ja glaube nur mit srüngen oder? und das wärren in meinem fall ziemlich viele, was unpraktich wäre.
es gibt sbic bzw. sbis "S kip if B it in reg I ster S et / C leared" Datenblatt hilft....
übringens hat deinposting wenig zusammenhang mit dem betreff...
sorry ich habe mich vertippt...ich meinte die befehle: sbic und sbis und wollte sowas mit Variablen machen...
ich habe mal was mit registern probiert...allerdings kommt jetzt egal ob
ich auf 1 oder display 2schalte immer auf beiden Text...
hier der Code:
.include "m32def.inc"
.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
.def lcdno = r19
ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten
RAM-Adresse
out SPL, temp1
ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten
RAM-Adresse
out SPH, temp1
ldi temp1, 0xFF ; Port D = Ausgang
out DDRD, temp1
cbr lcdno, 0
rcall lcd_init ; Display initialisieren
rcall lcd_clear ; Display löschen
sbr lcdno, 0
rcall lcd_init ; Display initialisieren
rcall lcd_clear ; Display löschen
cbr lcdno, 1
ldi temp1, 'T' ; Zeichen anzeigen
rcall lcd_data
ldi temp1, 'e' ; Zeichen anzeigen
rcall lcd_data
ldi temp1, 's' ; Zeichen anzeigen
rcall lcd_data
ldi temp1, 't' ; Zeichen anzeigen
rcall lcd_data
;sbr lcdno, 1
;ldi temp1, 'T' ; Zeichen anzeigen
;rcall lcd_data
;ldi temp1, 'e' ; Zeichen anzeigen
;rcall lcd_data
;ldi temp1, 's' ; Zeichen anzeigen
;rcall lcd_data
;ldi temp1, 't' ; Zeichen anzeigen
;rcall lcd_data
loop:
rjmp loop
.include "lcd-routines.asm" ; LCD-Routinen werden hier
eingefügt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LCD-Routinen ;;
;; ============ ;;
;; (c)andreas-s@web.de ;;
;; ;;
;; 4bit-Interface ;;
;; DB4-DB7: PD0-PD3 ;;
;; RS: PD4 ;;
;; E: PD5 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.equ LCD_PORT = PORTD
.equ LCD_DDR = DDRD
.equ PIN_E = 5
.equ PIN_E2 = 6
.equ PIN_RS = 4
.equ XTAL = 15300000
;sendet ein Datenbyte an das LCD
lcd_data:
mov temp2, temp1 ; "Sicherungskopie" für
; die Übertragung des 2.Nibbles
swap temp1 ; Vertauschen
andi temp1, 0b00001111 ; oberes Nibble auf Null setzen
sbr temp1, 1<<PIN_RS ; entspricht 0b00010000
out LCD_PORT, temp1 ; ausgeben
rcall lcd_enable ; Enable-Routine aufrufen
; 2. Nibble, kein swap da es
schon
; an der richtigen stelle ist
andi temp2, 0b00001111 ; obere Hälfte auf Null setzen
sbr temp2, 1<<PIN_RS ; entspricht 0b00010000
out LCD_PORT, temp2 ; ausgeben
rcall lcd_enable ; Enable-Routine aufrufen
rcall delay50us ; Delay-Routine aufrufen
ret ; zurück zum Hauptprogramm
; sendet einen Befehl an das LCD
lcd_command: ; wie lcd_data, nur RS=0
mov temp2, temp1
swap temp1
andi temp1, 0b00001111
out LCD_PORT, temp1
rcall lcd_enable
andi temp2, 0b00001111
out LCD_PORT, temp2
rcall lcd_enable
rcall delay50us
ret
; erzeugt den Enable-Puls
lcd_enable:
sbrs lcdno, 1
sbi LCD_PORT, PIN_E ; Enable high
sbrc lcdno, 1
sbi LCD_PORT, PIN_E2 ; Enable high
nop ; 3 Taktzyklen warten
nop
nop
cbi LCD_PORT, PIN_E ; Enable wieder low
cbi LCD_PORT, PIN_E2
ret
; Und wieder zurück
; Pause nach jeder Übertragung
delay50us: ; 50us Pause
ldi temp1, ( XTAL * 50 / 3 ) / 1000000
delay50us_:
dec temp1
brne delay50us_
ret ; wieder zurück
; Längere Pause für manche Befehle
delay5ms: ; 5ms Pause
ldi temp1, ( XTAL * 5 / 607 ) / 1000
WGLOOP0: ldi temp2, $C9
WGLOOP1: dec temp2
brne WGLOOP1
dec temp1
brne WGLOOP0
ret ; wieder zurück
; wieder zurück
; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
ldi temp1, 0xFF ; alle Pins am Ausgabeport auf
Ausgang
out LCD_DDR, temp1
ldi temp3,6
powerupwait:
rcall delay5ms
dec temp3
brne powerupwait
ldi temp1, 0b00000011 ; muss 3mal hintereinander
gesendet
out LCD_PORT, temp1 ; werden zur Initialisierung
rcall lcd_enable ; 1
rcall delay5ms
rcall lcd_enable ; 2
rcall delay5ms
rcall lcd_enable ; und 3!
rcall delay5ms
ldi temp1, 0b00000010 ; 4bit-Modus einstellen
out LCD_PORT, temp1
rcall lcd_enable
rcall delay5ms
ldi temp1, 0b00101000 ; 4 Bot, 2 Zeilen
rcall lcd_command
ldi temp1, 0b00001100 ; Display on, Cursor off
rcall lcd_command
ldi temp1, 0b00000100 ; endlich fertig
rcall lcd_command
ret
; Sendet den Befehl zur Löschung des Displays
lcd_clear:
ldi temp1, 0b00000001 ; Display löschen
rcall lcd_command
rcall delay5ms
ret
; Sendet den Befehl: Cursor Home
lcd_home:
ldi temp1, 0b00000010 ; Cursor Home
rcall lcd_command
rcall delay5ms
ret
oik....jetgzt bleibt zur abwechslung mal der Erste balken schwarz und egal was ich mache es kommt auf display 2...
irgendwie steht der text jedes mal, wenn ich Strom draufgebe wo anders..
hat sich erledigt...ich habe auch nen neuen Thread mit richtiger Überschrift aufgemacht...der hier kann GELÖSCHT werden!!!!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.