Kod: Markera allt
.include "c:\Program\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn261def.inc"
;***** Global register variables
.def wreg =R16 ;General use working register
.def timeout =R17 ;Timeout value passed to subroutine
.def lcdstat =R18 ;LCD busy/wait status
.def longtime=R19 ;Long timer for powerup
.def temp =R20
.def test =R21 ;test register
.def monades =R22
.def dekades =R23
;***** Other equates
.equ lcdrs =0 ;LCD rs pin connected to PA0
.equ lcde =1 ;LCD e pin connected to PA1
.equ line1 =0x80 ;1ç ãñáììç ôïõ LCD
.equ line2 =0xC0 ;2ç ãñáììç ôïõ LCD
.equ col1 =0b11101111 ;Êïëüíá 1
.equ col2 =0b11011111 ;Êïëüíá 1
.equ col3 =0b10111111 ;Êïëüíá 1
.equ col4 =0b01111111 ;Êïëüíá 1
; Main program entry point on reset
reset:
ldi temp,RAMEND
out SPL,temp ;Init Stack Pointer
rcall longdelay ;Delay some time
ldi temp,0b00000000 ;PB0,1,2,3,4,5,6,7 outputs
out DDRB,temp
ldi temp,0b00000000 ;PBA,1,2,3,4,5,6,7 outputs
out DDRA,temp
rcall lcdinit ;Initialize LCD module
;=========================================================================
; Initialize LCD module
;=========================================================================
lcdinit:
ldi wreg,0 ;Setup port pins
out PORTB,wreg ;Pull all pins low
ldi wreg,0xff ;All pins are outputs
out DDRB,wreg
ldi timeout,128 ;Wait at least 15 mS at power up
rcall delay
ldi wreg,3 ;Function set
out PORTB,wreg
sbi PORTA,lcde ;Toggle enable line
cbi PORTA,lcde
ldi timeout,65 ;Wait at least 4.1 mS
rcall delay
ldi wreg,3 ;Function set
out PORTB,wreg
sbi PORTA,lcde ;Toggle enable line
cbi PORTA,lcde
ldi timeout,2 ;Wait at least 100 uS
rcall delay
ldi wreg,3 ;Function set
out PORTB,wreg
sbi PORTA,lcde ;Toggle enable line
cbi PORTA,lcde
ldi wreg,2 ;Function set, 4 line interface
out PORTB,wreg
sbi PORTA,lcde ;Toggle enable line
cbi PORTA,lcde
ldi wreg,0b11110000 ;Make 4 data lines inputs
out DDRB,wreg
; At this point, the normal 4 wire command routine can be used
ldi wreg,0b00100000 ;Function set, 4 wire, 2 line, 5x7 font
rcall lcdcmd
ldi wreg,0b00001100 ;Display on, cursor off, blink off
rcall lcdcmd
ldi wreg,0b00000110 ;Address increment, no scrolling
rcall lcdcmd
ret
lcdcmd:
mov test,wreg
rcall lcdwait
ldi wreg,0xFF
out DDRB,wreg
mov wreg,test
mov test,wreg
swap wreg
andi wreg,0X0F
out PORTB,wreg
sbi PORTA,lcde ;Toggle enable line
cbi PORTA,lcde
mov wreg,test
andi wreg,0x0F ;Strip off upper bits
out PORTB,wreg ;Put on port
sbi PORTA,lcde ;Toggle enable line
cbi PORTA,lcde
ldi wreg,0xF0 ;Make 8 data lines inputs
out DDRB,wreg
ret
lcdwait:
ldi wreg,0xFF ;Make 8 data lines inputs
out DDRB,wreg
cbi PORTA,lcdrs ;Set register select to command
delay:
ldi test,64
cagain: dec test
brne cagain
dec timeout
brne delay
ret
longdelay:
ldi longtime,180 ;
ldi timeout,128 ;
nån som finner nåt opassande...