.include "m16def.inc"
.equ RS = PB4
.equ E = PB3
.equ DB4 = PB2
.equ DB5 = PB1
.equ DB6 = PB0
.equ DB7 = PA0
;tutaj beda procedury niezbedne do obslugi LCD
;================================
LCDInit:
push R18
push R16
cbi PORTB,RS
cbi PORTB,E
call SendDrei
call DlugaPauza ;opoznienie okolo 5ms
call SendDrei
call KrotkaPauza
call SendDrei
call KrotkaPauza
call SendZwei
call KrotkaPauza
ldi R16,0x28
call Send2nibbles
call KrotkaPauza
ldi R16,0x06
call Send2nibbles
call KrotkaPauza
ldi R16,0x0C
call Send2nibbles
call KrotkaPauza
ldi R16,0x03
call Send2nibbles
call KrotkaPauza
sbi PORTB,RS
pop R16
pop R18
ret
;================================
;================================
LCDclear:
push R16
push R18
cbi PORTB,RS
ldi R16,0x01
call Send2nibbles
call DlugaPauza
sbi PORTB,RS
pop R18
pop R16
ret
;================================
;================================
LCDhome:
push R16
push R18
cbi PORTB,RS
ldi R16,0x02
call Send2nibbles
call DlugaPauza
sbi PORTB,RS
pop R18
pop R16
ret
;================================
;================================
LCDnextLine:
push R16
push R18
cbi PORTB,RS
ldi R16,0xC0
call Send2nibbles
call KrotkaPauza
sbi PORTB,RS
pop R18
pop R16
ret
;================================
;================================
LCDznak:
push R18
sbi PORTB,RS
call Send2nibbles
call KrotkaPauza
cbi PORTB,RS
pop R18
ret
;================================
;================================
LCDshiftLeft:
push R16
push R18
cbi PORTB,RS
ldi R16,0x18
call Send2nibbles
call KrotkaPauza
sbi PORTB,RS
pop R18
pop R16
ret
;================================
;================================
LCDshiftRight:
push R16
push R18
cbi PORTB,RS
ldi R16,0x1C
call Send2nibbles
call KrotkaPauza ;opoznienie okolo 250us
sbi PORTB,RS ;(nie pamietam dokladnie)
pop R18 ;mozesz sobie obliczyc
pop R16 ;kwarc mam 16 MHz
ret
;================================
;================================
Send2nibbles:
push R17
push R19
ldi R17,0x00
cbi PORTB,E
cbi PORTB,DB4
cbi PORTB,DB5
cbi PORTB,DB6
cbi PORTA,DB7
bst R16,7
bld R17,0
ldi R19,0x00
in R19,PORTA
or R17,R19
out PORTA,R17
ldi R17,0x00
bst R16,6
bld R17,0
bst R16,5
bld R17,1
bst R16,4
bld R17,2
ldi R19,0x00
in R19,PORTB
or R17,R19
out PORTB,R17
sbi PORTB,E
ldi R18,0x03
call Pauza
cbi PORTB,E
cbi PORTB,DB4
cbi PORTB,DB5
cbi PORTB,DB6
cbi PORTA,DB7
bst R16,3
bld R17,0
ldi R19,0x00
in R19,PORTA
or R17,R19
out PORTA,R17
ldi R17,0x00
bst R16,2
bld R17,0
bst R16,1
bld R17,1
bst R16,0
bld R17,2
ldi R19,0x00
in R19,PORTB
or R17,R19
out PORTB,R17
sbi PORTB,E
ldi R18,0x03
call Pauza
cbi PORTB,E
pop R19
pop R17
ret
;================================
;================================
SendDrei:
push R18
cbi PORTB,DB6
cbi PORTA,DB7
sbi PORTB,DB4
sbi PORTB,DB5
sbi PORTB,E
ldi R18,0x03
call Pauza
cbi PORTB,E
pop R18
ret
;================================
;================================
SendZwei:
push R18
cbi PORTB,DB6
cbi PORTA,DB7
cbi PORTB,DB4
sbi PORTB,DB5
sbi PORTB,E
ldi R18,0x03
call Pauza ;opoznienie jakies 200us
cbi PORTB,E
pop R18
ret
;================================
;================================
DlugaPauza:
push R19
push R20
ldi R20,0x6E
Etap2:
ldi R19,0xFF
Etap1:
dec R19
brne Etap1
dec R20
brne Etap2
pop R20
pop R19
ret
;=================================
;=================================
KrotkaPauza:
push R18
ldi R18,0xFF
call Pauza
ldi R18,0xFF
call Pauza
pop R18
ret
;=================================
;=================================
Pauza:
nop
nop
nop
dec R18
brne Pauza
ret
;=================================