-
        

Ergebnis 1 bis 2 von 2

Thema: 8Bit Routine HD44870 Display

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.10.2008
    Alter
    26
    Beiträge
    110

    8Bit Routine HD44870 Display

    Anzeige

    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 )
    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/artic...-Tutorial:_LCD

    Liebe Grüße
    Namenlos

    Code:
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; 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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    22.02.2007
    Beiträge
    26
    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.

    Code:
    ;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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •