rendered paste body#include "1200def.inc"
#define LCD_CTRL PORTD
#define LCD_DATA PORTB
#define COM_RESET PORTD3
#define COM_EOC PORTD4
#define LCD_RS PORTD5
#define LCD_E PORTD6
#define COM_PC PORTB4
#define COM_SDO PORTB5
#define COM_SCLK PORTB7
.org 0
cbi LCD_CTRL, LCD_RS
ldi r16, 0x10
out PORTB, r16
ldi r16, 0x80
out PORTD, r16
ldi r16, 0x1F
out DDRB, r16
ldi r16, 0x68
out DDRD, r16
ldi r16, 0x03
out LCD_DATA, r16
rcall Delay15ms
rcall ToggleE
rcall Delay15ms
rcall ToggleE
rcall Delay15ms
rcall ToggleE
rcall Delay15ms
ldi r16, 0x02
out LCD_DATA, r16
rcall ToggleE
rcall Delay15ms
ldi r16, 0x28
rcall LCDWrite
rcall Delay15ms
ldi r16, 0x08
rcall LCDWrite
rcall Delay15ms
ldi r16, 0x01
rcall LCDWrite
rcall Delay15ms
ldi r16, 0x06
rcall LCDWrite
rcall Delay15ms
ldi r16, 0x0E
rcall LCDWrite
rcall Delay15ms
sbi LCD_CTRL, LCD_RS
nop
ldi r16, 'A'
rcall LCDWrite
ldi r18, 0 // eeprom start address
ldi r19, 16 // position counter
cbi LCD_CTRL, LCD_RS
ldi r16, 0x80
rcall LCDWrite
rcall Delay15ms
sbi LCD_CTRL, LCD_RS
DrawCompass:
out EEAR, r18 // start address
sbi EECR, EERE // read
in r16, EEDR
rcall LCDWrite
rcall Delay15ms
inc r18
dec r19
brne DrawCompass
wait:
cbi PORTB, COM_PC
sbic PIND, COM_EOC
rjmp wait
sbi PORTB, COM_PC
WaitForHigh:
sbis PIND, COM_EOC
rjmp waitForHigh
ldi r20, 7
WaitClockLow:
sbic PINB, COM_SCLK
rjmp WaitClockLow
WaitClockHigh:
sbis PINB, COM_SCLK
rjmp WaitClockHigh
dec r20
brne WaitClockLow
sbic PINB, COM_SCLK
rjmp PC-1
sbis PINB, COM_SCLK
rjmp PC-1
ldi r21, 0
sbic PINB, COM_SDO
ldi r21, 1
ldi r20, 8
Load2ndByte:
sbic PINB, COM_SCLK
rjmp PC-1
sbis PINB, COM_SCLK
rjmp PC-1
clc
sbis PINB, COM_SDO
sec
rol r22
dec r20
brne Load2ndByte
cbi LCD_CTRL, LCD_RS
ldi r16, 0x80
rcall LCDWrite
rcall Delay15ms
sbi LCD_CTRL, LCD_RS
mov r16, r21
subi r16, -'A'
rcall LCDWrite
rcall Delay15ms
mov r16, r22
andi r16, 0xF0
swap r16
subi r16, -'A'
rcall LCDWrite
rcall Delay15ms
mov r16, r22
andi r16, 0x0F
subi r16, -'A'
rcall LCDWrite
rcall Delay15ms
done:
rjmp done
nop
ToggleE:
nop
nop
nop
sbi LCD_CTRL, LCD_E
nop
nop
nop
cbi LCD_CTRL, LCD_E
nop
nop
nop
ret
Delay15ms:
ldi r17, 20
ldi r16, low(250)
dec r16
brne PC-1
dec r17
brne PC-4
ret
LCDWrite:
in r29, LCD_DATA
andi r29, 0xF0
mov r31, r16
mov r30, r31
andi r31, 0x0F
andi r30, 0xF0
swap r30
or r30, r29
out LCD_DATA, r30
rcall ToggleE
or r31, r29
out LCD_DATA, r31
rcall ToggleE
ret
.eseg
.org 0
.db "---|---N---|---W---|---S---|---E---|---N---|---W---|---S---|---E"
.exit
---|---N---|---W---|---S---|---E---|---N---|---W---|---S---|---E---|
PD0:
PD1:
PD2:
PD3: /RESET
PD4: EOC
PD5: RS
PD6: E
PB0: D4
PB1: D5
PB2: D6
PB3: D7
PB4: P/C
PB5: SDO
PB6:
PB7: SCLK
-NW-|--N--|--NE
NW-|--N--|--NE-
W-|--N--|--NE-|
-|--N--|--NE-|-
|--N--|--NE-|--
--N--|--NE-|--E
-N--|--NE-|--E-
N--|--NE-|--E--
--|--NE-|--E--|
-|--NE-|--E--|-
|--NE-|--E--|--
--NE-|--E--|--S
-NE-|--E--|--SE
NE-|--E--|--SE-
E-|--E--|--SE-|
-|--E--|--SE-|-
|--E--|--SE-|--
--E--|--SE-|--S
-E--|--SE-|--S-
E--|--SE-|--S--
--|--SE-|--S--|
-|--SE-|--S--|-
|--SE-|--S--|--
--SE-|--S--|--S
-SE-|--S--|--SW
SE-|--S--|--SW-
E-|--S--|--SW-|
-|--S--|--SW-|-
|--S--|--SW-|--
--S--|--SW-|--W
-S--|--SW-|--W-
S--|--SW-|--W--
--|--SW-|--W--|
-|--SW-|--W--|-
|--SW-|--W--|--
--SW-|--W--|--N
-SW-|--W--|--NW
SW-|--W--|--NW-
W-|--W--|--NW-|
-|--W--|--NW-|-
|--W--|--NW-|--
--W--|--NW-|--N
-W--|--NW-|--N-
W--|--NW-|--N--
--|--NW-|--N--|
-|--NW-|--N--|-
|--NW-|--N--|--
--NW-|--N--|--N