PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 8Bit Routine HD44870 Display



Namenlos
05.02.2009, 21:27
Hallo Leute =)

Ich erhoffe mir mal wieder eine gute Hilfe von euch und zwar
geht es um folgendes:
Auf mikrocontroller.net findet man ja im Toutorial eine
sehr gute beschreibung für eine LCD Ansterungsroutine
für eine 4 Bit Ansteuerung.
Da ich aber an meinen ATMega8 viele Pins habe und ich
nur ein paar Pins gebrauche (Display + 2 AD Wandler )
habe ich die Routine ( versucht O:) )
auf 8 Bit umgeschrieben... und nun erhoffe ich mir
ob ihr diese mal auf Fehler kontrollieren könntet oder weitere
Tipps dazu geben könntet =)

Das Toturial auf µC.net
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

Liebe Grüße
Namenlos


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 8bit-Interface ;;
;; ;;
;; D0 = PortD0 ;;
;; D1 = PortD1 ;;
;; D2 = PortD2 ;;
;; D3 = PortD3 ;;
;; D4 = PortD4 ;;
;; D5 = PortD5 ;;
;; D6 = PortD6 ;;
;; D7 = PortD7 ;;
;; ;;
;; R/W = PortB0 ;;
;; RS = PortB1 ;;
;; E = PortB2 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

.def init = r21
.def temp2 = r22
.def temp3 = r23

.ifndef XTAL
.equ XTAL = 4000000
.endif


lcd_data: ;RS = 1,;sendet ein Datenbyte an das LCD

push init
sbi PortB, 1
rcall lcd_enable
rcall delay50us
pop init
ret



lcd_command:;sendet einen Befehl an das LCD

push init
cbi PortB, 1 ;RS=0, Daten werden geschrieben
rcall lcd_enable
rcall delay50us
pop init
ret ;zurück zum Hauptprogramm



lcd_enable: ;erzeugt den Enable-Puls

;Bei höherem Takt (>= 8 MHz) kann es notwendig sein,
;vor dem Enable High 1-2 Wartetakte (nop) einzufügen.
;Siehe dazu http://www.mikrocontroller.net/topic/81974#685882


sbi PORTB, 2 ; Enable high
nop ; 3 Taktzyklen warten
nop
nop
cbi PORTB, 2 ; Enable wieder low
ret ; Und wieder zurück




delay50us: ;Pause nach jeder Übertragung,50us

ldi init, ( XTAL * 50 / 3 ) / 1000000
delay50us_:
dec init
brne delay50us_
ret ; wieder zurück



delay5ms: ; 5ms Pause
ldi init, ( XTAL * 5 / 607 ) / 1000
WGLOOP0: ldi temp2, $C9
WGLOOP1: dec temp2
brne WGLOOP1
dec init
brne WGLOOP0
ret ; wieder zurück


lcd_init: ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden



ldi temp3,50
powerupwait:
rcall delay5ms
dec temp3
brne powerupwait
ldi init, 0b00000011 ; muss 3mal hintereinander gesendet
out PortD, init ; werden zur Initialisierung
rcall lcd_enable ; 1
rcall delay5ms
rcall lcd_enable ; 2
rcall delay5ms
rcall lcd_enable ; und 3!
rcall delay5ms

ldi init, 0b00110000 ; 8Bit / 2 Zeilen / 5x7
rcall lcd_command
ldi init, 0b00001100 ; Display ein / kein Cursor / kein Blinken
rcall lcd_command
ldi init, 0b00000100 ; inkrement / kein Scrollen
rcall lcd_command
ret



lcd_clear: ;Sendet den Befehl zur Löschung des Displays



ldi init, 0b00000001 ; Display löschen
rcall lcd_command
rcall delay5ms
ret





lcd_home: ;Sendet den Befehl: Cursor Home



ldi init, 0b00000010 ; Cursor Home
rcall lcd_command
rcall delay5ms
ret

Lazareth
21.02.2009, 23:48
musst ja nur das umtauschen weglassen (swap) und die initialisierung ein bisschen abwandeln.


hier mal meine 8-bit ansteuerung:

PD0-PD7 entspricht DB0-DB7
Rs is an PC5
E an PC3

dieser code funktioniert.


;definitionsdatei

.equ DBport= portd ; ausgabeport
.equ RWport= portc ; RS,RW, E
.equ DBddr= ddrd ; datenrichtung ausgabe
.equ RWddr= ddrc ; datenrichtung rs, rw, e
.equ pine= 3
.equ pinrw= 4
.equ pinrs= 5

.device mega8
.include "m8def.inc"

; Stack initialisieren

ldi r16, LOW(RAMEND)
out SPL, r16

ldi r16, HIGH(RAMEND)
out SPH, r16

;****************hier starten********************
rcall ms10
rcall ms10
rcall ms10
rcall ms10
rcall ini

rjmp haupt

;****************Ein/Ausgänge*********************

ddrdaus: ldi r16, $ff ; Datenausgänge DB0-7
out ddrd, r16
ret
ddrdein: ldi r16, 0
out ddrd, r16
ret
ddrcaus:ldi r16, $ff ; kontrollausgänge RS;RW;E
out ddrc, r16
ret
ddrcein:ldi r16, 0
out ddrc, r16
ret

;****************Warteschleifen*******************
ms2:
ldi r24, low (125) ;// 2000 = µs = 2ms; 4 = takte
ldi r25, high (125) ;// 2000 = µs = 2ms; 4 = takte
ms21: sbiw r24,1 ;//2takte
brne ms21 ;//2takte
ret ;//4takte

ms5:
ldi r24, low (1250) ;// 5000 = µs = 5ms; 4 = takte
ldi r25, high (1250) ;// 5000 = µs = 5ms; 4 = takte
ms51: sbiw r24,1 ;//2takte
brne ms51 ;//2takte
ret ;//4takte

ms10:
ldi r24, low (2500) ;// 10000 = µs = 10ms; 4 = takte
ldi r25, high (2500) ;insgesamt 4Takte
ms101: sbiw r24,1 ;//2takte
brne ms101 ;//2takte
ret ;//4takte

;****************Daten/Befehle senden*************

;----------Daten Senden
daten: rcall ddrcaus
rcall ddrdaus
out portd, r17
sbi portc, pinrs
nop
sbi portc, pine
nop
nop
nop
nop
cbi portc, pine
rcall ms2
ret

;----------Befehle Senden
befehl: rcall ddrcaus
rcall ddrdaus
out portd, r17
nop
sbi portc, pine
nop
nop
nop
nop
cbi portc, pine
rcall ms2
ret

;----------Befehl für ini mit zeit
befehlini: rcall ddrcaus
rcall ddrdaus
out portd, r17
nop
sbi portc, pine
nop
nop
nop
nop
cbi portc, pine
rcall ms5
ret

;****************Initialisierung******************
ini: rcall ddrdaus ;ddrd = ausgang
rcall ddrcaus ;ddrc = ausgang
ldi r17, 0x00
out portd, r17
ldi r17, $30 ;$30 = 3 mal auf ausgang
rcall befehlini ; 1 befehl senden
rcall befehlini ; 2 befehl senden
rcall befehlini ; 3 befehl senden
;Function set
;DL = 1 = 8bit-modus, N = 1 = 2 Zeilen,
ldi r17, 0b00111000 ;Funtion set, DL, N, F
rcall befehlini
;Display ON/OFF
ldi r17, 0b00001110 ;Display, ON/Off, cursor an/aus, Block/Unterstrich
rcall befehlini
ldi r17, 0b00000001
rcall befehlini
ret

;----------------Hauptprogramm-------------------

haupt:

ldi r17, '0'
rcall daten
ldi r17, '8'
rcall daten
ldi r17, '/'
rcall daten
ldi r17, '1'
rcall daten
ldi r17, '5'
rcall daten

loop:
rjmp loop