Code:
	;###################################################################################
;#                                                                                 #
;#                             LCD Testprogramm                                    #
;#                            -------------------                                  #
;#                                                                                 #
;# Microcontroller: ATMEGA8                                                        #
;# Quarz:           4.194304 MHz                                                   #
;#                                                                                 #
;# Autor: Denis Bethäuser                                                          #
;#        www.elektronik4freaks.de.tk                                              #
;#        denis.bethaeuser@gmx.de                                                  #
;#                                                                                 #
;###################################################################################
;----[ µC Includefile ]-------------------------------------------------------------
.include "m8def.inc"
;----[ Register Def. / Alias Def. ]-------------------------------------------------
.def tmp 	= r16
.def tmp2 	= r17
.def tmp3  	= r18
.def BCDH	= r19						  ;Hunderter Ziffer
.def BCDZ	= r20						  ;Zehner Ziffer
.def BCDE	= r21	                   	  ;Einer Ziffer
.equ db0 	= 0
.equ db1 	= 1
.equ db2 	= 2 
.equ db3 	= 3
.equ db4 	= 4
.equ db5 	= 5
.equ db6 	= 6
.equ db7 	= 7
.equ rs 	= 4
.equ en 	= 5
.equ lcd_port = portc
;----[ STACK-Pointer un Z-Pointer Einrichten ]---------------------------------------
ldi tmp, high(ramend)                     ;High-Byte in Stackpointer schreiben
out sph, tmp
ldi tmp, low(ramend)                      ;Low-Byte in Stackpointer schreiben
out spl, tmp
;----[ I/O Einstellungen ]----------------------------------------------------------
ser tmp                                   ;Der gesammte Portc als Ausgang
out ddrc, tmp
;---[ LCD Initialisieren ]----------------------------------------------------------
rcall lcdinit                             ;Display initialisieren
rcall lcd_cls                             ;Display löschen
;---[ Hauptprogramm ]---------------------------------------------------------------
main:
ldi tmp, 234
BCDH:
  cpi tmp, 100
  brcs BCDZ
  
  subi tmp, 100
  inc BCDH
rjmp BCDH
BCDZ:
  cpi tmp, 10
  brcs BCDE
  subi tmp, 10
  inc BCDZ
rjmp BCDZ
BCDE: 
  mov BCDE, tmp
  subi BCDH, -'0'
  subi BCDZ, -'0'
  subi BCDE, -'0'
  
  rcall lcd_cls
  
  mov tmp, BCDH
  rcall lcd_out
  mov tmp, BCDZ
  rcall lcd_out
  mov tmp, BCDE
  rcall lcd_out
end: rjmp end 
;                        LCD - Sende / Empfang - Subroutinen
;                      =======================================
;###[ lcd_init  Initialisierung ]###################################################
lcdinit:
  
  ldi tmp3 , 10          
 
 poweron:                    ;Wartet 10x 5ms nach dem Einschalten von Vcc                     
                
  rcall waitms5              
  dec tmp3
  brne poweron
 ldi tmp, (1<<db0)|(1<<db1)  ;Datenleitung 4 und 5 setzen und 3mal senden
 
 out lcd_port, tmp           ;1mal
 rcall toogleen
 out lcd_port, tmp           ;2mal
 rcall toogleen
 out lcd_port, tmp           ;3mal
 rcall toogleen
 rcall waitms5               ;und nochmals warten
 ldi tmp, (1<<db1)           ;4-Bit Modus aktivieren
 out lcd_port,tmp
 rcall waitms5               ;und schon wieder 5ms warten
 ldi tmp, (1<<db5)|(1<<db3)  ;5x7-Dots und 2-Lines
 rcall lcd_com
 ldi tmp, (1<<db3)|(1<<db2)  ;Display On, Cursor off, Blinking off
 rcall lcd_com
 ldi tmp, (1<<db2)           ;Entry Mode und FERTIG
 rcall lcd_com
 rcall lcd_cls               ;So jetzt noch den Display löschen und ab gehts
ret
;###[ lcd_out  Daten senden ]#######################################################
lcd_out:
 
 mov tmp2, tmp               ;Befehlsbyte kopieren
 
 swap tmp                    ;Nippeltausch ( Hightbits zuerst senden )
 andi tmp, 0b00001111        ;es dürfen ja nur die Pin0 - 4 gesetzt werden
 
 out lcd_port, tmp           ;und ab ins LCD damit
 sbi lcd_port, rs            ;und die RS Leitung setzen
 rcall toogleen 
        
 cbi lcd_port, rs            ;und die RS Leitung rücksetzen
 andi tmp2, 0b00001111       ;so und jetzt die 4 Lowbits fürn Port zuschneiden
 
 out lcd_port, tmp2          ;und ab ins LCD
 sbi lcd_port, rs            ;RS Leitung setzen 
 rcall toogleen 
 
 rcall waitus50              ;und wieder 50µS warten 
 cbi lcd_port, rs            ;RS Leitung rücksetzen    
ret
;###[ lcd_com  Befehle senden ]#####################################################
lcd_com:
 
 mov tmp2, tmp               ;Befehlsbyte kopieren
 
 swap tmp                    ;Nippeltausch ( Hightbits zuerst senden )
 andi tmp, 0b00001111        ;es dürfen ja nur die Pin0 - 4 gesetzt werden
 
 out lcd_port, tmp           ;und ab ins LCD damit
 rcall toogleen 
          
 andi tmp2, 0b00001111       ;so und jetzt die 4 Lowbits fürn Port zuschneiden
 
 out lcd_port, tmp2          ;und ab ins LCD 
 rcall toogleen 
 
 rcall waitus50              ;und wieder 50µS warten     
ret
;###[ lcd_cls  Display löschen ]####################################################
lcd_cls:
 ldi tmp, (1<<db0)           ;Display löschen
 rcall lcd_com
 
 rcall waitms5
ret
;                           WARTESCHAUFEN UND SONST. SUBs
;                         =================================
;---[ Enable Set/Reset ]------------------------------------------------------------
toogleen:
 sbi lcd_port,en             ;Enable auf High setzen
 nop                         ;1µSec Warten
 nop
 nop
 nop
 cbi lcd_port,en             ;Enable au Low setzen
ret
;---[ 50µS warten ]-----------------------------------------------------------------
waitus50:                    ;Genau 50µS warten ( 190 + 10 Clocks bei 4MHz )
           ldi  tmp, $3F
 WGLP3:    dec  tmp
           brne WGLP3
           nop
ret
;---[ 5mS warten ]------------------------------------------------------------------
waitms5:                     ;Ganz genau 5ms warten (19990 + 10 Clocks bei 4MHz)
           ldi  tmp, $1E
 WGLP0:    ldi  tmp2, $DD
 WGLP1:    dec  tmp2
           brne WGLP1
           dec  tmp
           brne WGLP0
           ldi  tmp, $03
 WGLP2:    dec  tmp
           brne WGLP2
           nop
ret
 Bin daran meine Programmierkünste anzuzweifeln, helft mir bitte!!!
						
Lesezeichen