;Forfatter : Navn
;Projekt   : Navn
; Dato     : xx




/*
d: 15/1-2010, ændret så der kan skrives æøå, ÆØÅ i tekststring'en.

Denne rutine er beregnet til at kopiere ind i et uC projekt, for at opnå kontakt til 
et LCD Karakterdisplay

Der downloades danske karakterer æ, ø, å, og Æ, Ø og Å i LCD-modulet !
Startet d. 21/9-03 rev 250903, 2/12-06, 22/01-2007

This text is used for copying into a uC project, in order to comunicate with a 
LCD Character module.

The danish special characters are downloaded in the LCD

Valle Thorø


*/


;$nomod51			;se bort fra 8051 reegistre
;$include (at892051.inc)		;Benyt istedet ATMEL89C2051 definitioner

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

NAME  LCDDisplay   

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

; Konstant-, Hukommelses- og Portbelægning
; Constants, memory and Pins definitions
;---------------------------------------------------------------

; Pins-definitioner

	LCD_RS          EQU P1.7
	LCD_RW          EQU P1.6
	LCD_ENABLE      EQU P1.5
	LCD_D4          EQU P1.4
	LCD_D5          EQU P1.3
	LCD_D6          EQU P1.2
	LCD_D7          EQU P1.1

; LCD_ENABLE kan undværes, Så skal LCD'en blot være enablet hele tiden
; Aktiv LAV !

; LCD_ENABLE is not nessassary needed, should then by hardware be connected to low.
;-------------------------
; RAMdefinitioner / Ram-definitions



; definition af konstanter / definition of Constants






;------------------------------------------
; Her starter selve programmet
; Here the program starts


        Org 0h          ; Programmer assembleres til at starte i adresse 0, 
                        ; der er adressen, der startes i ved reset !

			
        jmp start

;Her er gjort plads til interruptvektorer. De, der skal bruges, skal Unmarkes.



;	ORG 03h			; Interrupt from extern interrupt 0
;	jmp EX0int

;	ORG 0Bh			; Interrupt from Counter 0 overflow
;	Jmp Timer0int		; Hop til timerrutine / Jump to subroutine

;	ORG 13h			; Interrupt from Extern interrupt 1
;	jmp EX1int

;	ORG 1Bh			;Interrupt from timer 1
;	jmp Timer		;Hop til timerrutine / Jump to subroutine

;	org 023h		; seriel interrupt vektor, udløst  af RI eller TI
;	jmp serint		; Created by RI or TI



Start:
        Org 30h         ; her starter programmet
        mov sp, #30h    ; flyt / Move stackpointer, default = 07h

	Call LCD_init	; Start LCD-displayet op, og upload danske karakterer.
;

; Programmet kan placeres her

Mit_program:

/*

Tekstbeskeder skrives fx. som følger:

        Mov a, #00h             ; 1. pos på linien, fra 0 til 19.
        call PCL2               ; PCL1 = Linie 1, PCL2 = Linie 2, 
        mov dptr, #LCD_txt3     ; Datapointer points at text
        call LCD_Printstring    ; Write message, terminated with a 0 ( Zero )
;----------


*/


Loop:			 ; Stop programafvikling her.
	Jmp Loop	 ; Jmp $     betyder også "hop til samme linie"

; Her kommer subrutiner::

;***************************************
; Subrutiner til LC-Display Styring
; Subroutines for controlling the LCD
;***************************************

LCD_init:	 ; LCD initialiering

        mov a,#50
LCD_init_sleepsometime:	; Wait some time til displayet er initialiseret
        call LCD_ws
        djnz Acc,LCD_init_sleepsometime

; Send styrekoder, for at LCD in itialiseres ved power on
; send control codes for initiating

        clr LCD_RS
        clr LCD_RW
        clr LCD_ENABLE
        mov a,#00101000b
        call LCD_send_b
        setb LCD_ENABLE
        clr LCD_ENABLE
        mov a,#00101000b
        call LCD_send_b
        mov a,#1110b		;Cursor on !
        call LCD_send_b
        call LCD_clear
;
        mov a,#64
        call LCD_send_b

; Send danske karakterer til LCD

        mov DPTR,#LCD_cgram
        mov R0,#64
LCD_cgram_label:
        clr a
        movc a,@A+DPTR
        inc DPTR
        call LCD_send_d
        djnz R0,LCD_cgram_label
        call LCD_returnhome
        ret

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

LCD_returnhome:         ; Kaldes for at flytte cursor til linie 1, 1. pos.
        push ACC	; Position the cursor line 1 position 1
        mov a,#128
        call LCD_send_b
        pop ACC
        ret

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

LCD_clear:              ; Sletter al tekst, & Curser Home !
        push ACC	; clear display
        mov a,#1
        call LCD_send_b
        pop ACC
	call Delay
	Ret

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

Delay:	mov R5, #15	; short delay
Delay1: mov R6, #25
			djnz R6, $
			djnz R5, Delay1
		Ret

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

curser_on:
        mov a,#1110b		;Cursor on !
        call LCD_send_b
        ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

curser_off:
        mov a,#1100b		;Cursor off !
        call LCD_send_b
        ret

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

LCD_printc:             ; Sender en karakter i ACC
			; send character in ACC
        call LCD_send_d
        ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

LCD_printstring: 	; Skriver en String, der termineres med et 0, Bruger datapointeren DPTR
		 			; Writes a string, terminated with "0". Uses the Data Pointer
        push ACC
LCD_prints_anf:
        clr a
        movc a,@A+DPTR
        jz LCD_prints_weiter

  ; tjek for danske karakterer
  		Call Tjek_DK
  ; Print
        call LCD_printc
        inc DPTR
        jmp LCD_prints_anf
LCD_prints_weiter:
        pop ACC
        ret

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

Tjek_DK:	; her tjekkes og korrigeres for danske karakterer
			; Data er i reg A.
	cjne a, #'æ', Tjek_DK1
	mov a, #01h
	jmp Tjek_DK99	; til bund af subrutine
Tjek_DK1:
	cjne a, #'ø', Tjek_DK2
	mov a, #02h
	jmp Tjek_DK99	; til bund af subrutine
Tjek_DK2:
	cjne a, #'å', Tjek_DK3
	mov a, #03h
	jmp Tjek_DK99	; til bund af subrutine
Tjek_DK3:
	cjne a, #'Æ', Tjek_DK4
	mov a, #04h
	jmp Tjek_DK99	; til bund af subrutine
Tjek_DK4:
	cjne a, #'Ø', Tjek_DK5
	mov a, #05h
	jmp Tjek_DK99	; til bund af subrutine
Tjek_DK5:
	cjne a, #'Å', Tjek_DK6
	mov a, #06h
Tjek_DK6:
Tjek_DK99:

	Ret

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

LCD_send_b: 	; sender styrekode i ACC til LCD, Til at indstille displayet !
		; Send Commands in ACC, to control the LCD
        clr LCD_RS
        clr LCD_RW
        jmp LCD_send

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

;sender Data i Acc til LCD, Sender "ASCII". Det er dog således i 
; realiteten, at der sendes en talværdi, på den adresse i LCD'ens 
;ROM, hvori et mønster på et bogstav er gemt. 
; De nederste 8 er udlagt i RAM, og det er heri, der kan downloades 
; nationale karakterer. 
LCD_send_d:
        clr LCD_RW
        setb LCD_RS
LCD_send:
        mov c,ACC.7        ; high-nibble sendes
        mov LCD_D7,c
        mov c,ACC.6
        mov LCD_D6,c
        mov c,ACC.5
        mov LCD_D5,c
        mov c,ACC.4
        mov LCD_D4,c
;
        setb LCD_ENABLE
        call LCD_ws
        clr LCD_ENABLE
;
        mov c,ACC.3        ; low-nibble sendes
        mov LCD_D7,c
        mov c,ACC.2
        mov LCD_D6,c
        mov c,ACC.1
        mov LCD_D5,c
        mov c,ACC.0
        mov LCD_D4,c
;
        setb LCD_ENABLE
        call LCD_ws
        clr LCD_ENABLE
        ret

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

;  1.64ms ventesløjfe / Wait 1.64 ms
;  Antal maskincykler: 1640
LCD_ws:
        push psw
        push 0
        mov  0,#232
LCD_ws_labelA:
        nop
        nop
        nop
        nop
        nop
        djnz 0,LCD_ws_labelA
        nop
        nop
        pop 0
        pop psw
        ret

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

; Subroutiner til at positionere cursoren:
; det, der står i displayet slettes ikke 
; Subroutines for positioning the Cursor
; Content in A will move the cursor to that position on the line ( 0 - 19 d )

;Subroutine til positionering af linie 1, 2, 3 eller 4. i LCD-display

;Input: Indhold i Acc er X-værdi på linien ( 0 til 19 d ) !!
;
PCL1:	jmp PCL_99	; Linie 1

PCL2:	add a, #40h	; Linie 2
		jmp PCL_99

PCL3:	add a, #14h	; Linie 3
		jmp PCL_99

PCL4:	add a, #54h	; Linie 4

PCL_99:	add a, #80h
		call lcd_send_b
		ret

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

;Eksempler på Tekstbeskeder, Max 20 karakterer pr linie
; De afsluttes med et '0'
; Examples of textmessages. Max 20 Char. pr. line
; Lines are terminated by "0"

; LCD_txt1:	db 'HTX S', 05h, 'NDERBORG',0  ; gammel !
LCD_txt1a:	db 'HTX SØNDERBORG',0
LCD_txt2:	db 'Extern display ',0
LCD_txt3:	db 'Indtast Nr ',0
LCD_txt4:	db 'Made by  Valle ',0
;20 kar fylder:'                    ',             

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

; Koder til at downloade danske karakterer til LCD-en
; Codes for downloading danish characters to the LCD
LCD_cgram:
        db 0,0,0,0,0,0,0,0          ;       ej brugt
        db 0,0,26,5,15,20,31,0		;æ      1
        db 0,1,14,21,21,14,16,0		;ø      2
        db 4,0,14,1,15,17,15,0		;å		3
        db 15,20,20,30,20,20,23,0	;Æ      4
        db 1,14,19,21,25,14,16,0	;Ø      5
        db 4,0,14,17,31,17,17,0		;Å      6
        db 31,21,21,14,14,4,4,0		;VT     7

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

; Pauserutine, Breack routine,  Ca 1/4 sek.

Pause:
	Mov R6, #0ffh		;Flyt hex ff til register 6
Pause1:	mov r7, #0ffh
	djnz r7, $
	djnz R6, Pause1			;Tæl ned med 1
	Ret
;---------------------------------

Kortpause:      ; Ca ( 0.5 / 256 ) sek
	mov R7, #0FFh
	djnz R7, $
	ret

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

  	End