#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