Cleanup, reorganization
This commit is contained in:
@@ -0,0 +1,351 @@
|
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu):
|
||||
; +------u------+
|
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V
|
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R)
|
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write)
|
||||
; --+ PA1 PB5 +-- E (clock, active falling edge)
|
||||
; --+ PA0 PB4 +--
|
||||
; --+ PD2 PB3 +-- DATA 7
|
||||
; --+ PD3 PB2 +-- DATA 6
|
||||
; --+ PD4 PB1 +-- DATA 5
|
||||
; --+ PD5 PB0 +-- DATA 4
|
||||
; GND --+ GND PD6 +--
|
||||
; +-------------+
|
||||
|
||||
;DMC-50399:
|
||||
; 1 - GND
|
||||
; 2 - +5V
|
||||
; 3 - 0V (lcd driver)
|
||||
; 4 - RS
|
||||
; 5 - R/W
|
||||
; 6 - E
|
||||
; 7 - DATA 0
|
||||
; 8 - DATA 1
|
||||
;...
|
||||
;14 - DATA 7
|
||||
|
||||
.device attiny2313
|
||||
;běží na 4MHz, ckdiv8=1 (vypnuto)
|
||||
;250x16=1ms=1000us
|
||||
|
||||
;LFUSE: 0xE2 -U lfuse:w:0xE2:m
|
||||
;HFUSE: 0xDF -U hfuse:w:0xDF:m
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O R T U A P I N U
|
||||
.equ LCDPORT = PORTB
|
||||
.equ LCDPIN = PINB
|
||||
.equ LCDDDR = DDRB
|
||||
|
||||
.equ RS = 7
|
||||
.equ RW = 6
|
||||
.equ E = 5
|
||||
|
||||
.equ LCD_CLEAR = 0b00000001
|
||||
.equ LCD_HOME = 0b00000010
|
||||
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110
|
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111
|
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100
|
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101
|
||||
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000
|
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100
|
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110
|
||||
.equ LCD_DISPLAY_ALTER = 0b00001101
|
||||
.equ LCD_DISPLAY_CURSOR_ALTER = 0b00001111
|
||||
|
||||
.equ LCD_CURSOR_LEFT = 0b00010000
|
||||
.equ LCD_CURSOR_RIGHT = 0b00010100
|
||||
.equ LCD_SHIFT_LEFT = 0b00011000
|
||||
.equ LCD_SHIFT_RIGHT = 0b00011100
|
||||
|
||||
|
||||
;5x7 font, 1-line
|
||||
.equ LCD_MODE_4BIT_1LINE = 0b00100000
|
||||
;.equ LCD_MODE_8BIT_1LINE = 0b00110000
|
||||
;5x7 font, 2-line
|
||||
.equ LCD_MODE_4BIT_2LINE = 0b00101000
|
||||
;.equ LCD_MODE_8BIT_2LINE = 0b00111000
|
||||
|
||||
.equ ROW1_ADDR = 0x00
|
||||
.equ ROW2_ADDR = 0x40
|
||||
.equ ROW3_ADDR = 0x14
|
||||
.equ ROW4_ADDR = 0x54
|
||||
|
||||
|
||||
|
||||
;aliases
|
||||
.def ZH = r31
|
||||
.def ZL = r30
|
||||
.def YH = r29
|
||||
.def YL = r28
|
||||
.def XH = r27
|
||||
.def XL = r26
|
||||
|
||||
; Z A C A T E K P R O G R A M U
|
||||
;vektory preruseni
|
||||
.org 0x0000 ;RESET
|
||||
rjmp RESET ;skok na start po resetu
|
||||
|
||||
.org 0x0013
|
||||
|
||||
;nastaveni po resetu
|
||||
.DB "HD44780 INTERFACE" ;(nazev programu)
|
||||
RESET:
|
||||
ldi r16,low(RAMEND) ;nastavi stack pointer
|
||||
out SPL,r16
|
||||
cli ;zakazat vsechna preruseni
|
||||
|
||||
; Nastaveni portu
|
||||
;PORTB = LCDPORT
|
||||
ldi r16,0b11111111 ;smer portu B
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00000000 ;vypnout B
|
||||
out LCDPORT,r16
|
||||
|
||||
sei ;Global Interrupt Enable
|
||||
|
||||
; == display init ==
|
||||
rcall LCD_INIT
|
||||
|
||||
ldi r17,LCD_MODE_INC_NOSHIFT
|
||||
rcall TX_INSTR
|
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR
|
||||
rcall TX_INSTR
|
||||
|
||||
; == load user-defined characters to CGRAM == (default, array label named MYCHARS, end-mark=0xFE)
|
||||
ldi r17,0
|
||||
rcall CGRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYCHARS*2)
|
||||
ldi ZL,low(MYCHARS*2)
|
||||
CGRAM_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq CGRAM_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp CGRAM_loop
|
||||
CGRAM_loop_end:
|
||||
|
||||
|
||||
; == pgm body ==
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW1_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT1*2)
|
||||
ldi ZL,low(MYTEXT1*2)
|
||||
DDRAM_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM_loop
|
||||
DDRAM_loop_end:
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW2_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT2*2)
|
||||
ldi ZL,low(MYTEXT2*2)
|
||||
DDRAM2_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM2_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM2_loop
|
||||
DDRAM2_loop_end:
|
||||
|
||||
;direct write to X,Y - example
|
||||
ldi r16,3 ;Y, zacina 0 a roste smerem dolu
|
||||
ldi r17,5 ;X, zacina nulou a roste smerem doprava
|
||||
rcall LCD_CURSOR_XY
|
||||
ldi r17,"%"
|
||||
rcall TX_DATA
|
||||
ldi r17,"%"
|
||||
rcall TX_DATA
|
||||
ldi r17,"%"
|
||||
rcall TX_DATA
|
||||
;infinite loop
|
||||
loop: rjmp loop
|
||||
|
||||
|
||||
MYTEXT1:
|
||||
.DB 0,0,0," POKUSNY TEXT ",0,0,0,0xFE
|
||||
MYTEXT2:
|
||||
.DB "Opravdu pekny text!",0xFE
|
||||
|
||||
|
||||
|
||||
; == USER-DEFINED CHARS ==
|
||||
MYCHARS:
|
||||
; 5x8, first 3 bits are not used
|
||||
;end of mychars
|
||||
.DB 0xe,0x1f,0x15,0x1f,0x1f,0x1f,0x15 ;smajlik
|
||||
|
||||
;konec
|
||||
.DB 0xFE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;r16=Y
|
||||
;r17=X
|
||||
LCD_CURSOR_XY:
|
||||
cpi r16,0
|
||||
brne test1
|
||||
fail: ldi r16,ROW1_ADDR
|
||||
rjmp addrdone
|
||||
test1:
|
||||
cpi r16,1
|
||||
brne test2
|
||||
ldi r16,ROW2_ADDR
|
||||
rjmp addrdone
|
||||
test2:
|
||||
cpi r16,2
|
||||
brne test3
|
||||
ldi r16,ROW3_ADDR
|
||||
rjmp addrdone
|
||||
test3:
|
||||
cpi r16,3
|
||||
brne fail
|
||||
ldi r16,ROW4_ADDR
|
||||
addrdone:
|
||||
add r17,r16
|
||||
rcall DDRAM_SET_ADDR
|
||||
ret
|
||||
|
||||
;r16=počet ms (cca)
|
||||
delay:
|
||||
push r17 ;2
|
||||
push r18 ;2
|
||||
d1:
|
||||
ldi r17,250 ;1
|
||||
d2:
|
||||
ldi r18,14 ;1
|
||||
d3:
|
||||
dec r18 ;1
|
||||
nop
|
||||
brne d3 ;2 (1
|
||||
dec r17 ; +1)
|
||||
brne d2 ;2 (1
|
||||
dec r16 ; +1)
|
||||
brne d1 ;2 (1)
|
||||
|
||||
pop r18 ;2
|
||||
pop r17 ;2
|
||||
ret
|
||||
|
||||
|
||||
LCD_INIT:
|
||||
ldi r16,16
|
||||
rcall delay
|
||||
ldi r16,0b00000010 ;4bit
|
||||
out PORTB,r16
|
||||
rcall LCD_CLK
|
||||
ldi r16,5
|
||||
rcall delay
|
||||
ldi r17,LCD_MODE_4BIT_2LINE ;set 4-bit mode
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_INSTR:
|
||||
swap r17 ;send high nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
swap r17 ;send low nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_DATA:
|
||||
swap r17 ;send high nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,(1<<RS)
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
swap r17 ;send low nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,(1<<RS)
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
ret
|
||||
|
||||
;r17 disabled to reduce code size
|
||||
;RX_DATA:
|
||||
; ;input
|
||||
; ldi r16,0b11110000 ;LCDPORT dirrection (RS RW E n.c.) output, (D7 D6 D5 D4) input
|
||||
; out LCDDDR,r16
|
||||
; ldi r16,0b00001111 ;pullups to data pins enabled
|
||||
; out LCDPORT,r16
|
||||
;
|
||||
; clr r17
|
||||
; ldi r16,(1<<RW)|(1<<RS)
|
||||
; out LCDPORT,r16 ;set LCD to read mode, for data
|
||||
;
|
||||
; rcall LCD_CLK ;receive high nibble
|
||||
; in r16,LCDPIN
|
||||
; andi r16,0b00001111
|
||||
; or r17,r16
|
||||
; swap r17 ;store high nibble
|
||||
;
|
||||
; rcall LCD_CLK ;receive low nibble
|
||||
; in r16,LCDPIN
|
||||
; andi r16,0b00001111
|
||||
; or r17,r16 ;store low nibble
|
||||
;
|
||||
; ;output
|
||||
; ldi r16,0b11111111 ;LCDPORT as output (RS RW E n.c. D7 D6 D5 D4)
|
||||
; out LCDDDR,r16
|
||||
; ldi r16,0b00000000 ;LCDPORT off
|
||||
; out LCDPORT,r16
|
||||
;
|
||||
; ;r17=received value (D7 D6 D5 D4 D3 D2 D1 D0)
|
||||
; ret
|
||||
|
||||
LCD_CLK:
|
||||
sbi LCDPORT,E ;EXECUTE on
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
cbi LCDPORT,E ;EXECUTE off
|
||||
ldi r16,150 ;pause: 100 for 4MHZ
|
||||
clkw:
|
||||
dec r16
|
||||
brne clkw
|
||||
ret
|
||||
|
||||
;r17
|
||||
;7 bitu (1.radek zacina 00,druhej 40)
|
||||
DDRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b10000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora)
|
||||
CGRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b01000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
@@ -0,0 +1,215 @@
|
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu):
|
||||
; +------u------+
|
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V
|
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R)
|
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write)
|
||||
; --+ PA1 PB5 +-- E (strobe)
|
||||
; --+ PA0 PB4 +--
|
||||
; --+ PD2 PB3 +-- DATA 7
|
||||
; --+ PD3 PB2 +-- DATA 6
|
||||
; --+ PD4 PB1 +-- DATA 5
|
||||
; --+ PD5 PB0 +-- DATA 4
|
||||
; GND --+ GND PD6 +--
|
||||
; +-------------+
|
||||
|
||||
;DMC-50399:
|
||||
; 1 - GND
|
||||
; 2 - +5V
|
||||
; 3 - 0V (lcd driver)
|
||||
; 4 - RS
|
||||
; 5 - R/W
|
||||
; 6 - E
|
||||
; 7 - DATA 0
|
||||
; 8 - DATA 1
|
||||
;...
|
||||
;14 - DATA 7
|
||||
|
||||
.device attiny2313
|
||||
;běží na 4MHz, ckdiv8=1 (vypnuto)
|
||||
;250x16=1ms=1000us
|
||||
|
||||
;LFUSE: 0xE2
|
||||
;HFUSE: 0xDF
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U
|
||||
;PORTB
|
||||
.equ LCDPORT = PORTB
|
||||
.equ LCDPIN = PINB
|
||||
.equ LCDDDR = DDRB
|
||||
|
||||
.equ RS = 7
|
||||
.equ RW = 6
|
||||
.equ E = 5
|
||||
|
||||
.equ LCD_CLEAR = 0b00000001
|
||||
.equ LCD_HOME = 0b00000010
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110
|
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111
|
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100
|
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000
|
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100
|
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110
|
||||
.equ LCD_DISPLAY_BLINK = 0b00001101
|
||||
.equ LCD_DISPLAY_ALTER = 0b00001111
|
||||
;4bit,5x7,2line
|
||||
.equ LCD_MODE_4BIT = 0b00101000
|
||||
.equ LCD_MODE_8BIT = 0b00111000
|
||||
|
||||
.equ ROW1_ADDR = 0x00
|
||||
.equ ROW2_ADDR = 0x40
|
||||
|
||||
|
||||
|
||||
;aliasy pointerů
|
||||
.def ZH = r31
|
||||
.def ZL = r30
|
||||
.def YH = r29
|
||||
.def YL = r28
|
||||
.def XH = r27
|
||||
.def XL = r26
|
||||
|
||||
; Z A C A T E K P R O G R A M U
|
||||
;vektory preruseni
|
||||
.org 0x0000 ;RESET
|
||||
rjmp RESET ;skok na start po resetu
|
||||
|
||||
.org 0x0013
|
||||
|
||||
;nastaveni po resetu
|
||||
.DB "DMC-50399 TEST" ;(nazev programu)
|
||||
RESET:
|
||||
ldi r16,low(RAMEND) ;nastavi stack pointer
|
||||
out SPL,r16
|
||||
cli ;zakazat vsechna preruseni
|
||||
|
||||
; Nastaveni portu
|
||||
;PORTB = LCDPORT
|
||||
ldi r16,0b11111111 ;smer portu B
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00000000 ;vypnout B
|
||||
out LCDPORT,r16
|
||||
|
||||
sei ;Global Interrupt Enable
|
||||
|
||||
rcall LCD_INIT
|
||||
|
||||
ldi r17,LCD_MODE_INC_SHIFT
|
||||
rcall TX_INSTR
|
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR
|
||||
rcall TX_INSTR
|
||||
|
||||
ldi r17,20
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
colastart:
|
||||
ldi ZH,high(ROW1*2)
|
||||
ldi ZL,low(ROW1*2)
|
||||
read1: lpm r17,Z+
|
||||
cpi r17,0
|
||||
breq colastart
|
||||
rcall TX_DATA
|
||||
ldi r16,60
|
||||
rcall delay
|
||||
rjmp read1
|
||||
|
||||
loop: rjmp loop
|
||||
|
||||
;r16=počet ms (cca)
|
||||
delay:
|
||||
push r17 ;2
|
||||
push r18 ;2
|
||||
d1:
|
||||
ldi r17,250 ;1
|
||||
d2:
|
||||
ldi r18,14 ;1
|
||||
d3:
|
||||
dec r18 ;1
|
||||
nop
|
||||
brne d3 ;2 (1
|
||||
dec r17 ; +1)
|
||||
brne d2 ;2 (1
|
||||
dec r16 ; +1)
|
||||
brne d1 ;2 (1)
|
||||
|
||||
pop r18 ;2
|
||||
pop r17 ;2
|
||||
ret
|
||||
|
||||
|
||||
LCD_INIT:
|
||||
ldi r16,16
|
||||
rcall delay
|
||||
ldi r16,0b00000010 ;4bit
|
||||
out PORTB,r16
|
||||
rcall LCD_CLK
|
||||
ldi r16,5
|
||||
rcall delay
|
||||
ldi r17,LCD_MODE_4BIT
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_INSTR:
|
||||
swap r17
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
swap r17
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_DATA:
|
||||
swap r17
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,0b10000000
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
swap r17
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,0b10000000
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
ret
|
||||
|
||||
LCD_CLK:
|
||||
sbi LCDPORT,E
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
cbi LCDPORT,E
|
||||
ldi r16,100 ;100 funguje na 4MHZ
|
||||
clkw1:
|
||||
dec r16
|
||||
brne clkw1
|
||||
; ldi r16,1
|
||||
; rcall delay
|
||||
ret
|
||||
|
||||
;7 bitu (1.radek zacina 00,druhej 40)
|
||||
DDRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b10000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora)
|
||||
CGRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b01000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
ROW1:
|
||||
.DB "*** Ice cold CocaCola sold here! *** ",0
|
||||
@@ -0,0 +1,305 @@
|
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu):
|
||||
; +------u------+
|
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V
|
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R)
|
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write)
|
||||
; --+ PA1 PB5 +-- E (clock, active falling edge)
|
||||
; --+ PA0 PB4 +--
|
||||
; --+ PD2 PB3 +-- DATA 7
|
||||
; --+ PD3 PB2 +-- DATA 6
|
||||
; --+ PD4 PB1 +-- DATA 5
|
||||
; --+ PD5 PB0 +-- DATA 4
|
||||
; GND --+ GND PD6 +--
|
||||
; +-------------+
|
||||
|
||||
;DMC-50399:
|
||||
; 1 - GND
|
||||
; 2 - +5V
|
||||
; 3 - 0V (lcd driver)
|
||||
; 4 - RS
|
||||
; 5 - R/W
|
||||
; 6 - E
|
||||
; 7 - DATA 0
|
||||
; 8 - DATA 1
|
||||
;...
|
||||
;14 - DATA 7
|
||||
|
||||
.device attiny2313
|
||||
;běží na 4MHz, ckdiv8=1 (vypnuto)
|
||||
;250x16=1ms=1000us
|
||||
|
||||
;LFUSE: 0xE2
|
||||
;HFUSE: 0xDF
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O R T U A P I N U
|
||||
.equ LCDPORT = PORTB
|
||||
.equ LCDPIN = PINB
|
||||
.equ LCDDDR = DDRB
|
||||
|
||||
.equ RS = 7
|
||||
.equ RW = 6
|
||||
.equ E = 5
|
||||
|
||||
.equ LCD_CLEAR = 0b00000001
|
||||
.equ LCD_HOME = 0b00000010
|
||||
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110
|
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111
|
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100
|
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101
|
||||
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000
|
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100
|
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110
|
||||
.equ LCD_DISPLAY_ALTER = 0b00001101
|
||||
.equ LCD_DISPLAY_CURSOR_ALTER = 0b00001111
|
||||
|
||||
.equ LCD_CURSOR_LEFT = 0b00010000
|
||||
.equ LCD_CURSOR_RIGHT = 0b00010100
|
||||
.equ LCD_SHIFT_LEFT = 0b00011000
|
||||
.equ LCD_SHIFT_RIGHT = 0b00011100
|
||||
|
||||
|
||||
;5x7 font, 1-line
|
||||
.equ LCD_MODE_4BIT_1LINE = 0b00100000
|
||||
;.equ LCD_MODE_8BIT_1LINE = 0b00110000
|
||||
;5x7 font, 2-line
|
||||
.equ LCD_MODE_4BIT_2LINE = 0b00101000
|
||||
;.equ LCD_MODE_8BIT_2LINE = 0b00111000
|
||||
|
||||
.equ ROW1_ADDR = 0x00
|
||||
.equ ROW2_ADDR = 0x40
|
||||
|
||||
|
||||
|
||||
;aliases
|
||||
.def ZH = r31
|
||||
.def ZL = r30
|
||||
.def YH = r29
|
||||
.def YL = r28
|
||||
.def XH = r27
|
||||
.def XL = r26
|
||||
|
||||
; Z A C A T E K P R O G R A M U
|
||||
;vektory preruseni
|
||||
.org 0x0000 ;RESET
|
||||
rjmp RESET ;skok na start po resetu
|
||||
|
||||
.org 0x0013
|
||||
|
||||
;nastaveni po resetu
|
||||
.DB "HD44780 INTERFACE" ;(nazev programu)
|
||||
RESET:
|
||||
ldi r16,low(RAMEND) ;nastavi stack pointer
|
||||
out SPL,r16
|
||||
cli ;zakazat vsechna preruseni
|
||||
|
||||
; Nastaveni portu
|
||||
;PORTB = LCDPORT
|
||||
ldi r16,0b11111111 ;smer portu B
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00000000 ;vypnout B
|
||||
out LCDPORT,r16
|
||||
|
||||
sei ;Global Interrupt Enable
|
||||
|
||||
rcall LCD_INIT
|
||||
|
||||
ldi r17,LCD_MODE_INC_NOSHIFT
|
||||
rcall TX_INSTR
|
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR
|
||||
rcall TX_INSTR
|
||||
|
||||
;load user-defined characters to CGRAM
|
||||
ldi r17,0
|
||||
rcall CGRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYCHARS*2)
|
||||
ldi ZL,low(MYCHARS*2)
|
||||
CGRAM_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq CGRAM_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp CGRAM_loop
|
||||
CGRAM_loop_end:
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW1_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT1*2)
|
||||
ldi ZL,low(MYTEXT1*2)
|
||||
DDRAM_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM_loop
|
||||
DDRAM_loop_end:
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW2_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT2*2)
|
||||
ldi ZL,low(MYTEXT2*2)
|
||||
DDRAM_loop2:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM_loop2_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM_loop2
|
||||
DDRAM_loop2_end:
|
||||
|
||||
loop: rjmp loop
|
||||
|
||||
MYTEXT1:
|
||||
.DB 0,3," This is GEOCACHE",0xFE
|
||||
MYTEXT2:
|
||||
.DB 1,2," ", 4, " geocaching.com",0xFE
|
||||
|
||||
MYCHARS:
|
||||
; 5x8, first 3 bits are not used
|
||||
;end of mychars
|
||||
.DB 0x0,0x15,0xe,0x6,0xe,0x1b,0x18
|
||||
.DB 0x18,0x1c,0xa,0x7,0x3,0x0,0x0
|
||||
.DB 0x8,0xc,0xe,0xc,0x8,0x8,0x8 ;0x8,0xe,0xf,0x4,0x4,0x2,0x0
|
||||
.DB 0x0,0x0,0x18,0x1c,0xa,0x7,0x3
|
||||
.DB 0x0,0x4,0x2,0x1f,0x2,0x4,0x0
|
||||
.DB 0xFE
|
||||
|
||||
|
||||
|
||||
|
||||
;r16=počet ms (cca)
|
||||
delay:
|
||||
push r17 ;2
|
||||
push r18 ;2
|
||||
d1:
|
||||
ldi r17,250 ;1
|
||||
d2:
|
||||
ldi r18,14 ;1
|
||||
d3:
|
||||
dec r18 ;1
|
||||
nop
|
||||
brne d3 ;2 (1
|
||||
dec r17 ; +1)
|
||||
brne d2 ;2 (1
|
||||
dec r16 ; +1)
|
||||
brne d1 ;2 (1)
|
||||
|
||||
pop r18 ;2
|
||||
pop r17 ;2
|
||||
ret
|
||||
|
||||
|
||||
LCD_INIT:
|
||||
ldi r16,16
|
||||
rcall delay
|
||||
ldi r16,0b00000010 ;4bit
|
||||
out PORTB,r16
|
||||
rcall LCD_CLK
|
||||
ldi r16,5
|
||||
rcall delay
|
||||
ldi r17,LCD_MODE_4BIT_2LINE ;set 4-bit mode
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_INSTR:
|
||||
swap r17 ;send high nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
swap r17 ;send low nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_DATA:
|
||||
swap r17 ;send high nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,(1<<RS)
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
swap r17 ;send low nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,(1<<RS)
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
ret
|
||||
|
||||
;r17
|
||||
RX_DATA:
|
||||
;input
|
||||
ldi r16,0b11110000 ;LCDPORT dirrection (RS RW E n.c.) output, (D7 D6 D5 D4) input
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00001111 ;pullups to data pins enabled
|
||||
out LCDPORT,r16
|
||||
|
||||
clr r17
|
||||
ldi r16,(1<<RW)|(1<<RS)
|
||||
out LCDPORT,r16 ;set LCD to read mode, for data
|
||||
|
||||
rcall LCD_CLK ;receive high nibble
|
||||
in r16,LCDPIN
|
||||
andi r16,0b00001111
|
||||
or r17,r16
|
||||
swap r17 ;store high nibble
|
||||
|
||||
rcall LCD_CLK ;receive low nibble
|
||||
in r16,LCDPIN
|
||||
andi r16,0b00001111
|
||||
or r17,r16 ;store low nibble
|
||||
|
||||
;output
|
||||
ldi r16,0b11111111 ;LCDPORT as output (RS RW E n.c. D7 D6 D5 D4)
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00000000 ;LCDPORT off
|
||||
out LCDPORT,r16
|
||||
|
||||
;r17=received value (D7 D6 D5 D4 D3 D2 D1 D0)
|
||||
ret
|
||||
|
||||
LCD_CLK:
|
||||
sbi LCDPORT,E ;EXECUTE on
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
cbi LCDPORT,E ;EXECUTE off
|
||||
ldi r16,100 ;pause: 100 for 4MHZ
|
||||
clkw:
|
||||
dec r16
|
||||
brne clkw
|
||||
ret
|
||||
|
||||
;r17
|
||||
;7 bitu (1.radek zacina 00,druhej 40)
|
||||
DDRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b10000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora)
|
||||
CGRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b01000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
@@ -0,0 +1,305 @@
|
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu):
|
||||
; +------u------+
|
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V
|
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R)
|
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write)
|
||||
; --+ PA1 PB5 +-- E (clock, active falling edge)
|
||||
; --+ PA0 PB4 +--
|
||||
; --+ PD2 PB3 +-- DATA 7
|
||||
; --+ PD3 PB2 +-- DATA 6
|
||||
; --+ PD4 PB1 +-- DATA 5
|
||||
; --+ PD5 PB0 +-- DATA 4
|
||||
; GND --+ GND PD6 +--
|
||||
; +-------------+
|
||||
|
||||
;DMC-50399:
|
||||
; 1 - GND
|
||||
; 2 - +5V
|
||||
; 3 - 0V (lcd driver)
|
||||
; 4 - RS
|
||||
; 5 - R/W
|
||||
; 6 - E
|
||||
; 7 - DATA 0
|
||||
; 8 - DATA 1
|
||||
;...
|
||||
;14 - DATA 7
|
||||
|
||||
.device attiny2313
|
||||
;běží na 4MHz, ckdiv8=1 (vypnuto)
|
||||
;250x16=1ms=1000us
|
||||
|
||||
;LFUSE: 0xE2
|
||||
;HFUSE: 0xDF
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O R T U A P I N U
|
||||
.equ LCDPORT = PORTB
|
||||
.equ LCDPIN = PINB
|
||||
.equ LCDDDR = DDRB
|
||||
|
||||
.equ RS = 7
|
||||
.equ RW = 6
|
||||
.equ E = 5
|
||||
|
||||
.equ LCD_CLEAR = 0b00000001
|
||||
.equ LCD_HOME = 0b00000010
|
||||
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110
|
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111
|
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100
|
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101
|
||||
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000
|
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100
|
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110
|
||||
.equ LCD_DISPLAY_ALTER = 0b00001101
|
||||
.equ LCD_DISPLAY_CURSOR_ALTER = 0b00001111
|
||||
|
||||
.equ LCD_CURSOR_LEFT = 0b00010000
|
||||
.equ LCD_CURSOR_RIGHT = 0b00010100
|
||||
.equ LCD_SHIFT_LEFT = 0b00011000
|
||||
.equ LCD_SHIFT_RIGHT = 0b00011100
|
||||
|
||||
|
||||
;5x7 font, 1-line
|
||||
.equ LCD_MODE_4BIT_1LINE = 0b00100000
|
||||
;.equ LCD_MODE_8BIT_1LINE = 0b00110000
|
||||
;5x7 font, 2-line
|
||||
.equ LCD_MODE_4BIT_2LINE = 0b00101000
|
||||
;.equ LCD_MODE_8BIT_2LINE = 0b00111000
|
||||
|
||||
.equ ROW1_ADDR = 0x00
|
||||
.equ ROW2_ADDR = 0x40
|
||||
|
||||
|
||||
|
||||
;aliases
|
||||
.def ZH = r31
|
||||
.def ZL = r30
|
||||
.def YH = r29
|
||||
.def YL = r28
|
||||
.def XH = r27
|
||||
.def XL = r26
|
||||
|
||||
; Z A C A T E K P R O G R A M U
|
||||
;vektory preruseni
|
||||
.org 0x0000 ;RESET
|
||||
rjmp RESET ;skok na start po resetu
|
||||
|
||||
.org 0x0013
|
||||
|
||||
;nastaveni po resetu
|
||||
.DB "HD44780 INTERFACE" ;(nazev programu)
|
||||
RESET:
|
||||
ldi r16,low(RAMEND) ;nastavi stack pointer
|
||||
out SPL,r16
|
||||
cli ;zakazat vsechna preruseni
|
||||
|
||||
; Nastaveni portu
|
||||
;PORTB = LCDPORT
|
||||
ldi r16,0b11111111 ;smer portu B
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00000000 ;vypnout B
|
||||
out LCDPORT,r16
|
||||
|
||||
sei ;Global Interrupt Enable
|
||||
|
||||
rcall LCD_INIT
|
||||
|
||||
ldi r17,LCD_MODE_INC_NOSHIFT
|
||||
rcall TX_INSTR
|
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR
|
||||
rcall TX_INSTR
|
||||
|
||||
;load user-defined characters to CGRAM
|
||||
ldi r17,0
|
||||
rcall CGRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYCHARS*2)
|
||||
ldi ZL,low(MYCHARS*2)
|
||||
CGRAM_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq CGRAM_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp CGRAM_loop
|
||||
CGRAM_loop_end:
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW1_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT1*2)
|
||||
ldi ZL,low(MYTEXT1*2)
|
||||
DDRAM_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM_loop
|
||||
DDRAM_loop_end:
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW2_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT2*2)
|
||||
ldi ZL,low(MYTEXT2*2)
|
||||
DDRAM_loop2:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM_loop2_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM_loop2
|
||||
DDRAM_loop2_end:
|
||||
|
||||
loop: rjmp loop
|
||||
|
||||
MYTEXT1:
|
||||
.DB 0,3," This is GEOCACHE",0xFE
|
||||
MYTEXT2:
|
||||
.DB 1,2, 4, "geocaching.com",0xFE
|
||||
|
||||
MYCHARS:
|
||||
; 5x8, first 3 bits are not used
|
||||
;end of mychars
|
||||
.DB 0x0,0x15,0xe,0x6,0xe,0x1b,0x18
|
||||
.DB 0x18,0x1c,0xa,0x7,0x3,0x0,0x0
|
||||
.DB 0x8,0xe,0xf,0x4,0x4,0x2,0x0
|
||||
.DB 0x0,0x0,0x18,0x1c,0xa,0x7,0x3
|
||||
.DB 0x0,0x4,0x2,0x1f,0x2,0x4,0x0
|
||||
.DB 0xFE
|
||||
|
||||
|
||||
|
||||
|
||||
;r16=počet ms (cca)
|
||||
delay:
|
||||
push r17 ;2
|
||||
push r18 ;2
|
||||
d1:
|
||||
ldi r17,250 ;1
|
||||
d2:
|
||||
ldi r18,14 ;1
|
||||
d3:
|
||||
dec r18 ;1
|
||||
nop
|
||||
brne d3 ;2 (1
|
||||
dec r17 ; +1)
|
||||
brne d2 ;2 (1
|
||||
dec r16 ; +1)
|
||||
brne d1 ;2 (1)
|
||||
|
||||
pop r18 ;2
|
||||
pop r17 ;2
|
||||
ret
|
||||
|
||||
|
||||
LCD_INIT:
|
||||
ldi r16,16
|
||||
rcall delay
|
||||
ldi r16,0b00000010 ;4bit
|
||||
out PORTB,r16
|
||||
rcall LCD_CLK
|
||||
ldi r16,5
|
||||
rcall delay
|
||||
ldi r17,LCD_MODE_4BIT_2LINE ;set 4-bit mode
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_INSTR:
|
||||
swap r17 ;send high nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
swap r17 ;send low nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_DATA:
|
||||
swap r17 ;send high nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,(1<<RS)
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
swap r17 ;send low nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,(1<<RS)
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
ret
|
||||
|
||||
;r17
|
||||
RX_DATA:
|
||||
;input
|
||||
ldi r16,0b11110000 ;LCDPORT dirrection (RS RW E n.c.) output, (D7 D6 D5 D4) input
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00001111 ;pullups to data pins enabled
|
||||
out LCDPORT,r16
|
||||
|
||||
clr r17
|
||||
ldi r16,(1<<RW)|(1<<RS)
|
||||
out LCDPORT,r16 ;set LCD to read mode, for data
|
||||
|
||||
rcall LCD_CLK ;receive high nibble
|
||||
in r16,LCDPIN
|
||||
andi r16,0b00001111
|
||||
or r17,r16
|
||||
swap r17 ;store high nibble
|
||||
|
||||
rcall LCD_CLK ;receive low nibble
|
||||
in r16,LCDPIN
|
||||
andi r16,0b00001111
|
||||
or r17,r16 ;store low nibble
|
||||
|
||||
;output
|
||||
ldi r16,0b11111111 ;LCDPORT as output (RS RW E n.c. D7 D6 D5 D4)
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00000000 ;LCDPORT off
|
||||
out LCDPORT,r16
|
||||
|
||||
;r17=received value (D7 D6 D5 D4 D3 D2 D1 D0)
|
||||
ret
|
||||
|
||||
LCD_CLK:
|
||||
sbi LCDPORT,E ;EXECUTE on
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
cbi LCDPORT,E ;EXECUTE off
|
||||
ldi r16,100 ;pause: 100 for 4MHZ
|
||||
clkw:
|
||||
dec r16
|
||||
brne clkw
|
||||
ret
|
||||
|
||||
;r17
|
||||
;7 bitu (1.radek zacina 00,druhej 40)
|
||||
DDRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b10000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora)
|
||||
CGRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b01000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
@@ -0,0 +1,311 @@
|
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu):
|
||||
; +------u------+
|
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V
|
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R)
|
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write)
|
||||
; --+ PA1 PB5 +-- E (clock, active falling edge)
|
||||
; --+ PA0 PB4 +--
|
||||
; --+ PD2 PB3 +-- DATA 7
|
||||
; --+ PD3 PB2 +-- DATA 6
|
||||
; --+ PD4 PB1 +-- DATA 5
|
||||
; --+ PD5 PB0 +-- DATA 4
|
||||
; GND --+ GND PD6 +--
|
||||
; +-------------+
|
||||
|
||||
;DMC-50399:
|
||||
; 1 - GND
|
||||
; 2 - +5V
|
||||
; 3 - 0V (lcd driver)
|
||||
; 4 - RS
|
||||
; 5 - R/W
|
||||
; 6 - E
|
||||
; 7 - DATA 0
|
||||
; 8 - DATA 1
|
||||
;...
|
||||
;14 - DATA 7
|
||||
|
||||
.device attiny2313
|
||||
;běží na 4MHz, ckdiv8=1 (vypnuto)
|
||||
;250x16=1ms=1000us
|
||||
|
||||
;LFUSE: 0xE2
|
||||
;HFUSE: 0xDF
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O R T U A P I N U
|
||||
.equ LCDPORT = PORTB
|
||||
.equ LCDPIN = PINB
|
||||
.equ LCDDDR = DDRB
|
||||
|
||||
.equ RS = 7
|
||||
.equ RW = 6
|
||||
.equ E = 5
|
||||
|
||||
.equ LCD_CLEAR = 0b00000001
|
||||
.equ LCD_HOME = 0b00000010
|
||||
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110
|
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111
|
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100
|
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101
|
||||
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000
|
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100
|
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110
|
||||
.equ LCD_DISPLAY_ALTER = 0b00001101
|
||||
.equ LCD_DISPLAY_CURSOR_ALTER = 0b00001111
|
||||
|
||||
.equ LCD_CURSOR_LEFT = 0b00010000
|
||||
.equ LCD_CURSOR_RIGHT = 0b00010100
|
||||
.equ LCD_SHIFT_LEFT = 0b00011000
|
||||
.equ LCD_SHIFT_RIGHT = 0b00011100
|
||||
|
||||
|
||||
;5x7 font, 1-line
|
||||
.equ LCD_MODE_4BIT_1LINE = 0b00100000
|
||||
;.equ LCD_MODE_8BIT_1LINE = 0b00110000
|
||||
;5x7 font, 2-line
|
||||
.equ LCD_MODE_4BIT_2LINE = 0b00101000
|
||||
;.equ LCD_MODE_8BIT_2LINE = 0b00111000
|
||||
|
||||
.equ ROW1_ADDR = 0x00
|
||||
.equ ROW2_ADDR = 0x40
|
||||
|
||||
|
||||
|
||||
;aliases
|
||||
.def ZH = r31
|
||||
.def ZL = r30
|
||||
.def YH = r29
|
||||
.def YL = r28
|
||||
.def XH = r27
|
||||
.def XL = r26
|
||||
|
||||
; Z A C A T E K P R O G R A M U
|
||||
;vektory preruseni
|
||||
.org 0x0000 ;RESET
|
||||
rjmp RESET ;skok na start po resetu
|
||||
|
||||
.org 0x0013
|
||||
|
||||
;nastaveni po resetu
|
||||
.DB "HD44780 INTERFACE" ;(nazev programu)
|
||||
RESET:
|
||||
ldi r16,low(RAMEND) ;nastavi stack pointer
|
||||
out SPL,r16
|
||||
cli ;zakazat vsechna preruseni
|
||||
|
||||
; Nastaveni portu
|
||||
;PORTB = LCDPORT
|
||||
ldi r16,0b11111111 ;smer portu B
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00000000 ;vypnout B
|
||||
out LCDPORT,r16
|
||||
|
||||
sei ;Global Interrupt Enable
|
||||
|
||||
rcall LCD_INIT
|
||||
|
||||
ldi r17,LCD_MODE_INC_NOSHIFT
|
||||
rcall TX_INSTR
|
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR
|
||||
rcall TX_INSTR
|
||||
|
||||
;load user-defined characters to CGRAM
|
||||
ldi r17,0
|
||||
rcall CGRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYCHARS*2)
|
||||
ldi ZL,low(MYCHARS*2)
|
||||
CGRAM_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq CGRAM_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp CGRAM_loop
|
||||
CGRAM_loop_end:
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW1_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT1*2)
|
||||
ldi ZL,low(MYTEXT1*2)
|
||||
DDRAM_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM_loop
|
||||
DDRAM_loop_end:
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW2_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT2*2)
|
||||
ldi ZL,low(MYTEXT2*2)
|
||||
DDRAM_loop2:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM_loop2_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM_loop2
|
||||
DDRAM_loop2_end:
|
||||
|
||||
loop: rjmp loop
|
||||
|
||||
MYTEXT1:
|
||||
.DB " ",0,1,1,1,1,1,2,4,4,4,4,5,6,6,6,6,6,7," ",0xFE
|
||||
MYTEXT2:
|
||||
.DB "Straslivy krokodyl!",0xFE
|
||||
|
||||
MYCHARS:
|
||||
; 5x8, first 3 bits are not used
|
||||
;end of mychars
|
||||
.DB 0x0,0x3,0x0,0x0,0x0,0x1,0x3 ;konec huby 0
|
||||
.DB 0x0,0x1f,0xe,0x4,0x10,0x19,0x1f ;zuby1
|
||||
.DB 0x2,0x15,0x1f,0x1f,0x1f,0x1f,0x10 ;hlava 2
|
||||
.DB 0xe,0x1f,0x15,0x1f,0x1f,0x1f,0x15 ;smajlik 3
|
||||
.DB 0x0,0x1f,0x1f,0x1f,0x1f,0x1,0x3 ;noha4
|
||||
.DB 0x0,0x10,0x1c,0x1f,0x1f,0x0,0x0 ;do ocasu5
|
||||
.DB 0x0,0x4,0xe,0x1f,0x1f,0x0,0x0
|
||||
.DB 0x0,0x0,0x0,0x0,0x10,0x0,0x0 ;konec ocasu7
|
||||
|
||||
|
||||
|
||||
.DB 0xFE
|
||||
|
||||
|
||||
|
||||
|
||||
;r16=počet ms (cca)
|
||||
delay:
|
||||
push r17 ;2
|
||||
push r18 ;2
|
||||
d1:
|
||||
ldi r17,250 ;1
|
||||
d2:
|
||||
ldi r18,14 ;1
|
||||
d3:
|
||||
dec r18 ;1
|
||||
nop
|
||||
brne d3 ;2 (1
|
||||
dec r17 ; +1)
|
||||
brne d2 ;2 (1
|
||||
dec r16 ; +1)
|
||||
brne d1 ;2 (1)
|
||||
|
||||
pop r18 ;2
|
||||
pop r17 ;2
|
||||
ret
|
||||
|
||||
|
||||
LCD_INIT:
|
||||
ldi r16,16
|
||||
rcall delay
|
||||
ldi r16,0b00000010 ;4bit
|
||||
out PORTB,r16
|
||||
rcall LCD_CLK
|
||||
ldi r16,5
|
||||
rcall delay
|
||||
ldi r17,LCD_MODE_4BIT_2LINE ;set 4-bit mode
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_INSTR:
|
||||
swap r17 ;send high nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
swap r17 ;send low nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_DATA:
|
||||
swap r17 ;send high nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,(1<<RS)
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
swap r17 ;send low nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,(1<<RS)
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
ret
|
||||
|
||||
;r17
|
||||
RX_DATA:
|
||||
;input
|
||||
ldi r16,0b11110000 ;LCDPORT dirrection (RS RW E n.c.) output, (D7 D6 D5 D4) input
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00001111 ;pullups to data pins enabled
|
||||
out LCDPORT,r16
|
||||
|
||||
clr r17
|
||||
ldi r16,(1<<RW)|(1<<RS)
|
||||
out LCDPORT,r16 ;set LCD to read mode, for data
|
||||
|
||||
rcall LCD_CLK ;receive high nibble
|
||||
in r16,LCDPIN
|
||||
andi r16,0b00001111
|
||||
or r17,r16
|
||||
swap r17 ;store high nibble
|
||||
|
||||
rcall LCD_CLK ;receive low nibble
|
||||
in r16,LCDPIN
|
||||
andi r16,0b00001111
|
||||
or r17,r16 ;store low nibble
|
||||
|
||||
;output
|
||||
ldi r16,0b11111111 ;LCDPORT as output (RS RW E n.c. D7 D6 D5 D4)
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00000000 ;LCDPORT off
|
||||
out LCDPORT,r16
|
||||
|
||||
;r17=received value (D7 D6 D5 D4 D3 D2 D1 D0)
|
||||
ret
|
||||
|
||||
LCD_CLK:
|
||||
sbi LCDPORT,E ;EXECUTE on
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
cbi LCDPORT,E ;EXECUTE off
|
||||
ldi r16,100 ;pause: 100 for 4MHZ
|
||||
clkw:
|
||||
dec r16
|
||||
brne clkw
|
||||
ret
|
||||
|
||||
;r17
|
||||
;7 bitu (1.radek zacina 00,druhej 40)
|
||||
DDRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b10000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora)
|
||||
CGRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b01000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
@@ -0,0 +1,228 @@
|
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu):
|
||||
; +------u------+
|
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V
|
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R)
|
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write)
|
||||
; --+ PA1 PB5 +-- E (strobe)
|
||||
; --+ PA0 PB4 +--
|
||||
; --+ PD2 PB3 +-- DATA 7
|
||||
; --+ PD3 PB2 +-- DATA 6
|
||||
; --+ PD4 PB1 +-- DATA 5
|
||||
; --+ PD5 PB0 +-- DATA 4
|
||||
; GND --+ GND PD6 +--
|
||||
; +-------------+
|
||||
|
||||
;DMC-50399:
|
||||
; 1 - GND
|
||||
; 2 - +5V
|
||||
; 3 - 0V (lcd driver)
|
||||
; 4 - RS
|
||||
; 5 - R/W
|
||||
; 6 - E
|
||||
; 7 - DATA 0
|
||||
; 8 - DATA 1
|
||||
;...
|
||||
;14 - DATA 7
|
||||
|
||||
.device attiny2313
|
||||
;běží na 4MHz, ckdiv8=1 (vypnuto)
|
||||
;250x16=1ms=1000us
|
||||
|
||||
;LFUSE: 0xE2
|
||||
;HFUSE: 0xDF
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U
|
||||
;PORTB
|
||||
.equ LCDPORT = PORTB
|
||||
.equ LCDPIN = PINB
|
||||
.equ LCDDDR = DDRB
|
||||
|
||||
.equ RS = 7
|
||||
.equ RW = 6
|
||||
.equ E = 5
|
||||
|
||||
.equ LCD_CLEAR = 0b00000001
|
||||
.equ LCD_HOME = 0b00000010
|
||||
.equ LCD_MODE_INC_NOSH = 0b00000110
|
||||
.equ LCD_MODE_INC_SH = 0b00000111
|
||||
.equ LCD_MODE_DEC_NOSH = 0b00000100
|
||||
.equ LCD_MODE_DEC_SH = 0b00000101
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000
|
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100
|
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110
|
||||
.equ LCD_DISPLAY_BLINK = 0b00001101
|
||||
.equ LCD_DISPLAY_ALTER = 0b00001111
|
||||
;4bit,5x7,2line
|
||||
.equ LCD_MODE_4BIT = 0b00101000
|
||||
.equ LCD_MODE_8BIT = 0b00111000
|
||||
|
||||
.equ ROW1_ADDR = 0x00
|
||||
.equ ROW2_ADDR = 0x40
|
||||
|
||||
|
||||
|
||||
;aliasy pointerů
|
||||
.def ZH = r31
|
||||
.def ZL = r30
|
||||
.def YH = r29
|
||||
.def YL = r28
|
||||
.def XH = r27
|
||||
.def XL = r26
|
||||
|
||||
; Z A C A T E K P R O G R A M U
|
||||
;vektory preruseni
|
||||
.org 0x0000 ;RESET
|
||||
rjmp RESET ;skok na start po resetu
|
||||
|
||||
.org 0x0013
|
||||
|
||||
;nastaveni po resetu
|
||||
.DB "DMC-50399 TEST" ;(nazev programu)
|
||||
RESET:
|
||||
ldi r16,low(RAMEND) ;nastavi stack pointer
|
||||
out SPL,r16
|
||||
cli ;zakazat vsechna preruseni
|
||||
|
||||
; Nastaveni portu
|
||||
;PORTB = LCDPORT
|
||||
ldi r16,0b11111111 ;smer portu B
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00000000 ;vypnout B
|
||||
out LCDPORT,r16
|
||||
|
||||
sei ;Global Interrupt Enable
|
||||
|
||||
rcall LCD_INIT
|
||||
|
||||
ldi r17,LCD_DISPLAY_DISABLED
|
||||
rcall TX_INSTR
|
||||
|
||||
ldi r17,ROW1_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(ROW1*2)
|
||||
ldi ZL,low(ROW1*2)
|
||||
read1: lpm r17,Z+
|
||||
cpi r17,0
|
||||
breq text2
|
||||
rcall TX_DATA
|
||||
rjmp read1
|
||||
|
||||
text2:
|
||||
ldi r17,ROW2_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(ROW2*2)
|
||||
ldi ZL,low(ROW2*2)
|
||||
read2: lpm r17,Z+
|
||||
cpi r17,0
|
||||
breq loop
|
||||
rcall TX_DATA
|
||||
rjmp read2
|
||||
|
||||
ldi r17,LCD_DISPLAY_CURSOR
|
||||
rcall TX_INSTR
|
||||
|
||||
loop: rjmp loop
|
||||
|
||||
;r16=počet ms (cca)
|
||||
delay:
|
||||
push r17 ;2
|
||||
push r18 ;2
|
||||
d1:
|
||||
ldi r17,250 ;1
|
||||
d2:
|
||||
ldi r18,14 ;1
|
||||
d3:
|
||||
dec r18 ;1
|
||||
nop
|
||||
brne d3 ;2 (1
|
||||
dec r17 ; +1)
|
||||
brne d2 ;2 (1
|
||||
dec r16 ; +1)
|
||||
brne d1 ;2 (1)
|
||||
|
||||
pop r18 ;2
|
||||
pop r17 ;2
|
||||
ret
|
||||
|
||||
|
||||
LCD_INIT:
|
||||
ldi r16,16
|
||||
rcall delay
|
||||
ldi r16,0b00000010 ;4bit
|
||||
out PORTB,r16
|
||||
rcall LCD_CLK
|
||||
ldi r16,5
|
||||
rcall delay
|
||||
ldi r17,LCD_MODE_4BIT
|
||||
rcall TX_INSTR
|
||||
ldi r17,LCD_MODE_INC_NOSH
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_INSTR:
|
||||
swap r17
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
swap r17
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_DATA:
|
||||
swap r17
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,0b10000000
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
swap r17
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,0b10000000
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
ret
|
||||
|
||||
LCD_CLK:
|
||||
sbi LCDPORT,E
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
cbi LCDPORT,E
|
||||
ldi r16,100 ;100 funguje na 4MHZ
|
||||
clkw1:
|
||||
dec r16
|
||||
brne clkw1
|
||||
; ldi r16,1
|
||||
; rcall delay
|
||||
ret
|
||||
|
||||
;7 bitu (1.radek zacina 00,druhej 40)
|
||||
DDRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b10000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora)
|
||||
CGRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b01000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
ROW1:
|
||||
.DB "ATTINY2313 & HD44780",0
|
||||
ROW2:
|
||||
.DB "* www.ondrovo.com *",0
|
||||
@@ -0,0 +1,380 @@
|
||||
; Zapojeni (Připojen DMC-50399 v 4-bitovem modu):
|
||||
; +------u------+
|
||||
; Vcc -> reset --+ /RST Vcc +-- napajeni +5V
|
||||
; --+ PD0 PB7 +-- RS (0=instr W, BF+addr R; 1=data W/R)
|
||||
; --+ PD1 PB6 +-- R/W (1=read,0=write)
|
||||
; --+ PA1 PB5 +-- E (clock, active falling edge)
|
||||
; --+ PA0 PB4 +--
|
||||
; --+ PD2 PB3 +-- DATA 7
|
||||
; --+ PD3 PB2 +-- DATA 6
|
||||
; --+ PD4 PB1 +-- DATA 5
|
||||
; --+ PD5 PB0 +-- DATA 4
|
||||
; GND --+ GND PD6 +--
|
||||
; +-------------+
|
||||
|
||||
;DMC-50399:
|
||||
; 1 - GND
|
||||
; 2 - +5V
|
||||
; 3 - 0V (lcd driver)
|
||||
; 4 - RS
|
||||
; 5 - R/W
|
||||
; 6 - E
|
||||
; 7 - DATA 0
|
||||
; 8 - DATA 1
|
||||
;...
|
||||
;14 - DATA 7
|
||||
|
||||
.device attiny2313
|
||||
;běží na 4MHz, ckdiv8=1 (vypnuto)
|
||||
;250x16=1ms=1000us
|
||||
|
||||
;LFUSE: 0xE2
|
||||
;HFUSE: 0xDF
|
||||
|
||||
|
||||
;K O N S T A N T Y + P R E Z D I V K Y P O R T U A P I N U
|
||||
.equ LCDPORT = PORTB
|
||||
.equ LCDPIN = PINB
|
||||
.equ LCDDDR = DDRB
|
||||
|
||||
.equ RS = 7
|
||||
.equ RW = 6
|
||||
.equ E = 5
|
||||
|
||||
.equ LCD_CLEAR = 0b00000001
|
||||
.equ LCD_HOME = 0b00000010
|
||||
|
||||
.equ LCD_MODE_INC_NOSHIFT = 0b00000110
|
||||
.equ LCD_MODE_INC_SHIFT = 0b00000111
|
||||
.equ LCD_MODE_DEC_NOSHIFT = 0b00000100
|
||||
.equ LCD_MODE_DEC_SHIFT = 0b00000101
|
||||
|
||||
.equ LCD_DISPLAY_DISABLED = 0b00001000
|
||||
.equ LCD_DISPLAY_NOCURSOR = 0b00001100
|
||||
.equ LCD_DISPLAY_CURSOR = 0b00001110
|
||||
.equ LCD_DISPLAY_ALTER = 0b00001101
|
||||
.equ LCD_DISPLAY_CURSOR_ALTER = 0b00001111
|
||||
|
||||
.equ LCD_CURSOR_LEFT = 0b00010000
|
||||
.equ LCD_CURSOR_RIGHT = 0b00010100
|
||||
.equ LCD_SHIFT_LEFT = 0b00011000
|
||||
.equ LCD_SHIFT_RIGHT = 0b00011100
|
||||
|
||||
|
||||
;5x7 font, 1-line
|
||||
.equ LCD_MODE_4BIT_1LINE = 0b00100000
|
||||
;.equ LCD_MODE_8BIT_1LINE = 0b00110000
|
||||
;5x7 font, 2-line
|
||||
.equ LCD_MODE_4BIT_2LINE = 0b00101000
|
||||
;.equ LCD_MODE_8BIT_2LINE = 0b00111000
|
||||
|
||||
.equ ROW1_ADDR = 0x00
|
||||
.equ ROW2_ADDR = 0x40
|
||||
.equ ROW3_ADDR = 0x14
|
||||
.equ ROW4_ADDR = 0x54
|
||||
|
||||
|
||||
|
||||
;aliases
|
||||
.def ZH = r31
|
||||
.def ZL = r30
|
||||
.def YH = r29
|
||||
.def YL = r28
|
||||
.def XH = r27
|
||||
.def XL = r26
|
||||
|
||||
; Z A C A T E K P R O G R A M U
|
||||
;vektory preruseni
|
||||
.org 0x0000 ;RESET
|
||||
rjmp RESET ;skok na start po resetu
|
||||
|
||||
.org 0x0013
|
||||
|
||||
;nastaveni po resetu
|
||||
.DB "HD44780 INTERFACE" ;(nazev programu)
|
||||
RESET:
|
||||
ldi r16,low(RAMEND) ;nastavi stack pointer
|
||||
out SPL,r16
|
||||
cli ;zakazat vsechna preruseni
|
||||
|
||||
; Nastaveni portu
|
||||
;PORTB = LCDPORT
|
||||
ldi r16,0b11111111 ;smer portu B
|
||||
out LCDDDR,r16
|
||||
ldi r16,0b00000000 ;vypnout B
|
||||
out LCDPORT,r16
|
||||
|
||||
sei ;Global Interrupt Enable
|
||||
|
||||
rcall LCD_INIT
|
||||
|
||||
ldi r17,LCD_MODE_INC_NOSHIFT
|
||||
rcall TX_INSTR
|
||||
|
||||
ldi r17,LCD_DISPLAY_NOCURSOR
|
||||
rcall TX_INSTR
|
||||
|
||||
;load user-defined characters to CGRAM
|
||||
ldi r17,0
|
||||
rcall CGRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYCHARS*2)
|
||||
ldi ZL,low(MYCHARS*2)
|
||||
CGRAM_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq CGRAM_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp CGRAM_loop
|
||||
CGRAM_loop_end:
|
||||
|
||||
|
||||
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW1_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT1*2)
|
||||
ldi ZL,low(MYTEXT1*2)
|
||||
DDRAM_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM_loop
|
||||
DDRAM_loop_end:
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW2_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT2*2)
|
||||
ldi ZL,low(MYTEXT2*2)
|
||||
DDRAM2_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM2_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM2_loop
|
||||
DDRAM2_loop_end:
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW3_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT3*2)
|
||||
ldi ZL,low(MYTEXT3*2)
|
||||
DDRAM3_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM3_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM3_loop
|
||||
DDRAM3_loop_end:
|
||||
|
||||
;load text to DDRAM
|
||||
ldi r17,ROW4_ADDR
|
||||
rcall DDRAM_SET_ADDR
|
||||
|
||||
ldi ZH,high(MYTEXT4*2)
|
||||
ldi ZL,low(MYTEXT4*2)
|
||||
DDRAM4_loop:
|
||||
lpm r17,Z+
|
||||
cpi r17,0xFE
|
||||
breq DDRAM4_loop_end
|
||||
rcall TX_DATA
|
||||
rjmp DDRAM4_loop
|
||||
DDRAM4_loop_end:
|
||||
|
||||
ldi r16,2 ;Y (0,1,2,3)
|
||||
ldi r17,7 ;X (0,1,2,...19,20,....)
|
||||
rcall LCD_CURSOR_XY
|
||||
ldi r17,255
|
||||
rcall TX_DATA
|
||||
|
||||
loop: rjmp loop
|
||||
|
||||
MYTEXT1:
|
||||
.DB 0,"PRVNI RADEK=======*",0xFE
|
||||
MYTEXT2:
|
||||
.DB 0,0,"DRUHY RADEK======*",0xFE
|
||||
MYTEXT3:
|
||||
.DB 0,0,0,"TRETI RADEK=====*",0xFE
|
||||
MYTEXT4:
|
||||
.DB 0,0,0,0,"CTVRTY RADEK===*",0xFE
|
||||
|
||||
MYCHARS:
|
||||
; 5x8, first 3 bits are not used
|
||||
;end of mychars
|
||||
.DB 0xe,0x1f,0x15,0x1f,0x1f,0x1f,0x15 ;smajlik
|
||||
|
||||
;konec
|
||||
.DB 0xFE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;r16=počet ms (cca)
|
||||
delay:
|
||||
push r17 ;2
|
||||
push r18 ;2
|
||||
d1:
|
||||
ldi r17,250 ;1
|
||||
d2:
|
||||
ldi r18,14 ;1
|
||||
d3:
|
||||
dec r18 ;1
|
||||
nop
|
||||
brne d3 ;2 (1
|
||||
dec r17 ; +1)
|
||||
brne d2 ;2 (1
|
||||
dec r16 ; +1)
|
||||
brne d1 ;2 (1)
|
||||
|
||||
pop r18 ;2
|
||||
pop r17 ;2
|
||||
ret
|
||||
|
||||
;r16=Y
|
||||
;r17=X
|
||||
LCD_CURSOR_XY:
|
||||
cpi r16,0
|
||||
brne test1
|
||||
fail: ldi r16,ROW1_ADDR
|
||||
rjmp addrdone
|
||||
test1:
|
||||
cpi r16,1
|
||||
brne test2
|
||||
ldi r16,ROW2_ADDR
|
||||
rjmp addrdone
|
||||
test2:
|
||||
cpi r16,2
|
||||
brne test3
|
||||
ldi r16,ROW3_ADDR
|
||||
rjmp addrdone
|
||||
test3:
|
||||
cpi r16,3
|
||||
brne fail
|
||||
ldi r16,ROW4_ADDR
|
||||
addrdone:
|
||||
add r17,r16
|
||||
rcall DDRAM_SET_ADDR
|
||||
ret
|
||||
|
||||
LCD_INIT:
|
||||
ldi r16,16
|
||||
rcall delay
|
||||
ldi r16,0b00000010 ;4bit
|
||||
out PORTB,r16
|
||||
rcall LCD_CLK
|
||||
ldi r16,5
|
||||
rcall delay
|
||||
ldi r17,LCD_MODE_4BIT_2LINE ;set 4-bit mode
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_INSTR:
|
||||
swap r17 ;send high nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
swap r17 ;send low nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
ret
|
||||
|
||||
;r17
|
||||
TX_DATA:
|
||||
swap r17 ;send high nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,(1<<RS)
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
swap r17 ;send low nibble
|
||||
mov r16,r17
|
||||
andi r16,0b00001111
|
||||
sbr r16,(1<<RS)
|
||||
out LCDPORT,r16
|
||||
rcall LCD_CLK
|
||||
|
||||
ret
|
||||
|
||||
;r17
|
||||
;RX_DATA:
|
||||
; ;input
|
||||
; ldi r16,0b11110000 ;LCDPORT dirrection (RS RW E n.c.) output, (D7 D6 D5 D4) input
|
||||
; out LCDDDR,r16
|
||||
; ldi r16,0b00001111 ;pullups to data pins enabled
|
||||
; out LCDPORT,r16
|
||||
;
|
||||
; clr r17
|
||||
; ldi r16,(1<<RW)|(1<<RS)
|
||||
; out LCDPORT,r16 ;set LCD to read mode, for data
|
||||
;
|
||||
; rcall LCD_CLK ;receive high nibble
|
||||
; in r16,LCDPIN
|
||||
; andi r16,0b00001111
|
||||
; or r17,r16
|
||||
; swap r17 ;store high nibble
|
||||
;
|
||||
; rcall LCD_CLK ;receive low nibble
|
||||
; in r16,LCDPIN
|
||||
; andi r16,0b00001111
|
||||
; or r17,r16 ;store low nibble
|
||||
;
|
||||
; ;output
|
||||
; ldi r16,0b11111111 ;LCDPORT as output (RS RW E n.c. D7 D6 D5 D4)
|
||||
; out LCDDDR,r16
|
||||
; ldi r16,0b00000000 ;LCDPORT off
|
||||
; out LCDPORT,r16
|
||||
;
|
||||
; ;r17=received value (D7 D6 D5 D4 D3 D2 D1 D0)
|
||||
; ret
|
||||
|
||||
LCD_CLK:
|
||||
sbi LCDPORT,E ;EXECUTE on
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
cbi LCDPORT,E ;EXECUTE off
|
||||
ldi r16,150 ;pause: 100 for 4MHZ
|
||||
clkw:
|
||||
dec r16
|
||||
brne clkw
|
||||
ret
|
||||
|
||||
;r17
|
||||
;7 bitu (1.radek zacina 00,druhej 40)
|
||||
DDRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b10000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
|
||||
;r17
|
||||
;6 bitu (5,4,3 = znak, 2,1,0 = radek - shora)
|
||||
CGRAM_SET_ADDR:
|
||||
clr r16
|
||||
sbr r16,0b01000000
|
||||
or r17,r16
|
||||
rcall TX_INSTR
|
||||
ret
|
||||
Reference in New Issue
Block a user