Merge remote-tracking branch 'upstream/Marlin_v1' into Marlin_v1
Conflicts: Marlin/Marlin.pde Marlin/ultralcd.cpp Marlin/ultralcd_implementation_hitachi_HD44780.h
This commit is contained in:
commit
788d62bcc4
|
@ -14,3 +14,86 @@ sanguino.bootloader.lock_bits=0x0F
|
||||||
sanguino.build.mcu=atmega644p
|
sanguino.build.mcu=atmega644p
|
||||||
sanguino.build.f_cpu=16000000L
|
sanguino.build.f_cpu=16000000L
|
||||||
sanguino.build.core=arduino
|
sanguino.build.core=arduino
|
||||||
|
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
atmega644.name=Sanguino W/ ATmega644P
|
||||||
|
|
||||||
|
atmega644.upload.protocol=stk500
|
||||||
|
atmega644.upload.maximum_size=63488
|
||||||
|
atmega644.upload.speed=57600
|
||||||
|
|
||||||
|
atmega644.bootloader.low_fuses=0xFF
|
||||||
|
atmega644.bootloader.high_fuses=0x9A
|
||||||
|
atmega644.bootloader.extended_fuses=0xFF
|
||||||
|
atmega644.bootloader.path=atmega
|
||||||
|
atmega644.bootloader.file=ATmegaBOOT_168_atmega644p.hex
|
||||||
|
#atmega644.bootloader.file=ATmegaBOOT_644P.hex
|
||||||
|
atmega644.bootloader.unlock_bits=0x3F
|
||||||
|
atmega644.bootloader.lock_bits=0x0F
|
||||||
|
|
||||||
|
atmega644.build.mcu=atmega644p
|
||||||
|
atmega644.build.f_cpu=16000000L
|
||||||
|
atmega644.build.core=arduino
|
||||||
|
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
atmega12848m.name=Sanguino W/ ATmega1284p 8mhz
|
||||||
|
|
||||||
|
atmega12848m.upload.protocol=stk500
|
||||||
|
atmega12848m.upload.maximum_size=131072
|
||||||
|
atmega12848m.upload.speed=19200
|
||||||
|
|
||||||
|
atmega12848m.bootloader.low_fuses=0xFD
|
||||||
|
atmega12848m.bootloader.high_fuses=0x9A
|
||||||
|
atmega12848m.bootloader.extended_fuses=0xFF
|
||||||
|
atmega12848m.bootloader.path=atmega
|
||||||
|
atmega12848m.bootloader.file=ATmegaBOOT_168_atmega1284p_8m.hex
|
||||||
|
atmega12848m.bootloader.unlock_bits=0x3F
|
||||||
|
atmega12848m.bootloader.lock_bits=0x0F
|
||||||
|
|
||||||
|
atmega12848m.build.mcu=atmega1284p
|
||||||
|
atmega12848m.build.f_cpu=8000000L
|
||||||
|
atmega12848m.build.core=arduino
|
||||||
|
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
atmega1284.name=Sanguino W/ ATmega1284p 16mhz
|
||||||
|
|
||||||
|
atmega1284.upload.protocol=stk500
|
||||||
|
atmega1284.upload.maximum_size=131072
|
||||||
|
atmega1284.upload.speed=57600
|
||||||
|
|
||||||
|
atmega1284.bootloader.low_fuses=0xFF
|
||||||
|
atmega1284.bootloader.high_fuses=0x9A
|
||||||
|
atmega1284.bootloader.extended_fuses=0xFF
|
||||||
|
atmega1284.bootloader.path=atmega
|
||||||
|
atmega1284.bootloader.file=ATmegaBOOT_168_atmega1284p.hex
|
||||||
|
atmega1284.bootloader.unlock_bits=0x3F
|
||||||
|
atmega1284.bootloader.lock_bits=0x0F
|
||||||
|
|
||||||
|
atmega1284.build.mcu=atmega1284p
|
||||||
|
atmega1284.build.f_cpu=16000000L
|
||||||
|
atmega1284.build.core=arduino
|
||||||
|
|
||||||
|
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
atmega1284s.name=Sanguino W/ ATmega1284p 20mhz
|
||||||
|
|
||||||
|
atmega1284s.upload.protocol=stk500
|
||||||
|
atmega1284s.upload.maximum_size=131072
|
||||||
|
atmega1284s.upload.speed=57600
|
||||||
|
|
||||||
|
atmega1284s.bootloader.low_fuses=0xFF
|
||||||
|
atmega1284s.bootloader.high_fuses=0x9A
|
||||||
|
atmega1284s.bootloader.extended_fuses=0xFF
|
||||||
|
atmega1284s.bootloader.path=atmega
|
||||||
|
atmega1284s.bootloader.file=ATmegaBOOT_168_atmega1284p.hex
|
||||||
|
atmega1284s.bootloader.unlock_bits=0x3F
|
||||||
|
atmega1284s.bootloader.lock_bits=0x0F
|
||||||
|
|
||||||
|
atmega1284s.build.mcu=atmega1284p
|
||||||
|
atmega1284s.build.f_cpu=20000000L
|
||||||
|
atmega1284s.build.core=arduino
|
||||||
|
#
|
||||||
|
|
|
@ -0,0 +1,470 @@
|
||||||
|
# Makefile for ATmegaBOOT
|
||||||
|
# E.Lins, 18.7.2005
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Instructions
|
||||||
|
#
|
||||||
|
# To make bootloader .hex file:
|
||||||
|
# make diecimila
|
||||||
|
# make lilypad
|
||||||
|
# make ng
|
||||||
|
# etc...
|
||||||
|
#
|
||||||
|
# To burn bootloader .hex file:
|
||||||
|
# make diecimila_isp
|
||||||
|
# make lilypad_isp
|
||||||
|
# make ng_isp
|
||||||
|
# etc...
|
||||||
|
|
||||||
|
# program name should not be changed...
|
||||||
|
PROGRAM = optiboot
|
||||||
|
|
||||||
|
# The default behavior is to build using tools that are in the users
|
||||||
|
# current path variables, but we can also build using an installed
|
||||||
|
# Arduino user IDE setup, or the Arduino source tree.
|
||||||
|
# Uncomment this next lines to build within the arduino environment,
|
||||||
|
# using the arduino-included avrgcc toolset (mac and pc)
|
||||||
|
# ENV ?= arduino
|
||||||
|
# ENV ?= arduinodev
|
||||||
|
# OS ?= macosx
|
||||||
|
# OS ?= windows
|
||||||
|
|
||||||
|
|
||||||
|
# enter the parameters for the avrdude isp tool
|
||||||
|
ISPTOOL = stk500v2
|
||||||
|
ISPPORT = usb
|
||||||
|
ISPSPEED = -b 115200
|
||||||
|
|
||||||
|
MCU_TARGET = atmega168
|
||||||
|
LDSECTIONS = -Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe
|
||||||
|
|
||||||
|
# Build environments
|
||||||
|
# Start of some ugly makefile-isms to allow optiboot to be built
|
||||||
|
# in several different environments. See the README.TXT file for
|
||||||
|
# details.
|
||||||
|
|
||||||
|
# default
|
||||||
|
fixpath = $(1)
|
||||||
|
|
||||||
|
ifeq ($(ENV), arduino)
|
||||||
|
# For Arduino, we assume that we're connected to the optiboot directory
|
||||||
|
# included with the arduino distribution, which means that the full set
|
||||||
|
# of avr-tools are "right up there" in standard places.
|
||||||
|
TOOLROOT = ../../../tools
|
||||||
|
GCCROOT = $(TOOLROOT)/avr/bin/
|
||||||
|
AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf
|
||||||
|
|
||||||
|
ifeq ($(OS), windows)
|
||||||
|
# On windows, SOME of the tool paths will need to have backslashes instead
|
||||||
|
# of forward slashes (because they use windows cmd.exe for execution instead
|
||||||
|
# of a unix/mingw shell?) We also have to ensure that a consistent shell
|
||||||
|
# is used even if a unix shell is installed (ie as part of WINAVR)
|
||||||
|
fixpath = $(subst /,\,$1)
|
||||||
|
SHELL = cmd.exe
|
||||||
|
endif
|
||||||
|
|
||||||
|
else ifeq ($(ENV), arduinodev)
|
||||||
|
# Arduino IDE source code environment. Use the unpacked compilers created
|
||||||
|
# by the build (you'll need to do "ant build" first.)
|
||||||
|
ifeq ($(OS), macosx)
|
||||||
|
TOOLROOT = ../../../../build/macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools
|
||||||
|
endif
|
||||||
|
ifeq ($(OS), windows)
|
||||||
|
TOOLROOT = ../../../../build/windows/work/hardware/tools
|
||||||
|
endif
|
||||||
|
|
||||||
|
GCCROOT = $(TOOLROOT)/avr/bin/
|
||||||
|
AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf
|
||||||
|
|
||||||
|
else
|
||||||
|
GCCROOT =
|
||||||
|
AVRDUDE_CONF =
|
||||||
|
endif
|
||||||
|
#
|
||||||
|
# End of build environment code.
|
||||||
|
|
||||||
|
|
||||||
|
# the efuse should really be 0xf8; since, however, only the lower
|
||||||
|
# three bits of that byte are used on the atmega168, avrdude gets
|
||||||
|
# confused if you specify 1's for the higher bits, see:
|
||||||
|
# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/
|
||||||
|
#
|
||||||
|
# similarly, the lock bits should be 0xff instead of 0x3f (to
|
||||||
|
# unlock the bootloader section) and 0xcf instead of 0x2f (to
|
||||||
|
# lock it), but since the high two bits of the lock byte are
|
||||||
|
# unused, avrdude would get confused.
|
||||||
|
|
||||||
|
ISPFUSES = $(GCCROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \
|
||||||
|
-p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
|
||||||
|
-e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m \
|
||||||
|
-U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m
|
||||||
|
ISPFLASH = $(GCCROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \
|
||||||
|
-p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
|
||||||
|
-U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x2f:m
|
||||||
|
|
||||||
|
STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe"
|
||||||
|
STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \
|
||||||
|
-lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt
|
||||||
|
STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt
|
||||||
|
|
||||||
|
OBJ = $(PROGRAM).o
|
||||||
|
OPTIMIZE = -Os -fno-inline-small-functions -fno-split-wide-types -mshort-calls
|
||||||
|
|
||||||
|
DEFS =
|
||||||
|
LIBS =
|
||||||
|
|
||||||
|
CC = $(GCCROOT)avr-gcc
|
||||||
|
|
||||||
|
# Override is only needed by avr-lib build system.
|
||||||
|
|
||||||
|
override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS)
|
||||||
|
override LDFLAGS = $(LDSECTIONS) -Wl,--relax -Wl,--gc-sections -nostartfiles -nostdlib
|
||||||
|
|
||||||
|
OBJCOPY = $(GCCROOT)avr-objcopy
|
||||||
|
OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump)
|
||||||
|
|
||||||
|
SIZE = $(GCCROOT)avr-size
|
||||||
|
|
||||||
|
# Test platforms
|
||||||
|
# Virtual boot block test
|
||||||
|
virboot328: TARGET = atmega328
|
||||||
|
virboot328: MCU_TARGET = atmega328p
|
||||||
|
virboot328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DVIRTUAL_BOOT'
|
||||||
|
virboot328: AVR_FREQ = 16000000L
|
||||||
|
virboot328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
|
||||||
|
virboot328: $(PROGRAM)_atmega328.hex
|
||||||
|
virboot328: $(PROGRAM)_atmega328.lst
|
||||||
|
|
||||||
|
# 20MHz clocked platforms
|
||||||
|
#
|
||||||
|
# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue)
|
||||||
|
#
|
||||||
|
|
||||||
|
pro20: TARGET = pro_20mhz
|
||||||
|
pro20: MCU_TARGET = atmega168
|
||||||
|
pro20: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
pro20: AVR_FREQ = 20000000L
|
||||||
|
pro20: $(PROGRAM)_pro_20mhz.hex
|
||||||
|
pro20: $(PROGRAM)_pro_20mhz.lst
|
||||||
|
|
||||||
|
pro20_isp: pro20
|
||||||
|
pro20_isp: TARGET = pro_20mhz
|
||||||
|
# 2.7V brownout
|
||||||
|
pro20_isp: HFUSE = DD
|
||||||
|
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
|
||||||
|
pro20_isp: LFUSE = C6
|
||||||
|
# 512 byte boot
|
||||||
|
pro20_isp: EFUSE = 04
|
||||||
|
pro20_isp: isp
|
||||||
|
|
||||||
|
# 16MHz clocked platforms
|
||||||
|
#
|
||||||
|
# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue)
|
||||||
|
#
|
||||||
|
|
||||||
|
pro16: TARGET = pro_16MHz
|
||||||
|
pro16: MCU_TARGET = atmega168
|
||||||
|
pro16: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
pro16: AVR_FREQ = 16000000L
|
||||||
|
pro16: $(PROGRAM)_pro_16MHz.hex
|
||||||
|
pro16: $(PROGRAM)_pro_16MHz.lst
|
||||||
|
|
||||||
|
pro16_isp: pro16
|
||||||
|
pro16_isp: TARGET = pro_16MHz
|
||||||
|
# 2.7V brownout
|
||||||
|
pro16_isp: HFUSE = DD
|
||||||
|
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
|
||||||
|
pro16_isp: LFUSE = C6
|
||||||
|
# 512 byte boot
|
||||||
|
pro16_isp: EFUSE = 04
|
||||||
|
pro16_isp: isp
|
||||||
|
|
||||||
|
# Diecimila, Duemilanove with m168, and NG use identical bootloaders
|
||||||
|
# Call it "atmega168" for generality and clarity, keep "diecimila" for
|
||||||
|
# backward compatibility of makefile
|
||||||
|
#
|
||||||
|
atmega168: TARGET = atmega168
|
||||||
|
atmega168: MCU_TARGET = atmega168
|
||||||
|
atmega168: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
atmega168: AVR_FREQ = 16000000L
|
||||||
|
atmega168: $(PROGRAM)_atmega168.hex
|
||||||
|
atmega168: $(PROGRAM)_atmega168.lst
|
||||||
|
|
||||||
|
atmega168_isp: atmega168
|
||||||
|
atmega168_isp: TARGET = atmega168
|
||||||
|
# 2.7V brownout
|
||||||
|
atmega168_isp: HFUSE = DD
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atmega168_isp: LFUSE = FF
|
||||||
|
# 512 byte boot
|
||||||
|
atmega168_isp: EFUSE = 04
|
||||||
|
atmega168_isp: isp
|
||||||
|
|
||||||
|
diecimila: TARGET = diecimila
|
||||||
|
diecimila: MCU_TARGET = atmega168
|
||||||
|
diecimila: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
diecimila: AVR_FREQ = 16000000L
|
||||||
|
diecimila: $(PROGRAM)_diecimila.hex
|
||||||
|
diecimila: $(PROGRAM)_diecimila.lst
|
||||||
|
|
||||||
|
diecimila_isp: diecimila
|
||||||
|
diecimila_isp: TARGET = diecimila
|
||||||
|
# 2.7V brownout
|
||||||
|
diecimila_isp: HFUSE = DD
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
diecimila_isp: LFUSE = FF
|
||||||
|
# 512 byte boot
|
||||||
|
diecimila_isp: EFUSE = 04
|
||||||
|
diecimila_isp: isp
|
||||||
|
|
||||||
|
atmega328: TARGET = atmega328
|
||||||
|
atmega328: MCU_TARGET = atmega328p
|
||||||
|
atmega328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
atmega328: AVR_FREQ = 16000000L
|
||||||
|
atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
|
||||||
|
atmega328: $(PROGRAM)_atmega328.hex
|
||||||
|
atmega328: $(PROGRAM)_atmega328.lst
|
||||||
|
|
||||||
|
atmega328_isp: atmega328
|
||||||
|
atmega328_isp: TARGET = atmega328
|
||||||
|
atmega328_isp: MCU_TARGET = atmega328p
|
||||||
|
# 512 byte boot, SPIEN
|
||||||
|
atmega328_isp: HFUSE = DE
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atmega328_isp: LFUSE = FF
|
||||||
|
# 2.7V brownout
|
||||||
|
atmega328_isp: EFUSE = 05
|
||||||
|
atmega328_isp: isp
|
||||||
|
|
||||||
|
atmega1284: TARGET = atmega1284p
|
||||||
|
atmega1284: MCU_TARGET = atmega1284p
|
||||||
|
atmega1284: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DBIGBOOT'
|
||||||
|
atmega1284: AVR_FREQ = 16000000L
|
||||||
|
atmega1284: LDSECTIONS = -Wl,--section-start=.text=0x1fc00
|
||||||
|
atmega1284: $(PROGRAM)_atmega1284p.hex
|
||||||
|
atmega1284: $(PROGRAM)_atmega1284p.lst
|
||||||
|
|
||||||
|
atmega1284_isp: atmega1284
|
||||||
|
atmega1284_isp: TARGET = atmega1284p
|
||||||
|
atmega1284_isp: MCU_TARGET = atmega1284p
|
||||||
|
# 1024 byte boot
|
||||||
|
atmega1284_isp: HFUSE = DE
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atmega1284_isp: LFUSE = FF
|
||||||
|
# 2.7V brownout
|
||||||
|
atmega1284_isp: EFUSE = FD
|
||||||
|
atmega1284_isp: isp
|
||||||
|
|
||||||
|
# Sanguino has a minimum boot size of 1024 bytes, so enable extra functions
|
||||||
|
#
|
||||||
|
sanguino: TARGET = atmega644p
|
||||||
|
sanguino: MCU_TARGET = atmega644p
|
||||||
|
sanguino: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DBIGBOOT'
|
||||||
|
sanguino: AVR_FREQ = 16000000L
|
||||||
|
sanguino: LDSECTIONS = -Wl,--section-start=.text=0xfc00
|
||||||
|
sanguino: $(PROGRAM)_atmega644p.hex
|
||||||
|
sanguino: $(PROGRAM)_atmega644p.lst
|
||||||
|
|
||||||
|
sanguino_isp: sanguino
|
||||||
|
sanguino_isp: TARGET = atmega644p
|
||||||
|
sanguino_isp: MCU_TARGET = atmega644p
|
||||||
|
# 1024 byte boot
|
||||||
|
sanguino_isp: HFUSE = DE
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
sanguino_isp: LFUSE = FF
|
||||||
|
# 2.7V brownout
|
||||||
|
sanguino_isp: EFUSE = 05
|
||||||
|
sanguino_isp: isp
|
||||||
|
|
||||||
|
# Mega has a minimum boot size of 1024 bytes, so enable extra functions
|
||||||
|
#mega: TARGET = atmega1280
|
||||||
|
mega: MCU_TARGET = atmega1280
|
||||||
|
mega: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DBIGBOOT'
|
||||||
|
mega: AVR_FREQ = 16000000L
|
||||||
|
mega: LDSECTIONS = -Wl,--section-start=.text=0x1fc00
|
||||||
|
mega: $(PROGRAM)_atmega1280.hex
|
||||||
|
mega: $(PROGRAM)_atmega1280.lst
|
||||||
|
|
||||||
|
mega_isp: mega
|
||||||
|
mega_isp: TARGET = atmega1280
|
||||||
|
mega_isp: MCU_TARGET = atmega1280
|
||||||
|
# 1024 byte boot
|
||||||
|
mega_isp: HFUSE = DE
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
mega_isp: LFUSE = FF
|
||||||
|
# 2.7V brownout
|
||||||
|
mega_isp: EFUSE = 05
|
||||||
|
mega_isp: isp
|
||||||
|
|
||||||
|
# ATmega8
|
||||||
|
#
|
||||||
|
atmega8: TARGET = atmega8
|
||||||
|
atmega8: MCU_TARGET = atmega8
|
||||||
|
atmega8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
atmega8: AVR_FREQ = 16000000L
|
||||||
|
atmega8: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe
|
||||||
|
atmega8: $(PROGRAM)_atmega8.hex
|
||||||
|
atmega8: $(PROGRAM)_atmega8.lst
|
||||||
|
|
||||||
|
atmega8_isp: atmega8
|
||||||
|
atmega8_isp: TARGET = atmega8
|
||||||
|
atmega8_isp: MCU_TARGET = atmega8
|
||||||
|
# SPIEN, CKOPT, Bootsize=512B
|
||||||
|
atmega8_isp: HFUSE = CC
|
||||||
|
# 2.7V brownout, Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atmega8_isp: LFUSE = BF
|
||||||
|
atmega8_isp: isp
|
||||||
|
|
||||||
|
# ATmega88
|
||||||
|
#
|
||||||
|
atmega88: TARGET = atmega88
|
||||||
|
atmega88: MCU_TARGET = atmega88
|
||||||
|
atmega88: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
atmega88: AVR_FREQ = 16000000L
|
||||||
|
atmega88: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe
|
||||||
|
atmega88: $(PROGRAM)_atmega88.hex
|
||||||
|
atmega88: $(PROGRAM)_atmega88.lst
|
||||||
|
|
||||||
|
atmega88_isp: atmega88
|
||||||
|
atmega88_isp: TARGET = atmega88
|
||||||
|
atmega88_isp: MCU_TARGET = atmega88
|
||||||
|
# 2.7V brownout
|
||||||
|
atmega88_isp: HFUSE = DD
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atemga88_isp: LFUSE = FF
|
||||||
|
# 512 byte boot
|
||||||
|
atmega88_isp: EFUSE = 04
|
||||||
|
atmega88_isp: isp
|
||||||
|
|
||||||
|
|
||||||
|
# 8MHz clocked platforms
|
||||||
|
#
|
||||||
|
# These are capable of 115200 baud
|
||||||
|
#
|
||||||
|
|
||||||
|
lilypad: TARGET = lilypad
|
||||||
|
lilypad: MCU_TARGET = atmega168
|
||||||
|
lilypad: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
lilypad: AVR_FREQ = 8000000L
|
||||||
|
lilypad: $(PROGRAM)_lilypad.hex
|
||||||
|
lilypad: $(PROGRAM)_lilypad.lst
|
||||||
|
|
||||||
|
lilypad_isp: lilypad
|
||||||
|
lilypad_isp: TARGET = lilypad
|
||||||
|
# 2.7V brownout
|
||||||
|
lilypad_isp: HFUSE = DD
|
||||||
|
# Internal 8MHz osc (8MHz) Slow rising power
|
||||||
|
lilypad_isp: LFUSE = E2
|
||||||
|
# 512 byte boot
|
||||||
|
lilypad_isp: EFUSE = 04
|
||||||
|
lilypad_isp: isp
|
||||||
|
|
||||||
|
lilypad_resonator: TARGET = lilypad_resonator
|
||||||
|
lilypad_resonator: MCU_TARGET = atmega168
|
||||||
|
lilypad_resonator: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
lilypad_resonator: AVR_FREQ = 8000000L
|
||||||
|
lilypad_resonator: $(PROGRAM)_lilypad_resonator.hex
|
||||||
|
lilypad_resonator: $(PROGRAM)_lilypad_resonator.lst
|
||||||
|
|
||||||
|
lilypad_resonator_isp: lilypad_resonator
|
||||||
|
lilypad_resonator_isp: TARGET = lilypad_resonator
|
||||||
|
# 2.7V brownout
|
||||||
|
lilypad_resonator_isp: HFUSE = DD
|
||||||
|
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
|
||||||
|
lilypad_resonator_isp: LFUSE = C6
|
||||||
|
# 512 byte boot
|
||||||
|
lilypad_resonator_isp: EFUSE = 04
|
||||||
|
lilypad_resonator_isp: isp
|
||||||
|
|
||||||
|
pro8: TARGET = pro_8MHz
|
||||||
|
pro8: MCU_TARGET = atmega168
|
||||||
|
pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
pro8: AVR_FREQ = 8000000L
|
||||||
|
pro8: $(PROGRAM)_pro_8MHz.hex
|
||||||
|
pro8: $(PROGRAM)_pro_8MHz.lst
|
||||||
|
|
||||||
|
pro8_isp: pro8
|
||||||
|
pro8_isp: TARGET = pro_8MHz
|
||||||
|
# 2.7V brownout
|
||||||
|
pro8_isp: HFUSE = DD
|
||||||
|
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
|
||||||
|
pro8_isp: LFUSE = C6
|
||||||
|
# 512 byte boot
|
||||||
|
pro8_isp: EFUSE = 04
|
||||||
|
pro8_isp: isp
|
||||||
|
|
||||||
|
atmega328_pro8: TARGET = atmega328_pro_8MHz
|
||||||
|
atmega328_pro8: MCU_TARGET = atmega328p
|
||||||
|
atmega328_pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
atmega328_pro8: AVR_FREQ = 8000000L
|
||||||
|
atmega328_pro8: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
|
||||||
|
atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.hex
|
||||||
|
atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.lst
|
||||||
|
|
||||||
|
atmega328_pro8_isp: atmega328_pro8
|
||||||
|
atmega328_pro8_isp: TARGET = atmega328_pro_8MHz
|
||||||
|
atmega328_pro8_isp: MCU_TARGET = atmega328p
|
||||||
|
# 512 byte boot, SPIEN
|
||||||
|
atmega328_pro8_isp: HFUSE = DE
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atmega328_pro8_isp: LFUSE = FF
|
||||||
|
# 2.7V brownout
|
||||||
|
atmega328_pro8_isp: EFUSE = 05
|
||||||
|
atmega328_pro8_isp: isp
|
||||||
|
|
||||||
|
# 1MHz clocked platforms
|
||||||
|
#
|
||||||
|
# These are capable of 9600 baud
|
||||||
|
#
|
||||||
|
|
||||||
|
luminet: TARGET = luminet
|
||||||
|
luminet: MCU_TARGET = attiny84
|
||||||
|
luminet: CFLAGS += '-DLED_START_FLASHES=3' '-DSOFT_UART' '-DBAUD_RATE=9600'
|
||||||
|
luminet: CFLAGS += '-DVIRTUAL_BOOT_PARTITION'
|
||||||
|
luminet: AVR_FREQ = 1000000L
|
||||||
|
luminet: LDSECTIONS = -Wl,--section-start=.text=0x1d00 -Wl,--section-start=.version=0x1efe
|
||||||
|
luminet: $(PROGRAM)_luminet.hex
|
||||||
|
luminet: $(PROGRAM)_luminet.lst
|
||||||
|
|
||||||
|
luminet_isp: luminet
|
||||||
|
luminet_isp: TARGET = luminet
|
||||||
|
luminet_isp: MCU_TARGET = attiny84
|
||||||
|
# Brownout disabled
|
||||||
|
luminet_isp: HFUSE = DF
|
||||||
|
# 1MHz internal oscillator, slowly rising power
|
||||||
|
luminet_isp: LFUSE = 62
|
||||||
|
# Self-programming enable
|
||||||
|
luminet_isp: EFUSE = FE
|
||||||
|
luminet_isp: isp
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generic build instructions
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
isp: $(TARGET)
|
||||||
|
$(ISPFUSES)
|
||||||
|
$(ISPFLASH)
|
||||||
|
|
||||||
|
isp-stk500: $(PROGRAM)_$(TARGET).hex
|
||||||
|
$(STK500-1)
|
||||||
|
$(STK500-2)
|
||||||
|
|
||||||
|
%.elf: $(OBJ)
|
||||||
|
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||||
|
$(SIZE) $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex
|
||||||
|
|
||||||
|
%.lst: %.elf
|
||||||
|
$(OBJDUMP) -h -S $< > $@
|
||||||
|
|
||||||
|
%.hex: %.elf
|
||||||
|
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O ihex $< $@
|
||||||
|
|
||||||
|
%.srec: %.elf
|
||||||
|
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O srec $< $@
|
||||||
|
|
||||||
|
%.bin: %.elf
|
||||||
|
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O binary $< $@
|
|
@ -0,0 +1,848 @@
|
||||||
|
/* Modified to use out for SPM access
|
||||||
|
** Peter Knight, Optiboot project http://optiboot.googlecode.com
|
||||||
|
**
|
||||||
|
** Todo: Tidy up
|
||||||
|
**
|
||||||
|
** "_short" routines execute 1 cycle faster and use 1 less word of flash
|
||||||
|
** by using "out" instruction instead of "sts".
|
||||||
|
**
|
||||||
|
** Additional elpm variants that trust the value of RAMPZ
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007 Eric B. Weddington
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name of the copyright holders nor the names of
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* $Id: boot.h,v 1.27.2.3 2008/09/30 13:58:48 arcanum Exp $ */
|
||||||
|
|
||||||
|
#ifndef _AVR_BOOT_H_
|
||||||
|
#define _AVR_BOOT_H_ 1
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
/** \defgroup avr_boot <avr/boot.h>: Bootloader Support Utilities
|
||||||
|
\code
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/boot.h>
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
The macros in this module provide a C language interface to the
|
||||||
|
bootloader support functionality of certain AVR processors. These
|
||||||
|
macros are designed to work with all sizes of flash memory.
|
||||||
|
|
||||||
|
Global interrupts are not automatically disabled for these macros. It
|
||||||
|
is left up to the programmer to do this. See the code example below.
|
||||||
|
Also see the processor datasheet for caveats on having global interrupts
|
||||||
|
enabled during writing of the Flash.
|
||||||
|
|
||||||
|
\note Not all AVR processors provide bootloader support. See your
|
||||||
|
processor datasheet to see if it provides bootloader support.
|
||||||
|
|
||||||
|
\todo From email with Marek: On smaller devices (all except ATmega64/128),
|
||||||
|
__SPM_REG is in the I/O space, accessible with the shorter "in" and "out"
|
||||||
|
instructions - since the boot loader has a limited size, this could be an
|
||||||
|
important optimization.
|
||||||
|
|
||||||
|
\par API Usage Example
|
||||||
|
The following code shows typical usage of the boot API.
|
||||||
|
|
||||||
|
\code
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
void boot_program_page (uint32_t page, uint8_t *buf)
|
||||||
|
{
|
||||||
|
uint16_t i;
|
||||||
|
uint8_t sreg;
|
||||||
|
|
||||||
|
// Disable interrupts.
|
||||||
|
|
||||||
|
sreg = SREG;
|
||||||
|
cli();
|
||||||
|
|
||||||
|
eeprom_busy_wait ();
|
||||||
|
|
||||||
|
boot_page_erase (page);
|
||||||
|
boot_spm_busy_wait (); // Wait until the memory is erased.
|
||||||
|
|
||||||
|
for (i=0; i<SPM_PAGESIZE; i+=2)
|
||||||
|
{
|
||||||
|
// Set up little-endian word.
|
||||||
|
|
||||||
|
uint16_t w = *buf++;
|
||||||
|
w += (*buf++) << 8;
|
||||||
|
|
||||||
|
boot_page_fill (page + i, w);
|
||||||
|
}
|
||||||
|
|
||||||
|
boot_page_write (page); // Store buffer in flash page.
|
||||||
|
boot_spm_busy_wait(); // Wait until the memory is written.
|
||||||
|
|
||||||
|
// Reenable RWW-section again. We need this if we want to jump back
|
||||||
|
// to the application after bootloading.
|
||||||
|
|
||||||
|
boot_rww_enable ();
|
||||||
|
|
||||||
|
// Re-enable interrupts (if they were ever enabled).
|
||||||
|
|
||||||
|
SREG = sreg;
|
||||||
|
}\endcode */
|
||||||
|
|
||||||
|
#include <avr/eeprom.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* Check for SPM Control Register in processor. */
|
||||||
|
#if defined (SPMCSR)
|
||||||
|
# define __SPM_REG SPMCSR
|
||||||
|
#elif defined (SPMCR)
|
||||||
|
# define __SPM_REG SPMCR
|
||||||
|
#else
|
||||||
|
# error AVR processor does not provide bootloader support!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Check for SPM Enable bit. */
|
||||||
|
#if defined(SPMEN)
|
||||||
|
# define __SPM_ENABLE SPMEN
|
||||||
|
#elif defined(SELFPRGEN)
|
||||||
|
# define __SPM_ENABLE SELFPRGEN
|
||||||
|
#else
|
||||||
|
# error Cannot find SPM Enable bit definition!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def BOOTLOADER_SECTION
|
||||||
|
|
||||||
|
Used to declare a function or variable to be placed into a
|
||||||
|
new section called .bootloader. This section and its contents
|
||||||
|
can then be relocated to any address (such as the bootloader
|
||||||
|
NRWW area) at link-time. */
|
||||||
|
|
||||||
|
#define BOOTLOADER_SECTION __attribute__ ((section (".bootloader")))
|
||||||
|
|
||||||
|
/* Create common bit definitions. */
|
||||||
|
#ifdef ASB
|
||||||
|
#define __COMMON_ASB ASB
|
||||||
|
#else
|
||||||
|
#define __COMMON_ASB RWWSB
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ASRE
|
||||||
|
#define __COMMON_ASRE ASRE
|
||||||
|
#else
|
||||||
|
#define __COMMON_ASRE RWWSRE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define the bit positions of the Boot Lock Bits. */
|
||||||
|
|
||||||
|
#define BLB12 5
|
||||||
|
#define BLB11 4
|
||||||
|
#define BLB02 3
|
||||||
|
#define BLB01 2
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_spm_interrupt_enable()
|
||||||
|
Enable the SPM interrupt. */
|
||||||
|
|
||||||
|
#define boot_spm_interrupt_enable() (__SPM_REG |= (uint8_t)_BV(SPMIE))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_spm_interrupt_disable()
|
||||||
|
Disable the SPM interrupt. */
|
||||||
|
|
||||||
|
#define boot_spm_interrupt_disable() (__SPM_REG &= (uint8_t)~_BV(SPMIE))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_is_spm_interrupt()
|
||||||
|
Check if the SPM interrupt is enabled. */
|
||||||
|
|
||||||
|
#define boot_is_spm_interrupt() (__SPM_REG & (uint8_t)_BV(SPMIE))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_rww_busy()
|
||||||
|
Check if the RWW section is busy. */
|
||||||
|
|
||||||
|
#define boot_rww_busy() (__SPM_REG & (uint8_t)_BV(__COMMON_ASB))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_spm_busy()
|
||||||
|
Check if the SPM instruction is busy. */
|
||||||
|
|
||||||
|
#define boot_spm_busy() (__SPM_REG & (uint8_t)_BV(__SPM_ENABLE))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_spm_busy_wait()
|
||||||
|
Wait while the SPM instruction is busy. */
|
||||||
|
|
||||||
|
#define boot_spm_busy_wait() do{}while(boot_spm_busy())
|
||||||
|
|
||||||
|
#define __BOOT_PAGE_ERASE (_BV(__SPM_ENABLE) | _BV(PGERS))
|
||||||
|
#define __BOOT_PAGE_WRITE (_BV(__SPM_ENABLE) | _BV(PGWRT))
|
||||||
|
#define __BOOT_PAGE_FILL _BV(__SPM_ENABLE)
|
||||||
|
#define __BOOT_RWW_ENABLE (_BV(__SPM_ENABLE) | _BV(__COMMON_ASRE))
|
||||||
|
#define __BOOT_LOCK_BITS_SET (_BV(__SPM_ENABLE) | _BV(BLBSET))
|
||||||
|
|
||||||
|
#define __boot_page_fill_short(address, data) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r0, %3\n\t" \
|
||||||
|
"out %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
"clr r1\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_FILL), \
|
||||||
|
"z" ((uint16_t)address), \
|
||||||
|
"r" ((uint16_t)data) \
|
||||||
|
: "r0" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_fill_normal(address, data) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r0, %3\n\t" \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
"clr r1\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_FILL), \
|
||||||
|
"z" ((uint16_t)address), \
|
||||||
|
"r" ((uint16_t)data) \
|
||||||
|
: "r0" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_fill_alternate(address, data)\
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r0, %3\n\t" \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
".word 0xffff\n\t" \
|
||||||
|
"nop\n\t" \
|
||||||
|
"clr r1\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_FILL), \
|
||||||
|
"z" ((uint16_t)address), \
|
||||||
|
"r" ((uint16_t)data) \
|
||||||
|
: "r0" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_fill_extended(address, data) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r0, %4\n\t" \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"sts %1, %C3\n\t" \
|
||||||
|
"sts %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
"clr r1\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_MEM_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_FILL), \
|
||||||
|
"r" ((uint32_t)address), \
|
||||||
|
"r" ((uint16_t)data) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_fill_extended_short(address, data) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r0, %4\n\t" \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"out %1, %C3\n\t" \
|
||||||
|
"out %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
"clr r1\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_IO_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_FILL), \
|
||||||
|
"r" ((uint32_t)address), \
|
||||||
|
"r" ((uint16_t)data) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_erase_short(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"out %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_ERASE), \
|
||||||
|
"z" ((uint16_t)address) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
|
||||||
|
#define __boot_page_erase_normal(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_ERASE), \
|
||||||
|
"z" ((uint16_t)address) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_erase_alternate(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
".word 0xffff\n\t" \
|
||||||
|
"nop\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_ERASE), \
|
||||||
|
"z" ((uint16_t)address) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_erase_extended(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"sts %1, %C3\n\t" \
|
||||||
|
"sts %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_MEM_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_ERASE), \
|
||||||
|
"r" ((uint32_t)address) \
|
||||||
|
: "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
#define __boot_page_erase_extended_short(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"out %1, %C3\n\t" \
|
||||||
|
"out %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_IO_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_ERASE), \
|
||||||
|
"r" ((uint32_t)address) \
|
||||||
|
: "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_write_short(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"out %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_WRITE), \
|
||||||
|
"z" ((uint16_t)address) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_write_normal(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_WRITE), \
|
||||||
|
"z" ((uint16_t)address) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_write_alternate(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
".word 0xffff\n\t" \
|
||||||
|
"nop\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_WRITE), \
|
||||||
|
"z" ((uint16_t)address) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_write_extended(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"sts %1, %C3\n\t" \
|
||||||
|
"sts %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_MEM_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_WRITE), \
|
||||||
|
"r" ((uint32_t)address) \
|
||||||
|
: "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
#define __boot_page_write_extended_short(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"out %1, %C3\n\t" \
|
||||||
|
"out %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_IO_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_WRITE), \
|
||||||
|
"r" ((uint32_t)address) \
|
||||||
|
: "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_rww_enable_short() \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"out %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_RWW_ENABLE) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_rww_enable() \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_RWW_ENABLE) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_rww_enable_alternate() \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
".word 0xffff\n\t" \
|
||||||
|
"nop\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_RWW_ENABLE) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
/* From the mega16/mega128 data sheets (maybe others):
|
||||||
|
|
||||||
|
Bits by SPM To set the Boot Loader Lock bits, write the desired data to
|
||||||
|
R0, write "X0001001" to SPMCR and execute SPM within four clock cycles
|
||||||
|
after writing SPMCR. The only accessible Lock bits are the Boot Lock bits
|
||||||
|
that may prevent the Application and Boot Loader section from any
|
||||||
|
software update by the MCU.
|
||||||
|
|
||||||
|
If bits 5..2 in R0 are cleared (zero), the corresponding Boot Lock bit
|
||||||
|
will be programmed if an SPM instruction is executed within four cycles
|
||||||
|
after BLBSET and SPMEN (or SELFPRGEN) are set in SPMCR. The Z-pointer is
|
||||||
|
don't care during this operation, but for future compatibility it is
|
||||||
|
recommended to load the Z-pointer with $0001 (same as used for reading the
|
||||||
|
Lock bits). For future compatibility It is also recommended to set bits 7,
|
||||||
|
6, 1, and 0 in R0 to 1 when writing the Lock bits. When programming the
|
||||||
|
Lock bits the entire Flash can be read during the operation. */
|
||||||
|
|
||||||
|
#define __boot_lock_bits_set_short(lock_bits) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint8_t value = (uint8_t)(~(lock_bits)); \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"ldi r30, 1\n\t" \
|
||||||
|
"ldi r31, 0\n\t" \
|
||||||
|
"mov r0, %2\n\t" \
|
||||||
|
"out %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
|
||||||
|
"r" (value) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_lock_bits_set(lock_bits) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint8_t value = (uint8_t)(~(lock_bits)); \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"ldi r30, 1\n\t" \
|
||||||
|
"ldi r31, 0\n\t" \
|
||||||
|
"mov r0, %2\n\t" \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
|
||||||
|
"r" (value) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_lock_bits_set_alternate(lock_bits) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint8_t value = (uint8_t)(~(lock_bits)); \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"ldi r30, 1\n\t" \
|
||||||
|
"ldi r31, 0\n\t" \
|
||||||
|
"mov r0, %2\n\t" \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
".word 0xffff\n\t" \
|
||||||
|
"nop\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
|
||||||
|
"r" (value) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
/*
|
||||||
|
Reading lock and fuse bits:
|
||||||
|
|
||||||
|
Similarly to writing the lock bits above, set BLBSET and SPMEN (or
|
||||||
|
SELFPRGEN) bits in __SPMREG, and then (within four clock cycles) issue an
|
||||||
|
LPM instruction.
|
||||||
|
|
||||||
|
Z address: contents:
|
||||||
|
0x0000 low fuse bits
|
||||||
|
0x0001 lock bits
|
||||||
|
0x0002 extended fuse bits
|
||||||
|
0x0003 high fuse bits
|
||||||
|
|
||||||
|
Sounds confusing, doesn't it?
|
||||||
|
|
||||||
|
Unlike the macros in pgmspace.h, no need to care for non-enhanced
|
||||||
|
cores here as these old cores do not provide SPM support anyway.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def GET_LOW_FUSE_BITS
|
||||||
|
address to read the low fuse bits, using boot_lock_fuse_bits_get
|
||||||
|
*/
|
||||||
|
#define GET_LOW_FUSE_BITS (0x0000)
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def GET_LOCK_BITS
|
||||||
|
address to read the lock bits, using boot_lock_fuse_bits_get
|
||||||
|
*/
|
||||||
|
#define GET_LOCK_BITS (0x0001)
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def GET_EXTENDED_FUSE_BITS
|
||||||
|
address to read the extended fuse bits, using boot_lock_fuse_bits_get
|
||||||
|
*/
|
||||||
|
#define GET_EXTENDED_FUSE_BITS (0x0002)
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def GET_HIGH_FUSE_BITS
|
||||||
|
address to read the high fuse bits, using boot_lock_fuse_bits_get
|
||||||
|
*/
|
||||||
|
#define GET_HIGH_FUSE_BITS (0x0003)
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_lock_fuse_bits_get(address)
|
||||||
|
|
||||||
|
Read the lock or fuse bits at \c address.
|
||||||
|
|
||||||
|
Parameter \c address can be any of GET_LOW_FUSE_BITS,
|
||||||
|
GET_LOCK_BITS, GET_EXTENDED_FUSE_BITS, or GET_HIGH_FUSE_BITS.
|
||||||
|
|
||||||
|
\note The lock and fuse bits returned are the physical values,
|
||||||
|
i.e. a bit returned as 0 means the corresponding fuse or lock bit
|
||||||
|
is programmed.
|
||||||
|
*/
|
||||||
|
#define boot_lock_fuse_bits_get_short(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint8_t __result; \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"ldi r30, %3\n\t" \
|
||||||
|
"ldi r31, 0\n\t" \
|
||||||
|
"out %1, %2\n\t" \
|
||||||
|
"lpm %0, Z\n\t" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
|
||||||
|
"M" (address) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define boot_lock_fuse_bits_get(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint8_t __result; \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"ldi r30, %3\n\t" \
|
||||||
|
"ldi r31, 0\n\t" \
|
||||||
|
"sts %1, %2\n\t" \
|
||||||
|
"lpm %0, Z\n\t" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
|
||||||
|
"M" (address) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_signature_byte_get(address)
|
||||||
|
|
||||||
|
Read the Signature Row byte at \c address. For some MCU types,
|
||||||
|
this function can also retrieve the factory-stored oscillator
|
||||||
|
calibration bytes.
|
||||||
|
|
||||||
|
Parameter \c address can be 0-0x1f as documented by the datasheet.
|
||||||
|
\note The values are MCU type dependent.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __BOOT_SIGROW_READ (_BV(__SPM_ENABLE) | _BV(SIGRD))
|
||||||
|
|
||||||
|
#define boot_signature_byte_get_short(addr) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint16_t __addr16 = (uint16_t)(addr); \
|
||||||
|
uint8_t __result; \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"out %1, %2\n\t" \
|
||||||
|
"lpm %0, Z" "\n\t" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t) __BOOT_SIGROW_READ), \
|
||||||
|
"z" (__addr16) \
|
||||||
|
); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define boot_signature_byte_get(addr) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint16_t __addr16 = (uint16_t)(addr); \
|
||||||
|
uint8_t __result; \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %1, %2\n\t" \
|
||||||
|
"lpm %0, Z" "\n\t" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t) __BOOT_SIGROW_READ), \
|
||||||
|
"z" (__addr16) \
|
||||||
|
); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_page_fill(address, data)
|
||||||
|
|
||||||
|
Fill the bootloader temporary page buffer for flash
|
||||||
|
address with data word.
|
||||||
|
|
||||||
|
\note The address is a byte address. The data is a word. The AVR
|
||||||
|
writes data to the buffer a word at a time, but addresses the buffer
|
||||||
|
per byte! So, increment your address by 2 between calls, and send 2
|
||||||
|
data bytes in a word format! The LSB of the data is written to the lower
|
||||||
|
address; the MSB of the data is written to the higher address.*/
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_page_erase(address)
|
||||||
|
|
||||||
|
Erase the flash page that contains address.
|
||||||
|
|
||||||
|
\note address is a byte address in flash, not a word address. */
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_page_write(address)
|
||||||
|
|
||||||
|
Write the bootloader temporary page buffer
|
||||||
|
to flash page that contains address.
|
||||||
|
|
||||||
|
\note address is a byte address in flash, not a word address. */
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_rww_enable()
|
||||||
|
|
||||||
|
Enable the Read-While-Write memory section. */
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_lock_bits_set(lock_bits)
|
||||||
|
|
||||||
|
Set the bootloader lock bits.
|
||||||
|
|
||||||
|
\param lock_bits A mask of which Boot Loader Lock Bits to set.
|
||||||
|
|
||||||
|
\note In this context, a 'set bit' will be written to a zero value.
|
||||||
|
Note also that only BLBxx bits can be programmed by this command.
|
||||||
|
|
||||||
|
For example, to disallow the SPM instruction from writing to the Boot
|
||||||
|
Loader memory section of flash, you would use this macro as such:
|
||||||
|
|
||||||
|
\code
|
||||||
|
boot_lock_bits_set (_BV (BLB11));
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
\note Like any lock bits, the Boot Loader Lock Bits, once set,
|
||||||
|
cannot be cleared again except by a chip erase which will in turn
|
||||||
|
also erase the boot loader itself. */
|
||||||
|
|
||||||
|
/* Normal versions of the macros use 16-bit addresses.
|
||||||
|
Extended versions of the macros use 32-bit addresses.
|
||||||
|
Alternate versions of the macros use 16-bit addresses and require special
|
||||||
|
instruction sequences after LPM.
|
||||||
|
|
||||||
|
FLASHEND is defined in the ioXXXX.h file.
|
||||||
|
USHRT_MAX is defined in <limits.h>. */
|
||||||
|
|
||||||
|
#if defined(__AVR_ATmega161__) || defined(__AVR_ATmega163__) \
|
||||||
|
|| defined(__AVR_ATmega323__)
|
||||||
|
|
||||||
|
/* Alternate: ATmega161/163/323 and 16 bit address */
|
||||||
|
#define boot_page_fill(address, data) __boot_page_fill_alternate(address, data)
|
||||||
|
#define boot_page_erase(address) __boot_page_erase_alternate(address)
|
||||||
|
#define boot_page_write(address) __boot_page_write_alternate(address)
|
||||||
|
#define boot_rww_enable() __boot_rww_enable_alternate()
|
||||||
|
#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_alternate(lock_bits)
|
||||||
|
|
||||||
|
#elif (FLASHEND > USHRT_MAX)
|
||||||
|
|
||||||
|
/* Extended: >16 bit address */
|
||||||
|
#define boot_page_fill(address, data) __boot_page_fill_extended_short(address, data)
|
||||||
|
#define boot_page_erase(address) __boot_page_erase_extended_short(address)
|
||||||
|
#define boot_page_write(address) __boot_page_write_extended_short(address)
|
||||||
|
#define boot_rww_enable() __boot_rww_enable_short()
|
||||||
|
#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_short(lock_bits)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Normal: 16 bit address */
|
||||||
|
#define boot_page_fill(address, data) __boot_page_fill_short(address, data)
|
||||||
|
#define boot_page_erase(address) __boot_page_erase_short(address)
|
||||||
|
#define boot_page_write(address) __boot_page_write_short(address)
|
||||||
|
#define boot_rww_enable() __boot_rww_enable_short()
|
||||||
|
#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_short(lock_bits)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
|
||||||
|
Same as boot_page_fill() except it waits for eeprom and spm operations to
|
||||||
|
complete before filling the page. */
|
||||||
|
|
||||||
|
#define boot_page_fill_safe(address, data) \
|
||||||
|
do { \
|
||||||
|
boot_spm_busy_wait(); \
|
||||||
|
eeprom_busy_wait(); \
|
||||||
|
boot_page_fill(address, data); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
|
||||||
|
Same as boot_page_erase() except it waits for eeprom and spm operations to
|
||||||
|
complete before erasing the page. */
|
||||||
|
|
||||||
|
#define boot_page_erase_safe(address) \
|
||||||
|
do { \
|
||||||
|
boot_spm_busy_wait(); \
|
||||||
|
eeprom_busy_wait(); \
|
||||||
|
boot_page_erase (address); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
|
||||||
|
Same as boot_page_write() except it waits for eeprom and spm operations to
|
||||||
|
complete before writing the page. */
|
||||||
|
|
||||||
|
#define boot_page_write_safe(address) \
|
||||||
|
do { \
|
||||||
|
boot_spm_busy_wait(); \
|
||||||
|
eeprom_busy_wait(); \
|
||||||
|
boot_page_write (address); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
|
||||||
|
Same as boot_rww_enable() except waits for eeprom and spm operations to
|
||||||
|
complete before enabling the RWW mameory. */
|
||||||
|
|
||||||
|
#define boot_rww_enable_safe() \
|
||||||
|
do { \
|
||||||
|
boot_spm_busy_wait(); \
|
||||||
|
eeprom_busy_wait(); \
|
||||||
|
boot_rww_enable(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
|
||||||
|
Same as boot_lock_bits_set() except waits for eeprom and spm operations to
|
||||||
|
complete before setting the lock bits. */
|
||||||
|
|
||||||
|
#define boot_lock_bits_set_safe(lock_bits) \
|
||||||
|
do { \
|
||||||
|
boot_spm_busy_wait(); \
|
||||||
|
eeprom_busy_wait(); \
|
||||||
|
boot_lock_bits_set (lock_bits); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* _AVR_BOOT_H_ */
|
|
@ -0,0 +1,724 @@
|
||||||
|
/**********************************************************/
|
||||||
|
/* -Wl,-section-start=bootloader=0x1fc00 */
|
||||||
|
/* Optiboot bootloader for Arduino */
|
||||||
|
/* */
|
||||||
|
/* http://optiboot.googlecode.com */
|
||||||
|
/* */
|
||||||
|
/* Arduino-maintained version : See README.TXT */
|
||||||
|
/* http://code.google.com/p/arduino/ */
|
||||||
|
/* */
|
||||||
|
/* Heavily optimised bootloader that is faster and */
|
||||||
|
/* smaller than the Arduino standard bootloader */
|
||||||
|
/* */
|
||||||
|
/* Enhancements: */
|
||||||
|
/* Fits in 512 bytes, saving 1.5K of code space */
|
||||||
|
/* Background page erasing speeds up programming */
|
||||||
|
/* Higher baud rate speeds up programming */
|
||||||
|
/* Written almost entirely in C */
|
||||||
|
/* Customisable timeout with accurate timeconstant */
|
||||||
|
/* Optional virtual UART. No hardware UART required. */
|
||||||
|
/* Optional virtual boot partition for devices without. */
|
||||||
|
/* */
|
||||||
|
/* What you lose: */
|
||||||
|
/* Implements a skeleton STK500 protocol which is */
|
||||||
|
/* missing several features including EEPROM */
|
||||||
|
/* programming and non-page-aligned writes */
|
||||||
|
/* High baud rate breaks compatibility with standard */
|
||||||
|
/* Arduino flash settings */
|
||||||
|
/* */
|
||||||
|
/* Fully supported: */
|
||||||
|
/* ATmega168 based devices (Diecimila etc) */
|
||||||
|
/* ATmega328P based devices (Duemilanove etc) */
|
||||||
|
/* */
|
||||||
|
/* Alpha test */
|
||||||
|
/* ATmega1280 based devices (Arduino Mega) */
|
||||||
|
/* */
|
||||||
|
/* Work in progress: */
|
||||||
|
/* ATmega644P based devices (Sanguino) */
|
||||||
|
/* ATtiny84 based devices (Luminet) */
|
||||||
|
/* */
|
||||||
|
/* Does not support: */
|
||||||
|
/* USB based devices (eg. Teensy) */
|
||||||
|
/* */
|
||||||
|
/* Assumptions: */
|
||||||
|
/* The code makes several assumptions that reduce the */
|
||||||
|
/* code size. They are all true after a hardware reset, */
|
||||||
|
/* but may not be true if the bootloader is called by */
|
||||||
|
/* other means or on other hardware. */
|
||||||
|
/* No interrupts can occur */
|
||||||
|
/* UART and Timer 1 are set to their reset state */
|
||||||
|
/* SP points to RAMEND */
|
||||||
|
/* */
|
||||||
|
/* Code builds on code, libraries and optimisations from: */
|
||||||
|
/* stk500boot.c by Jason P. Kyle */
|
||||||
|
/* Arduino bootloader http://arduino.cc */
|
||||||
|
/* Spiff's 1K bootloader http://spiffie.org/know/arduino_1k_bootloader/bootloader.shtml */
|
||||||
|
/* avr-libc project http://nongnu.org/avr-libc */
|
||||||
|
/* Adaboot http://www.ladyada.net/library/arduino/bootloader.html */
|
||||||
|
/* AVR305 Atmel Application Note */
|
||||||
|
/* */
|
||||||
|
/* This program is free software; you can redistribute it */
|
||||||
|
/* and/or modify it under the terms of the GNU General */
|
||||||
|
/* Public License as published by the Free Software */
|
||||||
|
/* Foundation; either version 2 of the License, or */
|
||||||
|
/* (at your option) any later version. */
|
||||||
|
/* */
|
||||||
|
/* This program is distributed in the hope that it will */
|
||||||
|
/* be useful, but WITHOUT ANY WARRANTY; without even the */
|
||||||
|
/* implied warranty of MERCHANTABILITY or FITNESS FOR A */
|
||||||
|
/* PARTICULAR PURPOSE. See the GNU General Public */
|
||||||
|
/* License for more details. */
|
||||||
|
/* */
|
||||||
|
/* You should have received a copy of the GNU General */
|
||||||
|
/* Public License along with this program; if not, write */
|
||||||
|
/* to the Free Software Foundation, Inc., */
|
||||||
|
/* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
/* */
|
||||||
|
/* Licence can be viewed at */
|
||||||
|
/* http://www.fsf.org/licenses/gpl.txt */
|
||||||
|
/* */
|
||||||
|
/**********************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/* */
|
||||||
|
/* Optional defines: */
|
||||||
|
/* */
|
||||||
|
/**********************************************************/
|
||||||
|
/* */
|
||||||
|
/* BIG_BOOT: */
|
||||||
|
/* Build a 1k bootloader, not 512 bytes. This turns on */
|
||||||
|
/* extra functionality. */
|
||||||
|
/* */
|
||||||
|
/* BAUD_RATE: */
|
||||||
|
/* Set bootloader baud rate. */
|
||||||
|
/* */
|
||||||
|
/* LUDICROUS_SPEED: */
|
||||||
|
/* 230400 baud :-) */
|
||||||
|
/* */
|
||||||
|
/* SOFT_UART: */
|
||||||
|
/* Use AVR305 soft-UART instead of hardware UART. */
|
||||||
|
/* */
|
||||||
|
/* LED_START_FLASHES: */
|
||||||
|
/* Number of LED flashes on bootup. */
|
||||||
|
/* */
|
||||||
|
/* LED_DATA_FLASH: */
|
||||||
|
/* Flash LED when transferring data. For boards without */
|
||||||
|
/* TX or RX LEDs, or for people who like blinky lights. */
|
||||||
|
/* */
|
||||||
|
/* SUPPORT_EEPROM: */
|
||||||
|
/* Support reading and writing from EEPROM. This is not */
|
||||||
|
/* used by Arduino, so off by default. */
|
||||||
|
/* */
|
||||||
|
/* TIMEOUT_MS: */
|
||||||
|
/* Bootloader timeout period, in milliseconds. */
|
||||||
|
/* 500,1000,2000,4000,8000 supported. */
|
||||||
|
/* */
|
||||||
|
/**********************************************************/
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/* Version Numbers! */
|
||||||
|
/* */
|
||||||
|
/* Arduino Optiboot now includes this Version number in */
|
||||||
|
/* the source and object code. */
|
||||||
|
/* */
|
||||||
|
/* Version 3 was released as zip from the optiboot */
|
||||||
|
/* repository and was distributed with Arduino 0022. */
|
||||||
|
/* Version 4 starts with the arduino repository commit */
|
||||||
|
/* that brought the arduino repository up-to-date with */
|
||||||
|
/* the optiboot source tree changes since v3. */
|
||||||
|
/* */
|
||||||
|
/**********************************************************/
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/* Edit History: */
|
||||||
|
/* */
|
||||||
|
/* Jan 2012: */
|
||||||
|
/* 4.5 WestfW: fix NRWW value for m1284. */
|
||||||
|
/* 4.4 WestfW: use attribute OS_main instead of naked for */
|
||||||
|
/* main(). This allows optimizations that we */
|
||||||
|
/* count on, which are prohibited in naked */
|
||||||
|
/* functions due to PR42240. (keeps us less */
|
||||||
|
/* than 512 bytes when compiler is gcc4.5 */
|
||||||
|
/* (code from 4.3.2 remains the same.) */
|
||||||
|
/* 4.4 WestfW and Maniacbug: Add m1284 support. This */
|
||||||
|
/* does not change the 328 binary, so the */
|
||||||
|
/* version number didn't change either. (?) */
|
||||||
|
/* June 2011: */
|
||||||
|
/* 4.4 WestfW: remove automatic soft_uart detect (didn't */
|
||||||
|
/* know what it was doing or why.) Added a */
|
||||||
|
/* check of the calculated BRG value instead. */
|
||||||
|
/* Version stays 4.4; existing binaries are */
|
||||||
|
/* not changed. */
|
||||||
|
/* 4.4 WestfW: add initialization of address to keep */
|
||||||
|
/* the compiler happy. Change SC'ed targets. */
|
||||||
|
/* Return the SW version via READ PARAM */
|
||||||
|
/* 4.3 WestfW: catch framing errors in getch(), so that */
|
||||||
|
/* AVRISP works without HW kludges. */
|
||||||
|
/* http://code.google.com/p/arduino/issues/detail?id=368n*/
|
||||||
|
/* 4.2 WestfW: reduce code size, fix timeouts, change */
|
||||||
|
/* verifySpace to use WDT instead of appstart */
|
||||||
|
/* 4.1 WestfW: put version number in binary. */
|
||||||
|
/**********************************************************/
|
||||||
|
|
||||||
|
#define OPTIBOOT_MAJVER 4
|
||||||
|
#define OPTIBOOT_MINVER 5
|
||||||
|
|
||||||
|
#define MAKESTR(a) #a
|
||||||
|
#define MAKEVER(a, b) MAKESTR(a*256+b)
|
||||||
|
|
||||||
|
asm(" .section .version\n"
|
||||||
|
"optiboot_version: .word " MAKEVER(OPTIBOOT_MAJVER, OPTIBOOT_MINVER) "\n"
|
||||||
|
" .section .text\n");
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
// <avr/boot.h> uses sts instructions, but this version uses out instructions
|
||||||
|
// This saves cycles and program memory.
|
||||||
|
#include "boot.h"
|
||||||
|
|
||||||
|
|
||||||
|
// We don't use <avr/wdt.h> as those routines have interrupt overhead we don't need.
|
||||||
|
|
||||||
|
#include "pin_defs.h"
|
||||||
|
#include "stk500.h"
|
||||||
|
|
||||||
|
#ifndef LED_START_FLASHES
|
||||||
|
#define LED_START_FLASHES 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LUDICROUS_SPEED
|
||||||
|
#define BAUD_RATE 230400L
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* set the UART baud rate defaults */
|
||||||
|
#ifndef BAUD_RATE
|
||||||
|
#if F_CPU >= 8000000L
|
||||||
|
#define BAUD_RATE 115200L // Highest rate Avrdude win32 will support
|
||||||
|
#elsif F_CPU >= 1000000L
|
||||||
|
#define BAUD_RATE 9600L // 19200 also supported, but with significant error
|
||||||
|
#elsif F_CPU >= 128000L
|
||||||
|
#define BAUD_RATE 4800L // Good for 128kHz internal RC
|
||||||
|
#else
|
||||||
|
#define BAUD_RATE 1200L // Good even at 32768Hz
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Switch in soft UART for hard baud rates */
|
||||||
|
/*
|
||||||
|
* I don't understand what this was supposed to accomplish, where the
|
||||||
|
* constant "280" came from, or why automatically (and perhaps unexpectedly)
|
||||||
|
* switching to a soft uart is a good thing, so I'm undoing this in favor
|
||||||
|
* of a range check using the same calc used to config the BRG...
|
||||||
|
*/
|
||||||
|
#if (F_CPU/BAUD_RATE) > 280 // > 57600 for 16MHz
|
||||||
|
#ifndef SOFT_UART
|
||||||
|
#define SOFT_UART
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else // 0
|
||||||
|
#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 > 250
|
||||||
|
#error Unachievable baud rate (too slow) BAUD_RATE
|
||||||
|
#endif // baud rate slow check
|
||||||
|
#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 < 3
|
||||||
|
#error Unachievable baud rate (too fast) BAUD_RATE
|
||||||
|
#endif // baud rate fastn check
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Watchdog settings */
|
||||||
|
#define WATCHDOG_OFF (0)
|
||||||
|
#define WATCHDOG_16MS (_BV(WDE))
|
||||||
|
#define WATCHDOG_32MS (_BV(WDP0) | _BV(WDE))
|
||||||
|
#define WATCHDOG_64MS (_BV(WDP1) | _BV(WDE))
|
||||||
|
#define WATCHDOG_125MS (_BV(WDP1) | _BV(WDP0) | _BV(WDE))
|
||||||
|
#define WATCHDOG_250MS (_BV(WDP2) | _BV(WDE))
|
||||||
|
#define WATCHDOG_500MS (_BV(WDP2) | _BV(WDP0) | _BV(WDE))
|
||||||
|
#define WATCHDOG_1S (_BV(WDP2) | _BV(WDP1) | _BV(WDE))
|
||||||
|
#define WATCHDOG_2S (_BV(WDP2) | _BV(WDP1) | _BV(WDP0) | _BV(WDE))
|
||||||
|
#ifndef __AVR_ATmega8__
|
||||||
|
#define WATCHDOG_4S (_BV(WDP3) | _BV(WDE))
|
||||||
|
#define WATCHDOG_8S (_BV(WDP3) | _BV(WDP0) | _BV(WDE))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Function Prototypes */
|
||||||
|
/* The main function is in init9, which removes the interrupt vector table */
|
||||||
|
/* we don't need. It is also 'naked', which means the compiler does not */
|
||||||
|
/* generate any entry or exit code itself. */
|
||||||
|
int main(void) __attribute__ ((OS_main)) __attribute__ ((section (".init9")));
|
||||||
|
void putch(char);
|
||||||
|
uint8_t getch(void);
|
||||||
|
static inline void getNch(uint8_t); /* "static inline" is a compiler hint to reduce code size */
|
||||||
|
void verifySpace();
|
||||||
|
static inline void flash_led(uint8_t);
|
||||||
|
uint8_t getLen();
|
||||||
|
static inline void watchdogReset();
|
||||||
|
void watchdogConfig(uint8_t x);
|
||||||
|
#ifdef SOFT_UART
|
||||||
|
void uartDelay() __attribute__ ((naked));
|
||||||
|
#endif
|
||||||
|
void appStart() __attribute__ ((naked));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NRWW memory
|
||||||
|
* Addresses below NRWW (Non-Read-While-Write) can be programmed while
|
||||||
|
* continuing to run code from flash, slightly speeding up programming
|
||||||
|
* time. Beware that Atmel data sheets specify this as a WORD address,
|
||||||
|
* while optiboot will be comparing against a 16-bit byte address. This
|
||||||
|
* means that on a part with 128kB of memory, the upper part of the lower
|
||||||
|
* 64k will get NRWW processing as well, even though it doesn't need it.
|
||||||
|
* That's OK. In fact, you can disable the overlapping processing for
|
||||||
|
* a part entirely by setting NRWWSTART to zero. This reduces code
|
||||||
|
* space a bit, at the expense of being slightly slower, overall.
|
||||||
|
*
|
||||||
|
* RAMSTART should be self-explanatory. It's bigger on parts with a
|
||||||
|
* lot of peripheral registers.
|
||||||
|
*/
|
||||||
|
#if defined(__AVR_ATmega168__)
|
||||||
|
#define RAMSTART (0x100)
|
||||||
|
#define NRWWSTART (0x3800)
|
||||||
|
#elif defined(__AVR_ATmega328P__)
|
||||||
|
#define RAMSTART (0x100)
|
||||||
|
#define NRWWSTART (0x7000)
|
||||||
|
#elif defined (__AVR_ATmega644P__)
|
||||||
|
#define RAMSTART (0x100)
|
||||||
|
#define NRWWSTART (0xE000)
|
||||||
|
#elif defined (__AVR_ATmega1284P__)
|
||||||
|
#define RAMSTART (0x100)
|
||||||
|
#define NRWWSTART (0xE000)
|
||||||
|
#elif defined(__AVR_ATtiny84__)
|
||||||
|
#define RAMSTART (0x100)
|
||||||
|
#define NRWWSTART (0x0000)
|
||||||
|
#elif defined(__AVR_ATmega1280__)
|
||||||
|
#define RAMSTART (0x200)
|
||||||
|
#define NRWWSTART (0xE000)
|
||||||
|
#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__)
|
||||||
|
#define RAMSTART (0x100)
|
||||||
|
#define NRWWSTART (0x1800)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* C zero initialises all global variables. However, that requires */
|
||||||
|
/* These definitions are NOT zero initialised, but that doesn't matter */
|
||||||
|
/* This allows us to drop the zero init code, saving us memory */
|
||||||
|
#define buff ((uint8_t*)(RAMSTART))
|
||||||
|
#ifdef VIRTUAL_BOOT_PARTITION
|
||||||
|
#define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4))
|
||||||
|
#define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* main program starts here */
|
||||||
|
int main(void) {
|
||||||
|
uint8_t ch;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Making these local and in registers prevents the need for initializing
|
||||||
|
* them, and also saves space because code no longer stores to memory.
|
||||||
|
* (initializing address keeps the compiler happy, but isn't really
|
||||||
|
* necessary, and uses 4 bytes of flash.)
|
||||||
|
*/
|
||||||
|
register uint16_t address = 0;
|
||||||
|
register uint8_t length;
|
||||||
|
|
||||||
|
// After the zero init loop, this is the first code to run.
|
||||||
|
//
|
||||||
|
// This code makes the following assumptions:
|
||||||
|
// No interrupts will execute
|
||||||
|
// SP points to RAMEND
|
||||||
|
// r1 contains zero
|
||||||
|
//
|
||||||
|
// If not, uncomment the following instructions:
|
||||||
|
// cli();
|
||||||
|
asm volatile ("clr __zero_reg__");
|
||||||
|
#ifdef __AVR_ATmega8__
|
||||||
|
SP=RAMEND; // This is done by hardware reset
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Adaboot no-wait mod
|
||||||
|
ch = MCUSR;
|
||||||
|
MCUSR = 0;
|
||||||
|
if (!(ch & _BV(EXTRF))) appStart();
|
||||||
|
|
||||||
|
#if LED_START_FLASHES > 0
|
||||||
|
// Set up Timer 1 for timeout counter
|
||||||
|
TCCR1B = _BV(CS12) | _BV(CS10); // div 1024
|
||||||
|
#endif
|
||||||
|
#ifndef SOFT_UART
|
||||||
|
#ifdef __AVR_ATmega8__
|
||||||
|
UCSRA = _BV(U2X); //Double speed mode USART
|
||||||
|
UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx
|
||||||
|
UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1
|
||||||
|
UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
|
||||||
|
#else
|
||||||
|
UCSR0A = _BV(U2X0); //Double speed mode USART0
|
||||||
|
UCSR0B = _BV(RXEN0) | _BV(TXEN0);
|
||||||
|
UCSR0C = _BV(UCSZ00) | _BV(UCSZ01);
|
||||||
|
UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Set up watchdog to trigger after 500ms
|
||||||
|
watchdogConfig(WATCHDOG_1S);
|
||||||
|
|
||||||
|
/* Set LED pin as output */
|
||||||
|
LED_DDR |= _BV(LED);
|
||||||
|
|
||||||
|
#ifdef SOFT_UART
|
||||||
|
/* Set TX pin as output */
|
||||||
|
UART_DDR |= _BV(UART_TX_BIT);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LED_START_FLASHES > 0
|
||||||
|
/* Flash onboard LED to signal entering of bootloader */
|
||||||
|
flash_led(LED_START_FLASHES * 2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Forever loop */
|
||||||
|
for (;;) {
|
||||||
|
/* get character from UART */
|
||||||
|
ch = getch();
|
||||||
|
|
||||||
|
if(ch == STK_GET_PARAMETER) {
|
||||||
|
unsigned char which = getch();
|
||||||
|
verifySpace();
|
||||||
|
if (which == 0x82) {
|
||||||
|
/*
|
||||||
|
* Send optiboot version as "minor SW version"
|
||||||
|
*/
|
||||||
|
putch(OPTIBOOT_MINVER);
|
||||||
|
} else if (which == 0x81) {
|
||||||
|
putch(OPTIBOOT_MAJVER);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* GET PARAMETER returns a generic 0x03 reply for
|
||||||
|
* other parameters - enough to keep Avrdude happy
|
||||||
|
*/
|
||||||
|
putch(0x03);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(ch == STK_SET_DEVICE) {
|
||||||
|
// SET DEVICE is ignored
|
||||||
|
getNch(20);
|
||||||
|
}
|
||||||
|
else if(ch == STK_SET_DEVICE_EXT) {
|
||||||
|
// SET DEVICE EXT is ignored
|
||||||
|
getNch(5);
|
||||||
|
}
|
||||||
|
else if(ch == STK_LOAD_ADDRESS) {
|
||||||
|
// LOAD ADDRESS
|
||||||
|
uint16_t newAddress;
|
||||||
|
newAddress = getch();
|
||||||
|
newAddress = (newAddress & 0xff) | (getch() << 8);
|
||||||
|
#ifdef RAMPZ
|
||||||
|
// Transfer top bit to RAMPZ
|
||||||
|
RAMPZ = (newAddress & 0x8000) ? 1 : 0;
|
||||||
|
#endif
|
||||||
|
newAddress += newAddress; // Convert from word address to byte address
|
||||||
|
address = newAddress;
|
||||||
|
verifySpace();
|
||||||
|
}
|
||||||
|
else if(ch == STK_UNIVERSAL) {
|
||||||
|
// UNIVERSAL command is ignored
|
||||||
|
getNch(4);
|
||||||
|
putch(0x00);
|
||||||
|
}
|
||||||
|
/* Write memory, length is big endian and is in bytes */
|
||||||
|
else if(ch == STK_PROG_PAGE) {
|
||||||
|
// PROGRAM PAGE - we support flash programming only, not EEPROM
|
||||||
|
uint8_t *bufPtr;
|
||||||
|
uint16_t addrPtr;
|
||||||
|
|
||||||
|
getch(); /* getlen() */
|
||||||
|
length = getch();
|
||||||
|
getch();
|
||||||
|
|
||||||
|
// If we are in RWW section, immediately start page erase
|
||||||
|
if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address);
|
||||||
|
|
||||||
|
// While that is going on, read in page contents
|
||||||
|
bufPtr = buff;
|
||||||
|
do *bufPtr++ = getch();
|
||||||
|
while (--length);
|
||||||
|
|
||||||
|
// If we are in NRWW section, page erase has to be delayed until now.
|
||||||
|
// Todo: Take RAMPZ into account
|
||||||
|
if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address);
|
||||||
|
|
||||||
|
// Read command terminator, start reply
|
||||||
|
verifySpace();
|
||||||
|
|
||||||
|
// If only a partial page is to be programmed, the erase might not be complete.
|
||||||
|
// So check that here
|
||||||
|
boot_spm_busy_wait();
|
||||||
|
|
||||||
|
#ifdef VIRTUAL_BOOT_PARTITION
|
||||||
|
if ((uint16_t)(void*)address == 0) {
|
||||||
|
// This is the reset vector page. We need to live-patch the code so the
|
||||||
|
// bootloader runs.
|
||||||
|
//
|
||||||
|
// Move RESET vector to WDT vector
|
||||||
|
uint16_t vect = buff[0] | (buff[1]<<8);
|
||||||
|
rstVect = vect;
|
||||||
|
wdtVect = buff[8] | (buff[9]<<8);
|
||||||
|
vect -= 4; // Instruction is a relative jump (rjmp), so recalculate.
|
||||||
|
buff[8] = vect & 0xff;
|
||||||
|
buff[9] = vect >> 8;
|
||||||
|
|
||||||
|
// Add jump to bootloader at RESET vector
|
||||||
|
buff[0] = 0x7f;
|
||||||
|
buff[1] = 0xce; // rjmp 0x1d00 instruction
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Copy buffer into programming buffer
|
||||||
|
bufPtr = buff;
|
||||||
|
addrPtr = (uint16_t)(void*)address;
|
||||||
|
ch = SPM_PAGESIZE / 2;
|
||||||
|
do {
|
||||||
|
uint16_t a;
|
||||||
|
a = *bufPtr++;
|
||||||
|
a |= (*bufPtr++) << 8;
|
||||||
|
__boot_page_fill_short((uint16_t)(void*)addrPtr,a);
|
||||||
|
addrPtr += 2;
|
||||||
|
} while (--ch);
|
||||||
|
|
||||||
|
// Write from programming buffer
|
||||||
|
__boot_page_write_short((uint16_t)(void*)address);
|
||||||
|
boot_spm_busy_wait();
|
||||||
|
|
||||||
|
#if defined(RWWSRE)
|
||||||
|
// Reenable read access to flash
|
||||||
|
boot_rww_enable();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
/* Read memory block mode, length is big endian. */
|
||||||
|
else if(ch == STK_READ_PAGE) {
|
||||||
|
// READ PAGE - we only read flash
|
||||||
|
getch(); /* getlen() */
|
||||||
|
length = getch();
|
||||||
|
getch();
|
||||||
|
|
||||||
|
verifySpace();
|
||||||
|
#ifdef VIRTUAL_BOOT_PARTITION
|
||||||
|
do {
|
||||||
|
// Undo vector patch in bottom page so verify passes
|
||||||
|
if (address == 0) ch=rstVect & 0xff;
|
||||||
|
else if (address == 1) ch=rstVect >> 8;
|
||||||
|
else if (address == 8) ch=wdtVect & 0xff;
|
||||||
|
else if (address == 9) ch=wdtVect >> 8;
|
||||||
|
else ch = pgm_read_byte_near(address);
|
||||||
|
address++;
|
||||||
|
putch(ch);
|
||||||
|
} while (--length);
|
||||||
|
#else
|
||||||
|
#ifdef RAMPZ
|
||||||
|
// Since RAMPZ should already be set, we need to use EPLM directly.
|
||||||
|
// do putch(pgm_read_byte_near(address++));
|
||||||
|
// while (--length);
|
||||||
|
do {
|
||||||
|
uint8_t result;
|
||||||
|
__asm__ ("elpm %0,Z\n":"=r"(result):"z"(address));
|
||||||
|
putch(result);
|
||||||
|
address++;
|
||||||
|
}
|
||||||
|
while (--length);
|
||||||
|
#else
|
||||||
|
do putch(pgm_read_byte_near(address++));
|
||||||
|
while (--length);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get device signature bytes */
|
||||||
|
else if(ch == STK_READ_SIGN) {
|
||||||
|
// READ SIGN - return what Avrdude wants to hear
|
||||||
|
verifySpace();
|
||||||
|
putch(SIGNATURE_0);
|
||||||
|
putch(SIGNATURE_1);
|
||||||
|
putch(SIGNATURE_2);
|
||||||
|
}
|
||||||
|
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
|
||||||
|
// Adaboot no-wait mod
|
||||||
|
watchdogConfig(WATCHDOG_16MS);
|
||||||
|
verifySpace();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// This covers the response to commands like STK_ENTER_PROGMODE
|
||||||
|
verifySpace();
|
||||||
|
}
|
||||||
|
putch(STK_OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void putch(char ch) {
|
||||||
|
#ifndef SOFT_UART
|
||||||
|
while (!(UCSR0A & _BV(UDRE0)));
|
||||||
|
UDR0 = ch;
|
||||||
|
#else
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
" com %[ch]\n" // ones complement, carry set
|
||||||
|
" sec\n"
|
||||||
|
"1: brcc 2f\n"
|
||||||
|
" cbi %[uartPort],%[uartBit]\n"
|
||||||
|
" rjmp 3f\n"
|
||||||
|
"2: sbi %[uartPort],%[uartBit]\n"
|
||||||
|
" nop\n"
|
||||||
|
"3: rcall uartDelay\n"
|
||||||
|
" rcall uartDelay\n"
|
||||||
|
" lsr %[ch]\n"
|
||||||
|
" dec %[bitcnt]\n"
|
||||||
|
" brne 1b\n"
|
||||||
|
:
|
||||||
|
:
|
||||||
|
[bitcnt] "d" (10),
|
||||||
|
[ch] "r" (ch),
|
||||||
|
[uartPort] "I" (_SFR_IO_ADDR(UART_PORT)),
|
||||||
|
[uartBit] "I" (UART_TX_BIT)
|
||||||
|
:
|
||||||
|
"r25"
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t getch(void) {
|
||||||
|
uint8_t ch;
|
||||||
|
|
||||||
|
#ifdef LED_DATA_FLASH
|
||||||
|
#ifdef __AVR_ATmega8__
|
||||||
|
LED_PORT ^= _BV(LED);
|
||||||
|
#else
|
||||||
|
LED_PIN |= _BV(LED);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SOFT_UART
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"1: sbic %[uartPin],%[uartBit]\n" // Wait for start edge
|
||||||
|
" rjmp 1b\n"
|
||||||
|
" rcall uartDelay\n" // Get to middle of start bit
|
||||||
|
"2: rcall uartDelay\n" // Wait 1 bit period
|
||||||
|
" rcall uartDelay\n" // Wait 1 bit period
|
||||||
|
" clc\n"
|
||||||
|
" sbic %[uartPin],%[uartBit]\n"
|
||||||
|
" sec\n"
|
||||||
|
" dec %[bitCnt]\n"
|
||||||
|
" breq 3f\n"
|
||||||
|
" ror %[ch]\n"
|
||||||
|
" rjmp 2b\n"
|
||||||
|
"3:\n"
|
||||||
|
:
|
||||||
|
[ch] "=r" (ch)
|
||||||
|
:
|
||||||
|
[bitCnt] "d" (9),
|
||||||
|
[uartPin] "I" (_SFR_IO_ADDR(UART_PIN)),
|
||||||
|
[uartBit] "I" (UART_RX_BIT)
|
||||||
|
:
|
||||||
|
"r25"
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
while(!(UCSR0A & _BV(RXC0)))
|
||||||
|
;
|
||||||
|
if (!(UCSR0A & _BV(FE0))) {
|
||||||
|
/*
|
||||||
|
* A Framing Error indicates (probably) that something is talking
|
||||||
|
* to us at the wrong bit rate. Assume that this is because it
|
||||||
|
* expects to be talking to the application, and DON'T reset the
|
||||||
|
* watchdog. This should cause the bootloader to abort and run
|
||||||
|
* the application "soon", if it keeps happening. (Note that we
|
||||||
|
* don't care that an invalid char is returned...)
|
||||||
|
*/
|
||||||
|
watchdogReset();
|
||||||
|
}
|
||||||
|
|
||||||
|
ch = UDR0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LED_DATA_FLASH
|
||||||
|
#ifdef __AVR_ATmega8__
|
||||||
|
LED_PORT ^= _BV(LED);
|
||||||
|
#else
|
||||||
|
LED_PIN |= _BV(LED);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef SOFT_UART
|
||||||
|
// AVR305 equation: #define UART_B_VALUE (((F_CPU/BAUD_RATE)-23)/6)
|
||||||
|
// Adding 3 to numerator simulates nearest rounding for more accurate baud rates
|
||||||
|
#define UART_B_VALUE (((F_CPU/BAUD_RATE)-20)/6)
|
||||||
|
#if UART_B_VALUE > 255
|
||||||
|
#error Baud rate too slow for soft UART
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void uartDelay() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"ldi r25,%[count]\n"
|
||||||
|
"1:dec r25\n"
|
||||||
|
"brne 1b\n"
|
||||||
|
"ret\n"
|
||||||
|
::[count] "M" (UART_B_VALUE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void getNch(uint8_t count) {
|
||||||
|
do getch(); while (--count);
|
||||||
|
verifySpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
void verifySpace() {
|
||||||
|
if (getch() != CRC_EOP) {
|
||||||
|
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
|
||||||
|
while (1) // and busy-loop so that WD causes
|
||||||
|
; // a reset and app start.
|
||||||
|
}
|
||||||
|
putch(STK_INSYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if LED_START_FLASHES > 0
|
||||||
|
void flash_led(uint8_t count) {
|
||||||
|
do {
|
||||||
|
TCNT1 = -(F_CPU/(1024*16));
|
||||||
|
TIFR1 = _BV(TOV1);
|
||||||
|
while(!(TIFR1 & _BV(TOV1)));
|
||||||
|
#ifdef __AVR_ATmega8__
|
||||||
|
LED_PORT ^= _BV(LED);
|
||||||
|
#else
|
||||||
|
LED_PIN |= _BV(LED);
|
||||||
|
#endif
|
||||||
|
watchdogReset();
|
||||||
|
} while (--count);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Watchdog functions. These are only safe with interrupts turned off.
|
||||||
|
void watchdogReset() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"wdr\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void watchdogConfig(uint8_t x) {
|
||||||
|
WDTCSR = _BV(WDCE) | _BV(WDE);
|
||||||
|
WDTCSR = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
void appStart() {
|
||||||
|
watchdogConfig(WATCHDOG_OFF);
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
#ifdef VIRTUAL_BOOT_PARTITION
|
||||||
|
// Jump to WDT vector
|
||||||
|
"ldi r30,4\n"
|
||||||
|
"clr r31\n"
|
||||||
|
#else
|
||||||
|
// Jump to RST vector
|
||||||
|
"clr r30\n"
|
||||||
|
"clr r31\n"
|
||||||
|
#endif
|
||||||
|
"ijmp\n"
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
:020000021000EC
|
||||||
|
:10FE00000F92CDB7DEB7112484B714BE81FFDFD0C7
|
||||||
|
:10FE100082E08093C00088E18093C10086E08093F7
|
||||||
|
:10FE2000C2008AE28093C4008EE0BBD0209A00E03A
|
||||||
|
:10FE300010E0EE24E394E1E1DE2EF3E0FF2EA5D006
|
||||||
|
:10FE4000813471F4A2D08983B2D08981823809F4D7
|
||||||
|
:10FE50008BC0813811F484E001C083E08FD08BC067
|
||||||
|
:10FE6000823411F484E103C0853419F485E0A7D00D
|
||||||
|
:10FE700082C0853591F489D0A82EBB2486D0082F66
|
||||||
|
:10FE800010E0102F00270A291B29812F881F88279F
|
||||||
|
:10FE9000881F8BBF000F111F6DC0863521F484E0D1
|
||||||
|
:10FEA0008ED080E0DBCF843609F040C06ED06DD0BC
|
||||||
|
:10FEB000C82E6BD080EE0030180718F4F801F7BE9A
|
||||||
|
:10FEC000E895A12C51E0B52E60D0F50181935F013A
|
||||||
|
:10FED000CE16D1F7F0EE00301F0718F0F801F7BE8C
|
||||||
|
:10FEE000E89565D007B600FCFDCFF801A0E0B1E0D1
|
||||||
|
:10FEF0002C9130E011968C91119790E0982F8827E3
|
||||||
|
:10FF0000822B932B12960C01E7BEE89511243296B2
|
||||||
|
:10FF100082E0A030B80761F785E0F80187BFE89577
|
||||||
|
:10FF200007B600FCFDCFD7BEE89525C08437A9F4FD
|
||||||
|
:10FF30002CD02BD0B82E29D03AD0CB2C4801F401AC
|
||||||
|
:10FF400086911CD00894811C911CCA94C1F70F5F44
|
||||||
|
:10FF50001F4FBA940B0D111D0EC0853739F427D0F1
|
||||||
|
:10FF60008EE10CD087E90AD085E078CF813511F495
|
||||||
|
:10FF700088E017D01CD080E101D061CF9091C00003
|
||||||
|
:10FF800095FFFCCF8093C60008958091C00087FF45
|
||||||
|
:10FF9000FCCF8091C00084FD01C0A8958091C6006F
|
||||||
|
:10FFA0000895E0E6F0E098E1908380830895EDDF26
|
||||||
|
:10FFB000803219F088E0F5DFFFCF84E1DFCFCF9307
|
||||||
|
:10FFC000C82FE3DFC150E9F7F2DFCF91089580E059
|
||||||
|
:08FFD000E8DFEE27FF2709948A
|
||||||
|
:040000031000FE00EB
|
||||||
|
:00000001FF
|
|
@ -0,0 +1,81 @@
|
||||||
|
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__)
|
||||||
|
/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove */
|
||||||
|
#define LED_DDR DDRB
|
||||||
|
#define LED_PORT PORTB
|
||||||
|
#define LED_PIN PINB
|
||||||
|
#define LED PINB5
|
||||||
|
|
||||||
|
/* Ports for soft UART */
|
||||||
|
#ifdef SOFT_UART
|
||||||
|
#define UART_PORT PORTD
|
||||||
|
#define UART_PIN PIND
|
||||||
|
#define UART_DDR DDRD
|
||||||
|
#define UART_TX_BIT 1
|
||||||
|
#define UART_RX_BIT 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__AVR_ATmega8__)
|
||||||
|
//Name conversion R.Wiersma
|
||||||
|
#define UCSR0A UCSRA
|
||||||
|
#define UDR0 UDR
|
||||||
|
#define UDRE0 UDRE
|
||||||
|
#define RXC0 RXC
|
||||||
|
#define FE0 FE
|
||||||
|
#define TIFR1 TIFR
|
||||||
|
#define WDTCSR WDTCR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Luminet support */
|
||||||
|
#if defined(__AVR_ATtiny84__)
|
||||||
|
/* Red LED is connected to pin PA4 */
|
||||||
|
#define LED_DDR DDRA
|
||||||
|
#define LED_PORT PORTA
|
||||||
|
#define LED_PIN PINA
|
||||||
|
#define LED PINA4
|
||||||
|
/* Ports for soft UART - left port only for now. TX/RX on PA2/PA3 */
|
||||||
|
#ifdef SOFT_UART
|
||||||
|
#define UART_PORT PORTA
|
||||||
|
#define UART_PIN PINA
|
||||||
|
#define UART_DDR DDRA
|
||||||
|
#define UART_TX_BIT 2
|
||||||
|
#define UART_RX_BIT 3
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Sanguino support */
|
||||||
|
#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)
|
||||||
|
/* Onboard LED is connected to pin PB0 on Sanguino */
|
||||||
|
#define LED_DDR DDRB
|
||||||
|
#define LED_PORT PORTB
|
||||||
|
#define LED_PIN PINB
|
||||||
|
#define LED PINB0
|
||||||
|
|
||||||
|
/* Ports for soft UART */
|
||||||
|
#ifdef SOFT_UART
|
||||||
|
#define UART_PORT PORTD
|
||||||
|
#define UART_PIN PIND
|
||||||
|
#define UART_DDR DDRD
|
||||||
|
#define UART_TX_BIT 1
|
||||||
|
#define UART_RX_BIT 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Mega support */
|
||||||
|
#if defined(__AVR_ATmega1280__)
|
||||||
|
/* Onboard LED is connected to pin PB7 on Arduino Mega */
|
||||||
|
#define LED_DDR DDRB
|
||||||
|
#define LED_PORT PORTB
|
||||||
|
#define LED_PIN PINB
|
||||||
|
#define LED PINB7
|
||||||
|
|
||||||
|
/* Ports for soft UART */
|
||||||
|
#ifdef SOFT_UART
|
||||||
|
#define UART_PORT PORTE
|
||||||
|
#define UART_PIN PINE
|
||||||
|
#define UART_DDR DDRE
|
||||||
|
#define UART_TX_BIT 1
|
||||||
|
#define UART_RX_BIT 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/* STK500 constants list, from AVRDUDE */
|
||||||
|
#define STK_OK 0x10
|
||||||
|
#define STK_FAILED 0x11 // Not used
|
||||||
|
#define STK_UNKNOWN 0x12 // Not used
|
||||||
|
#define STK_NODEVICE 0x13 // Not used
|
||||||
|
#define STK_INSYNC 0x14 // ' '
|
||||||
|
#define STK_NOSYNC 0x15 // Not used
|
||||||
|
#define ADC_CHANNEL_ERROR 0x16 // Not used
|
||||||
|
#define ADC_MEASURE_OK 0x17 // Not used
|
||||||
|
#define PWM_CHANNEL_ERROR 0x18 // Not used
|
||||||
|
#define PWM_ADJUST_OK 0x19 // Not used
|
||||||
|
#define CRC_EOP 0x20 // 'SPACE'
|
||||||
|
#define STK_GET_SYNC 0x30 // '0'
|
||||||
|
#define STK_GET_SIGN_ON 0x31 // '1'
|
||||||
|
#define STK_SET_PARAMETER 0x40 // '@'
|
||||||
|
#define STK_GET_PARAMETER 0x41 // 'A'
|
||||||
|
#define STK_SET_DEVICE 0x42 // 'B'
|
||||||
|
#define STK_SET_DEVICE_EXT 0x45 // 'E'
|
||||||
|
#define STK_ENTER_PROGMODE 0x50 // 'P'
|
||||||
|
#define STK_LEAVE_PROGMODE 0x51 // 'Q'
|
||||||
|
#define STK_CHIP_ERASE 0x52 // 'R'
|
||||||
|
#define STK_CHECK_AUTOINC 0x53 // 'S'
|
||||||
|
#define STK_LOAD_ADDRESS 0x55 // 'U'
|
||||||
|
#define STK_UNIVERSAL 0x56 // 'V'
|
||||||
|
#define STK_PROG_FLASH 0x60 // '`'
|
||||||
|
#define STK_PROG_DATA 0x61 // 'a'
|
||||||
|
#define STK_PROG_FUSE 0x62 // 'b'
|
||||||
|
#define STK_PROG_LOCK 0x63 // 'c'
|
||||||
|
#define STK_PROG_PAGE 0x64 // 'd'
|
||||||
|
#define STK_PROG_FUSE_EXT 0x65 // 'e'
|
||||||
|
#define STK_READ_FLASH 0x70 // 'p'
|
||||||
|
#define STK_READ_DATA 0x71 // 'q'
|
||||||
|
#define STK_READ_FUSE 0x72 // 'r'
|
||||||
|
#define STK_READ_LOCK 0x73 // 's'
|
||||||
|
#define STK_READ_PAGE 0x74 // 't'
|
||||||
|
#define STK_READ_SIGN 0x75 // 'u'
|
||||||
|
#define STK_READ_OSCCAL 0x76 // 'v'
|
||||||
|
#define STK_READ_FUSE_EXT 0x77 // 'w'
|
||||||
|
#define STK_READ_OSCCAL_EXT 0x78 // 'x'
|
|
@ -1,135 +0,0 @@
|
||||||
/*
|
|
||||||
wiring.h - Partial implementation of the Wiring API for the ATmega8.
|
|
||||||
Part of Arduino - http://www.arduino.cc/
|
|
||||||
|
|
||||||
Copyright (c) 2005-2006 David A. Mellis
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Wiring_h
|
|
||||||
#define Wiring_h
|
|
||||||
|
|
||||||
#include <avr/io.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "binary.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define HIGH 0x1
|
|
||||||
#define LOW 0x0
|
|
||||||
|
|
||||||
#define INPUT 0x0
|
|
||||||
#define OUTPUT 0x1
|
|
||||||
|
|
||||||
#define true 0x1
|
|
||||||
#define false 0x0
|
|
||||||
|
|
||||||
#define PI 3.1415926535897932384626433832795
|
|
||||||
#define HALF_PI 1.5707963267948966192313216916398
|
|
||||||
#define TWO_PI 6.283185307179586476925286766559
|
|
||||||
#define DEG_TO_RAD 0.017453292519943295769236907684886
|
|
||||||
#define RAD_TO_DEG 57.295779513082320876798154814105
|
|
||||||
|
|
||||||
#define SERIAL 0x0
|
|
||||||
#define DISPLAY 0x1
|
|
||||||
|
|
||||||
#define LSBFIRST 0
|
|
||||||
#define MSBFIRST 1
|
|
||||||
|
|
||||||
#define CHANGE 1
|
|
||||||
#define FALLING 2
|
|
||||||
#define RISING 3
|
|
||||||
|
|
||||||
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
|
||||||
#define INTERNAL1V1 2
|
|
||||||
#define INTERNAL2V56 3
|
|
||||||
#else
|
|
||||||
#define INTERNAL 3
|
|
||||||
#endif
|
|
||||||
#define DEFAULT 1
|
|
||||||
#define EXTERNAL 0
|
|
||||||
|
|
||||||
// undefine stdlib's abs if encountered
|
|
||||||
#ifdef abs
|
|
||||||
#undef abs
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define min(a,b) ((a)<(b)?(a):(b))
|
|
||||||
#define max(a,b) ((a)>(b)?(a):(b))
|
|
||||||
#define abs(x) ((x)>0?(x):-(x))
|
|
||||||
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
|
|
||||||
#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
|
|
||||||
#define radians(deg) ((deg)*DEG_TO_RAD)
|
|
||||||
#define degrees(rad) ((rad)*RAD_TO_DEG)
|
|
||||||
#define sq(x) ((x)*(x))
|
|
||||||
|
|
||||||
#define interrupts() sei()
|
|
||||||
#define noInterrupts() cli()
|
|
||||||
|
|
||||||
#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
|
|
||||||
#define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (F_CPU / 1000L) )
|
|
||||||
#define microsecondsToClockCycles(a) ( ((a) * (F_CPU / 1000L)) / 1000L )
|
|
||||||
|
|
||||||
#define lowByte(w) ((uint8_t) ((w) & 0xff))
|
|
||||||
#define highByte(w) ((uint8_t) ((w) >> 8))
|
|
||||||
|
|
||||||
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
|
|
||||||
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
|
|
||||||
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
|
|
||||||
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
|
|
||||||
|
|
||||||
|
|
||||||
typedef unsigned int word;
|
|
||||||
|
|
||||||
#define bit(b) (1UL << (b))
|
|
||||||
|
|
||||||
typedef uint8_t boolean;
|
|
||||||
typedef uint8_t byte;
|
|
||||||
|
|
||||||
void init(void);
|
|
||||||
|
|
||||||
void pinMode(uint8_t, uint8_t);
|
|
||||||
void digitalWrite(uint8_t, uint8_t);
|
|
||||||
int digitalRead(uint8_t);
|
|
||||||
int analogRead(uint8_t);
|
|
||||||
void analogReference(uint8_t mode);
|
|
||||||
void analogWrite(uint8_t, int);
|
|
||||||
|
|
||||||
unsigned long millis(void);
|
|
||||||
unsigned long micros(void);
|
|
||||||
void delay(unsigned long);
|
|
||||||
void delayMicroseconds(unsigned int us);
|
|
||||||
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);
|
|
||||||
|
|
||||||
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
|
|
||||||
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
|
|
||||||
|
|
||||||
void attachInterrupt(uint8_t, void (*)(void), int mode);
|
|
||||||
void detachInterrupt(uint8_t);
|
|
||||||
|
|
||||||
void setup(void);
|
|
||||||
void loop(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -37,7 +37,11 @@
|
||||||
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
||||||
// location to which to write the next incoming character and rx_buffer_tail
|
// location to which to write the next incoming character and rx_buffer_tail
|
||||||
// is the index of the location from which to read.
|
// is the index of the location from which to read.
|
||||||
#define RX_BUFFER_SIZE 128
|
#if (RAMEND < 1000)
|
||||||
|
#define RX_BUFFER_SIZE 32
|
||||||
|
#else
|
||||||
|
#define RX_BUFFER_SIZE 128
|
||||||
|
#endif
|
||||||
|
|
||||||
struct ring_buffer
|
struct ring_buffer
|
||||||
{
|
{
|
||||||
|
@ -46,11 +50,22 @@ struct ring_buffer
|
||||||
int tail;
|
int tail;
|
||||||
};
|
};
|
||||||
|
|
||||||
ring_buffer rx_buffer = { { 0 }, 0, 0 };
|
#if defined(UBRRH) || defined(UBRR0H)
|
||||||
|
ring_buffer rx_buffer = { { 0 }, 0, 0 };
|
||||||
|
#endif
|
||||||
|
#if defined(UBRR1H)
|
||||||
|
ring_buffer rx_buffer1 = { { 0 }, 0, 0 };
|
||||||
|
#endif
|
||||||
|
#if defined(UBRR2H)
|
||||||
|
ring_buffer rx_buffer2 = { { 0 }, 0, 0 };
|
||||||
|
#endif
|
||||||
|
#if defined(UBRR3H)
|
||||||
|
ring_buffer rx_buffer3 = { { 0 }, 0, 0 };
|
||||||
|
#endif
|
||||||
|
|
||||||
inline void store_char(unsigned char c, ring_buffer *rx_buffer)
|
inline void store_char(unsigned char c, ring_buffer *rx_buffer)
|
||||||
{
|
{
|
||||||
int i = (unsigned int)(rx_buffer->head + 1) & (RX_BUFFER_SIZE -1);
|
int i = (unsigned int)(rx_buffer->head + 1) % RX_BUFFER_SIZE;
|
||||||
|
|
||||||
// if we should be storing the received character into the location
|
// if we should be storing the received character into the location
|
||||||
// just before the tail (meaning that the head would advance to the
|
// just before the tail (meaning that the head would advance to the
|
||||||
|
@ -62,13 +77,95 @@ inline void store_char(unsigned char c, ring_buffer *rx_buffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// fixed by Mark Sproul this is on the 644/644p
|
#if defined(USART_RX_vect)
|
||||||
//SIGNAL(SIG_USART_RECV)
|
SIGNAL(USART_RX_vect)
|
||||||
SIGNAL(USART0_RX_vect)
|
{
|
||||||
{
|
#if defined(UDR0)
|
||||||
unsigned char c = UDR0;
|
unsigned char c = UDR0;
|
||||||
store_char(c, &rx_buffer);
|
#elif defined(UDR)
|
||||||
}
|
unsigned char c = UDR; // atmega8535
|
||||||
|
#else
|
||||||
|
#error UDR not defined
|
||||||
|
#endif
|
||||||
|
store_char(c, &rx_buffer);
|
||||||
|
}
|
||||||
|
#elif defined(SIG_USART0_RECV) && defined(UDR0)
|
||||||
|
SIGNAL(SIG_USART0_RECV)
|
||||||
|
{
|
||||||
|
unsigned char c = UDR0;
|
||||||
|
store_char(c, &rx_buffer);
|
||||||
|
}
|
||||||
|
#elif defined(SIG_UART0_RECV) && defined(UDR0)
|
||||||
|
SIGNAL(SIG_UART0_RECV)
|
||||||
|
{
|
||||||
|
unsigned char c = UDR0;
|
||||||
|
store_char(c, &rx_buffer);
|
||||||
|
}
|
||||||
|
//#elif defined(SIG_USART_RECV)
|
||||||
|
#elif defined(USART0_RX_vect)
|
||||||
|
// fixed by Mark Sproul this is on the 644/644p
|
||||||
|
//SIGNAL(SIG_USART_RECV)
|
||||||
|
SIGNAL(USART0_RX_vect)
|
||||||
|
{
|
||||||
|
#if defined(UDR0)
|
||||||
|
unsigned char c = UDR0;
|
||||||
|
#elif defined(UDR)
|
||||||
|
unsigned char c = UDR; // atmega8, atmega32
|
||||||
|
#else
|
||||||
|
#error UDR not defined
|
||||||
|
#endif
|
||||||
|
store_char(c, &rx_buffer);
|
||||||
|
}
|
||||||
|
#elif defined(SIG_UART_RECV)
|
||||||
|
// this is for atmega8
|
||||||
|
SIGNAL(SIG_UART_RECV)
|
||||||
|
{
|
||||||
|
#if defined(UDR0)
|
||||||
|
unsigned char c = UDR0; // atmega645
|
||||||
|
#elif defined(UDR)
|
||||||
|
unsigned char c = UDR; // atmega8
|
||||||
|
#endif
|
||||||
|
store_char(c, &rx_buffer);
|
||||||
|
}
|
||||||
|
#elif defined(USBCON)
|
||||||
|
#warning No interrupt handler for usart 0
|
||||||
|
#warning Serial(0) is on USB interface
|
||||||
|
#else
|
||||||
|
#error No interrupt handler for usart 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#if defined(SIG_USART1_RECV)
|
||||||
|
#if defined(USART1_RX_vect)
|
||||||
|
//SIGNAL(SIG_USART1_RECV)
|
||||||
|
SIGNAL(USART1_RX_vect)
|
||||||
|
{
|
||||||
|
unsigned char c = UDR1;
|
||||||
|
store_char(c, &rx_buffer1);
|
||||||
|
}
|
||||||
|
#elif defined(SIG_USART1_RECV)
|
||||||
|
#error SIG_USART1_RECV
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(USART2_RX_vect) && defined(UDR2)
|
||||||
|
SIGNAL(USART2_RX_vect)
|
||||||
|
{
|
||||||
|
unsigned char c = UDR2;
|
||||||
|
store_char(c, &rx_buffer2);
|
||||||
|
}
|
||||||
|
#elif defined(SIG_USART2_RECV)
|
||||||
|
#error SIG_USART2_RECV
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(USART3_RX_vect) && defined(UDR3)
|
||||||
|
SIGNAL(USART3_RX_vect)
|
||||||
|
{
|
||||||
|
unsigned char c = UDR3;
|
||||||
|
store_char(c, &rx_buffer3);
|
||||||
|
}
|
||||||
|
#elif defined(SIG_USART3_RECV)
|
||||||
|
#error SIG_USART3_RECV
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors ////////////////////////////////////////////////////////////////
|
// Constructors ////////////////////////////////////////////////////////////////
|
||||||
|
@ -134,7 +231,7 @@ void HardwareSerial::end()
|
||||||
|
|
||||||
int HardwareSerial::available(void)
|
int HardwareSerial::available(void)
|
||||||
{
|
{
|
||||||
return (unsigned int)(RX_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) & (RX_BUFFER_SIZE-1);
|
return (unsigned int)(RX_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % RX_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int HardwareSerial::peek(void)
|
int HardwareSerial::peek(void)
|
||||||
|
@ -153,7 +250,7 @@ int HardwareSerial::read(void)
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
unsigned char c = _rx_buffer->buffer[_rx_buffer->tail];
|
unsigned char c = _rx_buffer->buffer[_rx_buffer->tail];
|
||||||
_rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) & (RX_BUFFER_SIZE-1);
|
_rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % RX_BUFFER_SIZE;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -181,7 +278,26 @@ void HardwareSerial::write(uint8_t c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Preinstantiate Objects //////////////////////////////////////////////////////
|
// Preinstantiate Objects //////////////////////////////////////////////////////
|
||||||
HardwareSerial Serial(&rx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0);
|
|
||||||
|
#if defined(UBRRH) && defined(UBRRL)
|
||||||
|
HardwareSerial Serial(&rx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UDR, RXEN, TXEN, RXCIE, UDRE, U2X);
|
||||||
|
#elif defined(UBRR0H) && defined(UBRR0L)
|
||||||
|
HardwareSerial Serial(&rx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0);
|
||||||
|
#elif defined(USBCON)
|
||||||
|
#warning no serial port defined (port 0)
|
||||||
|
#else
|
||||||
|
#error no serial port defined (port 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(UBRR1H)
|
||||||
|
HardwareSerial Serial1(&rx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRE1, U2X1);
|
||||||
|
#endif
|
||||||
|
#if defined(UBRR2H)
|
||||||
|
HardwareSerial Serial2(&rx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UDR2, RXEN2, TXEN2, RXCIE2, UDRE2, U2X2);
|
||||||
|
#endif
|
||||||
|
#if defined(UBRR3H)
|
||||||
|
HardwareSerial Serial3(&rx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UDR3, RXEN3, TXEN3, RXCIE3, UDRE3, U2X3);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // whole file
|
#endif // whole file
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,6 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
|
||||||
// the mode into place.
|
// the mode into place.
|
||||||
|
|
||||||
// Enable the interrupt.
|
// Enable the interrupt.
|
||||||
|
|
||||||
switch (interruptNum) {
|
switch (interruptNum) {
|
||||||
#if defined(EICRA) && defined(EICRB) && defined(EIMSK)
|
#if defined(EICRA) && defined(EICRB) && defined(EIMSK)
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -81,6 +80,19 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
|
||||||
EICRB = (EICRB & ~((1 << ISC70) | (1 << ISC71))) | (mode << ISC70);
|
EICRB = (EICRB & ~((1 << ISC70) | (1 << ISC71))) | (mode << ISC70);
|
||||||
EIMSK |= (1 << INT7);
|
EIMSK |= (1 << INT7);
|
||||||
break;
|
break;
|
||||||
|
#elif defined(EICRA) && defined(EIMSK)
|
||||||
|
case 0:
|
||||||
|
EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
|
||||||
|
EIMSK |= (1 << INT0);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
|
||||||
|
EIMSK |= (1 << INT1);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
EICRA = (EICRA & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20);
|
||||||
|
EIMSK |= (1 << INT2);
|
||||||
|
break;
|
||||||
#else
|
#else
|
||||||
case 0:
|
case 0:
|
||||||
#if defined(EICRA) && defined(ISC00) && defined(EIMSK)
|
#if defined(EICRA) && defined(ISC00) && defined(EIMSK)
|
||||||
|
@ -123,15 +135,6 @@ void detachInterrupt(uint8_t interruptNum) {
|
||||||
// ATmega8. There, INT0 is 6 and INT1 is 7.)
|
// ATmega8. There, INT0 is 6 and INT1 is 7.)
|
||||||
switch (interruptNum) {
|
switch (interruptNum) {
|
||||||
#if defined(EICRA) && defined(EICRB) && defined(EIMSK)
|
#if defined(EICRA) && defined(EICRB) && defined(EIMSK)
|
||||||
case 2:
|
|
||||||
EIMSK &= ~(1 << INT0);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
EIMSK &= ~(1 << INT1);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
EIMSK &= ~(1 << INT2);
|
|
||||||
break;
|
|
||||||
case 5:
|
case 5:
|
||||||
EIMSK &= ~(1 << INT3);
|
EIMSK &= ~(1 << INT3);
|
||||||
break;
|
break;
|
||||||
|
@ -147,6 +150,17 @@ void detachInterrupt(uint8_t interruptNum) {
|
||||||
case 7:
|
case 7:
|
||||||
EIMSK &= ~(1 << INT7);
|
EIMSK &= ~(1 << INT7);
|
||||||
break;
|
break;
|
||||||
|
#elif defined(EICRA) && defined(EIMSK)
|
||||||
|
case 0:
|
||||||
|
EIMSK &= ~(1 << INT0);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
EIMSK &= ~(1 << INT1);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
EIMSK &= ~(1 << INT2);
|
||||||
|
break;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
case 0:
|
case 0:
|
||||||
#if defined(EIMSK) && defined(INT0)
|
#if defined(EIMSK) && defined(INT0)
|
||||||
|
@ -184,8 +198,8 @@ void attachInterruptTwi(void (*userFunc)(void) ) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(EICRA) && defined(EICRB)
|
|
||||||
|
|
||||||
|
#if defined(EICRA) && defined(EICRB)
|
||||||
SIGNAL(INT0_vect) {
|
SIGNAL(INT0_vect) {
|
||||||
if(intFunc[EXTERNAL_INT_2])
|
if(intFunc[EXTERNAL_INT_2])
|
||||||
intFunc[EXTERNAL_INT_2]();
|
intFunc[EXTERNAL_INT_2]();
|
||||||
|
@ -226,6 +240,23 @@ SIGNAL(INT7_vect) {
|
||||||
intFunc[EXTERNAL_INT_7]();
|
intFunc[EXTERNAL_INT_7]();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(EICRA)
|
||||||
|
|
||||||
|
SIGNAL(INT0_vect) {
|
||||||
|
if(intFunc[EXTERNAL_INT_0])
|
||||||
|
intFunc[EXTERNAL_INT_0]();
|
||||||
|
}
|
||||||
|
|
||||||
|
SIGNAL(INT1_vect) {
|
||||||
|
if(intFunc[EXTERNAL_INT_1])
|
||||||
|
intFunc[EXTERNAL_INT_1]();
|
||||||
|
}
|
||||||
|
|
||||||
|
SIGNAL(INT2_vect) {
|
||||||
|
if(intFunc[EXTERNAL_INT_2])
|
||||||
|
intFunc[EXTERNAL_INT_2]();
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
SIGNAL(INT0_vect) {
|
SIGNAL(INT0_vect) {
|
||||||
|
|
|
@ -19,17 +19,54 @@
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||||
Boston, MA 02111-1307 USA
|
Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
$Id: pins_arduino.c 254 2007-04-20 23:17:38Z mellis $
|
Changelog
|
||||||
|
-----------
|
||||||
|
11/25/11 - ryan@ryanmsutton.com - Add pins for Sanguino 644P and 1284P
|
||||||
|
$Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include "wiring_private.h"
|
#include "wiring_private.h"
|
||||||
#include "pins_arduino.h"
|
#include "pins_arduino.h"
|
||||||
|
|
||||||
// On the Sanguino board, digital pins are also used
|
// On the Arduino board, digital pins are also used
|
||||||
// for the analog output (software PWM). Analog input
|
// for the analog output (software PWM). Analog input
|
||||||
// pins are a separate set.
|
// pins are a separate set.
|
||||||
|
|
||||||
|
// ATMEL ATMEGA8 & 168 / ARDUINO
|
||||||
|
//
|
||||||
|
// +-\/-+
|
||||||
|
// PC6 1| |28 PC5 (AI 5)
|
||||||
|
// (D 0) PD0 2| |27 PC4 (AI 4)
|
||||||
|
// (D 1) PD1 3| |26 PC3 (AI 3)
|
||||||
|
// (D 2) PD2 4| |25 PC2 (AI 2)
|
||||||
|
// PWM+ (D 3) PD3 5| |24 PC1 (AI 1)
|
||||||
|
// (D 4) PD4 6| |23 PC0 (AI 0)
|
||||||
|
// VCC 7| |22 GND
|
||||||
|
// GND 8| |21 AREF
|
||||||
|
// PB6 9| |20 AVCC
|
||||||
|
// PB7 10| |19 PB5 (D 13)
|
||||||
|
// PWM+ (D 5) PD5 11| |18 PB4 (D 12)
|
||||||
|
// PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM
|
||||||
|
// (D 7) PD7 13| |16 PB2 (D 10) PWM
|
||||||
|
// (D 8) PB0 14| |15 PB1 (D 9) PWM
|
||||||
|
// +----+
|
||||||
|
//
|
||||||
|
// (PWM+ indicates the additional PWM pins on the ATmega168.)
|
||||||
|
|
||||||
|
// ATMEL ATMEGA1280 / ARDUINO
|
||||||
|
//
|
||||||
|
// 0-7 PE0-PE7 works
|
||||||
|
// 8-13 PB0-PB5 works
|
||||||
|
// 14-21 PA0-PA7 works
|
||||||
|
// 22-29 PH0-PH7 works
|
||||||
|
// 30-35 PG5-PG0 works
|
||||||
|
// 36-43 PC7-PC0 works
|
||||||
|
// 44-51 PJ7-PJ0 works
|
||||||
|
// 52-59 PL7-PL0 works
|
||||||
|
// 60-67 PD7-PD0 works
|
||||||
|
// A0-A7 PF0-PF7
|
||||||
|
// A8-A15 PK0-PK7
|
||||||
// ATMEL ATMEGA644P / SANGUINO
|
// ATMEL ATMEGA644P / SANGUINO
|
||||||
//
|
//
|
||||||
// +---\/---+
|
// +---\/---+
|
||||||
|
@ -55,146 +92,536 @@
|
||||||
// PWM (D 14) PD6 20| |21 PD7 (D 15) PWM
|
// PWM (D 14) PD6 20| |21 PD7 (D 15) PWM
|
||||||
// +--------+
|
// +--------+
|
||||||
//
|
//
|
||||||
|
|
||||||
#define PA 1
|
#define PA 1
|
||||||
#define PB 2
|
#define PB 2
|
||||||
#define PC 3
|
#define PC 3
|
||||||
#define PD 4
|
#define PD 4
|
||||||
|
#define PE 5
|
||||||
|
#define PF 6
|
||||||
|
#define PG 7
|
||||||
|
#define PH 8
|
||||||
|
#define PJ 10
|
||||||
|
#define PK 11
|
||||||
|
#define PL 12
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
|
const uint16_t PROGMEM port_to_mode_PGM[] = {
|
||||||
|
NOT_A_PORT,
|
||||||
|
&DDRA,
|
||||||
|
&DDRB,
|
||||||
|
&DDRC,
|
||||||
|
&DDRD,
|
||||||
|
&DDRE,
|
||||||
|
&DDRF,
|
||||||
|
&DDRG,
|
||||||
|
&DDRH,
|
||||||
|
NOT_A_PORT,
|
||||||
|
&DDRJ,
|
||||||
|
&DDRK,
|
||||||
|
&DDRL,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM port_to_output_PGM[] = {
|
||||||
|
NOT_A_PORT,
|
||||||
|
&PORTA,
|
||||||
|
&PORTB,
|
||||||
|
&PORTC,
|
||||||
|
&PORTD,
|
||||||
|
&PORTE,
|
||||||
|
&PORTF,
|
||||||
|
&PORTG,
|
||||||
|
&PORTH,
|
||||||
|
NOT_A_PORT,
|
||||||
|
&PORTJ,
|
||||||
|
&PORTK,
|
||||||
|
&PORTL,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM port_to_input_PGM[] = {
|
||||||
|
NOT_A_PIN,
|
||||||
|
&PINA,
|
||||||
|
&PINB,
|
||||||
|
&PINC,
|
||||||
|
&PIND,
|
||||||
|
&PINE,
|
||||||
|
&PINF,
|
||||||
|
&PING,
|
||||||
|
&PINH,
|
||||||
|
NOT_A_PIN,
|
||||||
|
&PINJ,
|
||||||
|
&PINK,
|
||||||
|
&PINL,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
||||||
|
// PORTLIST
|
||||||
|
// -------------------------------------------
|
||||||
|
PE , // PE 0 ** 0 ** USART0_RX
|
||||||
|
PE , // PE 1 ** 1 ** USART0_TX
|
||||||
|
PE , // PE 4 ** 2 ** PWM2
|
||||||
|
PE , // PE 5 ** 3 ** PWM3
|
||||||
|
PG , // PG 5 ** 4 ** PWM4
|
||||||
|
PE , // PE 3 ** 5 ** PWM5
|
||||||
|
PH , // PH 3 ** 6 ** PWM6
|
||||||
|
PH , // PH 4 ** 7 ** PWM7
|
||||||
|
PH , // PH 5 ** 8 ** PWM8
|
||||||
|
PH , // PH 6 ** 9 ** PWM9
|
||||||
|
PB , // PB 4 ** 10 ** PWM10
|
||||||
|
PB , // PB 5 ** 11 ** PWM11
|
||||||
|
PB , // PB 6 ** 12 ** PWM12
|
||||||
|
PB , // PB 7 ** 13 ** PWM13
|
||||||
|
PJ , // PJ 1 ** 14 ** USART3_TX
|
||||||
|
PJ , // PJ 0 ** 15 ** USART3_RX
|
||||||
|
PH , // PH 1 ** 16 ** USART2_TX
|
||||||
|
PH , // PH 0 ** 17 ** USART2_RX
|
||||||
|
PD , // PD 3 ** 18 ** USART1_TX
|
||||||
|
PD , // PD 2 ** 19 ** USART1_RX
|
||||||
|
PD , // PD 1 ** 20 ** I2C_SDA
|
||||||
|
PD , // PD 0 ** 21 ** I2C_SCL
|
||||||
|
PA , // PA 0 ** 22 ** D22
|
||||||
|
PA , // PA 1 ** 23 ** D23
|
||||||
|
PA , // PA 2 ** 24 ** D24
|
||||||
|
PA , // PA 3 ** 25 ** D25
|
||||||
|
PA , // PA 4 ** 26 ** D26
|
||||||
|
PA , // PA 5 ** 27 ** D27
|
||||||
|
PA , // PA 6 ** 28 ** D28
|
||||||
|
PA , // PA 7 ** 29 ** D29
|
||||||
|
PC , // PC 7 ** 30 ** D30
|
||||||
|
PC , // PC 6 ** 31 ** D31
|
||||||
|
PC , // PC 5 ** 32 ** D32
|
||||||
|
PC , // PC 4 ** 33 ** D33
|
||||||
|
PC , // PC 3 ** 34 ** D34
|
||||||
|
PC , // PC 2 ** 35 ** D35
|
||||||
|
PC , // PC 1 ** 36 ** D36
|
||||||
|
PC , // PC 0 ** 37 ** D37
|
||||||
|
PD , // PD 7 ** 38 ** D38
|
||||||
|
PG , // PG 2 ** 39 ** D39
|
||||||
|
PG , // PG 1 ** 40 ** D40
|
||||||
|
PG , // PG 0 ** 41 ** D41
|
||||||
|
PL , // PL 7 ** 42 ** D42
|
||||||
|
PL , // PL 6 ** 43 ** D43
|
||||||
|
PL , // PL 5 ** 44 ** D44
|
||||||
|
PL , // PL 4 ** 45 ** D45
|
||||||
|
PL , // PL 3 ** 46 ** D46
|
||||||
|
PL , // PL 2 ** 47 ** D47
|
||||||
|
PL , // PL 1 ** 48 ** D48
|
||||||
|
PL , // PL 0 ** 49 ** D49
|
||||||
|
PB , // PB 3 ** 50 ** SPI_MISO
|
||||||
|
PB , // PB 2 ** 51 ** SPI_MOSI
|
||||||
|
PB , // PB 1 ** 52 ** SPI_SCK
|
||||||
|
PB , // PB 0 ** 53 ** SPI_SS
|
||||||
|
PF , // PF 0 ** 54 ** A0
|
||||||
|
PF , // PF 1 ** 55 ** A1
|
||||||
|
PF , // PF 2 ** 56 ** A2
|
||||||
|
PF , // PF 3 ** 57 ** A3
|
||||||
|
PF , // PF 4 ** 58 ** A4
|
||||||
|
PF , // PF 5 ** 59 ** A5
|
||||||
|
PF , // PF 6 ** 60 ** A6
|
||||||
|
PF , // PF 7 ** 61 ** A7
|
||||||
|
PK , // PK 0 ** 62 ** A8
|
||||||
|
PK , // PK 1 ** 63 ** A9
|
||||||
|
PK , // PK 2 ** 64 ** A10
|
||||||
|
PK , // PK 3 ** 65 ** A11
|
||||||
|
PK , // PK 4 ** 66 ** A12
|
||||||
|
PK , // PK 5 ** 67 ** A13
|
||||||
|
PK , // PK 6 ** 68 ** A14
|
||||||
|
PK , // PK 7 ** 69 ** A15
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
|
||||||
|
// PIN IN PORT
|
||||||
|
// -------------------------------------------
|
||||||
|
_BV( 0 ) , // PE 0 ** 0 ** USART0_RX
|
||||||
|
_BV( 1 ) , // PE 1 ** 1 ** USART0_TX
|
||||||
|
_BV( 4 ) , // PE 4 ** 2 ** PWM2
|
||||||
|
_BV( 5 ) , // PE 5 ** 3 ** PWM3
|
||||||
|
_BV( 5 ) , // PG 5 ** 4 ** PWM4
|
||||||
|
_BV( 3 ) , // PE 3 ** 5 ** PWM5
|
||||||
|
_BV( 3 ) , // PH 3 ** 6 ** PWM6
|
||||||
|
_BV( 4 ) , // PH 4 ** 7 ** PWM7
|
||||||
|
_BV( 5 ) , // PH 5 ** 8 ** PWM8
|
||||||
|
_BV( 6 ) , // PH 6 ** 9 ** PWM9
|
||||||
|
_BV( 4 ) , // PB 4 ** 10 ** PWM10
|
||||||
|
_BV( 5 ) , // PB 5 ** 11 ** PWM11
|
||||||
|
_BV( 6 ) , // PB 6 ** 12 ** PWM12
|
||||||
|
_BV( 7 ) , // PB 7 ** 13 ** PWM13
|
||||||
|
_BV( 1 ) , // PJ 1 ** 14 ** USART3_TX
|
||||||
|
_BV( 0 ) , // PJ 0 ** 15 ** USART3_RX
|
||||||
|
_BV( 1 ) , // PH 1 ** 16 ** USART2_TX
|
||||||
|
_BV( 0 ) , // PH 0 ** 17 ** USART2_RX
|
||||||
|
_BV( 3 ) , // PD 3 ** 18 ** USART1_TX
|
||||||
|
_BV( 2 ) , // PD 2 ** 19 ** USART1_RX
|
||||||
|
_BV( 1 ) , // PD 1 ** 20 ** I2C_SDA
|
||||||
|
_BV( 0 ) , // PD 0 ** 21 ** I2C_SCL
|
||||||
|
_BV( 0 ) , // PA 0 ** 22 ** D22
|
||||||
|
_BV( 1 ) , // PA 1 ** 23 ** D23
|
||||||
|
_BV( 2 ) , // PA 2 ** 24 ** D24
|
||||||
|
_BV( 3 ) , // PA 3 ** 25 ** D25
|
||||||
|
_BV( 4 ) , // PA 4 ** 26 ** D26
|
||||||
|
_BV( 5 ) , // PA 5 ** 27 ** D27
|
||||||
|
_BV( 6 ) , // PA 6 ** 28 ** D28
|
||||||
|
_BV( 7 ) , // PA 7 ** 29 ** D29
|
||||||
|
_BV( 7 ) , // PC 7 ** 30 ** D30
|
||||||
|
_BV( 6 ) , // PC 6 ** 31 ** D31
|
||||||
|
_BV( 5 ) , // PC 5 ** 32 ** D32
|
||||||
|
_BV( 4 ) , // PC 4 ** 33 ** D33
|
||||||
|
_BV( 3 ) , // PC 3 ** 34 ** D34
|
||||||
|
_BV( 2 ) , // PC 2 ** 35 ** D35
|
||||||
|
_BV( 1 ) , // PC 1 ** 36 ** D36
|
||||||
|
_BV( 0 ) , // PC 0 ** 37 ** D37
|
||||||
|
_BV( 7 ) , // PD 7 ** 38 ** D38
|
||||||
|
_BV( 2 ) , // PG 2 ** 39 ** D39
|
||||||
|
_BV( 1 ) , // PG 1 ** 40 ** D40
|
||||||
|
_BV( 0 ) , // PG 0 ** 41 ** D41
|
||||||
|
_BV( 7 ) , // PL 7 ** 42 ** D42
|
||||||
|
_BV( 6 ) , // PL 6 ** 43 ** D43
|
||||||
|
_BV( 5 ) , // PL 5 ** 44 ** D44
|
||||||
|
_BV( 4 ) , // PL 4 ** 45 ** D45
|
||||||
|
_BV( 3 ) , // PL 3 ** 46 ** D46
|
||||||
|
_BV( 2 ) , // PL 2 ** 47 ** D47
|
||||||
|
_BV( 1 ) , // PL 1 ** 48 ** D48
|
||||||
|
_BV( 0 ) , // PL 0 ** 49 ** D49
|
||||||
|
_BV( 3 ) , // PB 3 ** 50 ** SPI_MISO
|
||||||
|
_BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI
|
||||||
|
_BV( 1 ) , // PB 1 ** 52 ** SPI_SCK
|
||||||
|
_BV( 0 ) , // PB 0 ** 53 ** SPI_SS
|
||||||
|
_BV( 0 ) , // PF 0 ** 54 ** A0
|
||||||
|
_BV( 1 ) , // PF 1 ** 55 ** A1
|
||||||
|
_BV( 2 ) , // PF 2 ** 56 ** A2
|
||||||
|
_BV( 3 ) , // PF 3 ** 57 ** A3
|
||||||
|
_BV( 4 ) , // PF 4 ** 58 ** A4
|
||||||
|
_BV( 5 ) , // PF 5 ** 59 ** A5
|
||||||
|
_BV( 6 ) , // PF 6 ** 60 ** A6
|
||||||
|
_BV( 7 ) , // PF 7 ** 61 ** A7
|
||||||
|
_BV( 0 ) , // PK 0 ** 62 ** A8
|
||||||
|
_BV( 1 ) , // PK 1 ** 63 ** A9
|
||||||
|
_BV( 2 ) , // PK 2 ** 64 ** A10
|
||||||
|
_BV( 3 ) , // PK 3 ** 65 ** A11
|
||||||
|
_BV( 4 ) , // PK 4 ** 66 ** A12
|
||||||
|
_BV( 5 ) , // PK 5 ** 67 ** A13
|
||||||
|
_BV( 6 ) , // PK 6 ** 68 ** A14
|
||||||
|
_BV( 7 ) , // PK 7 ** 69 ** A15
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
|
||||||
|
// TIMERS
|
||||||
|
// -------------------------------------------
|
||||||
|
NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX
|
||||||
|
NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX
|
||||||
|
TIMER3B , // PE 4 ** 2 ** PWM2
|
||||||
|
TIMER3C , // PE 5 ** 3 ** PWM3
|
||||||
|
TIMER0B , // PG 5 ** 4 ** PWM4
|
||||||
|
TIMER3A , // PE 3 ** 5 ** PWM5
|
||||||
|
TIMER4A , // PH 3 ** 6 ** PWM6
|
||||||
|
TIMER4B , // PH 4 ** 7 ** PWM7
|
||||||
|
TIMER4C , // PH 5 ** 8 ** PWM8
|
||||||
|
TIMER2B , // PH 6 ** 9 ** PWM9
|
||||||
|
TIMER2A , // PB 4 ** 10 ** PWM10
|
||||||
|
TIMER1A , // PB 5 ** 11 ** PWM11
|
||||||
|
TIMER1B , // PB 6 ** 12 ** PWM12
|
||||||
|
TIMER0A , // PB 7 ** 13 ** PWM13
|
||||||
|
NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX
|
||||||
|
NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX
|
||||||
|
NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX
|
||||||
|
NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX
|
||||||
|
NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX
|
||||||
|
NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX
|
||||||
|
NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA
|
||||||
|
NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL
|
||||||
|
NOT_ON_TIMER , // PA 0 ** 22 ** D22
|
||||||
|
NOT_ON_TIMER , // PA 1 ** 23 ** D23
|
||||||
|
NOT_ON_TIMER , // PA 2 ** 24 ** D24
|
||||||
|
NOT_ON_TIMER , // PA 3 ** 25 ** D25
|
||||||
|
NOT_ON_TIMER , // PA 4 ** 26 ** D26
|
||||||
|
NOT_ON_TIMER , // PA 5 ** 27 ** D27
|
||||||
|
NOT_ON_TIMER , // PA 6 ** 28 ** D28
|
||||||
|
NOT_ON_TIMER , // PA 7 ** 29 ** D29
|
||||||
|
NOT_ON_TIMER , // PC 7 ** 30 ** D30
|
||||||
|
NOT_ON_TIMER , // PC 6 ** 31 ** D31
|
||||||
|
NOT_ON_TIMER , // PC 5 ** 32 ** D32
|
||||||
|
NOT_ON_TIMER , // PC 4 ** 33 ** D33
|
||||||
|
NOT_ON_TIMER , // PC 3 ** 34 ** D34
|
||||||
|
NOT_ON_TIMER , // PC 2 ** 35 ** D35
|
||||||
|
NOT_ON_TIMER , // PC 1 ** 36 ** D36
|
||||||
|
NOT_ON_TIMER , // PC 0 ** 37 ** D37
|
||||||
|
NOT_ON_TIMER , // PD 7 ** 38 ** D38
|
||||||
|
NOT_ON_TIMER , // PG 2 ** 39 ** D39
|
||||||
|
NOT_ON_TIMER , // PG 1 ** 40 ** D40
|
||||||
|
NOT_ON_TIMER , // PG 0 ** 41 ** D41
|
||||||
|
NOT_ON_TIMER , // PL 7 ** 42 ** D42
|
||||||
|
NOT_ON_TIMER , // PL 6 ** 43 ** D43
|
||||||
|
TIMER5C , // PL 5 ** 44 ** D44
|
||||||
|
TIMER5B , // PL 4 ** 45 ** D45
|
||||||
|
TIMER5A , // PL 3 ** 46 ** D46
|
||||||
|
NOT_ON_TIMER , // PL 2 ** 47 ** D47
|
||||||
|
NOT_ON_TIMER , // PL 1 ** 48 ** D48
|
||||||
|
NOT_ON_TIMER , // PL 0 ** 49 ** D49
|
||||||
|
NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO
|
||||||
|
NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI
|
||||||
|
NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK
|
||||||
|
NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS
|
||||||
|
NOT_ON_TIMER , // PF 0 ** 54 ** A0
|
||||||
|
NOT_ON_TIMER , // PF 1 ** 55 ** A1
|
||||||
|
NOT_ON_TIMER , // PF 2 ** 56 ** A2
|
||||||
|
NOT_ON_TIMER , // PF 3 ** 57 ** A3
|
||||||
|
NOT_ON_TIMER , // PF 4 ** 58 ** A4
|
||||||
|
NOT_ON_TIMER , // PF 5 ** 59 ** A5
|
||||||
|
NOT_ON_TIMER , // PF 6 ** 60 ** A6
|
||||||
|
NOT_ON_TIMER , // PF 7 ** 61 ** A7
|
||||||
|
NOT_ON_TIMER , // PK 0 ** 62 ** A8
|
||||||
|
NOT_ON_TIMER , // PK 1 ** 63 ** A9
|
||||||
|
NOT_ON_TIMER , // PK 2 ** 64 ** A10
|
||||||
|
NOT_ON_TIMER , // PK 3 ** 65 ** A11
|
||||||
|
NOT_ON_TIMER , // PK 4 ** 66 ** A12
|
||||||
|
NOT_ON_TIMER , // PK 5 ** 67 ** A13
|
||||||
|
NOT_ON_TIMER , // PK 6 ** 68 ** A14
|
||||||
|
NOT_ON_TIMER , // PK 7 ** 69 ** A15
|
||||||
|
};
|
||||||
|
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)
|
||||||
// these arrays map port names (e.g. port B) to the
|
// these arrays map port names (e.g. port B) to the
|
||||||
// appropriate addresses for various functions (e.g. reading
|
// appropriate addresses for various functions (e.g. reading
|
||||||
// and writing)
|
// and writing)
|
||||||
const uint8_t PROGMEM port_to_mode_PGM[] =
|
const uint16_t PROGMEM port_to_mode_PGM[] =
|
||||||
{
|
{
|
||||||
NOT_A_PORT,
|
NOT_A_PORT,
|
||||||
(uint8_t) (uint16_t) &DDRA,
|
&DDRA,
|
||||||
(uint8_t) (uint16_t) &DDRB,
|
&DDRB,
|
||||||
(uint8_t) (uint16_t) &DDRC,
|
&DDRC,
|
||||||
(uint8_t) (uint16_t) &DDRD,
|
&DDRD,
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM port_to_output_PGM[] =
|
const uint16_t PROGMEM port_to_output_PGM[] =
|
||||||
{
|
{
|
||||||
NOT_A_PORT,
|
NOT_A_PORT,
|
||||||
(uint8_t) (uint16_t) &PORTA,
|
&PORTA,
|
||||||
(uint8_t) (uint16_t) &PORTB,
|
&PORTB,
|
||||||
(uint8_t) (uint16_t) &PORTC,
|
&PORTC,
|
||||||
(uint8_t) (uint16_t) &PORTD,
|
&PORTD,
|
||||||
};
|
};
|
||||||
|
const uint16_t PROGMEM port_to_input_PGM[] =
|
||||||
const uint8_t PROGMEM port_to_input_PGM[] =
|
|
||||||
{
|
{
|
||||||
NOT_A_PORT,
|
NOT_A_PORT,
|
||||||
(uint8_t) (uint16_t) &PINA,
|
&PINA,
|
||||||
(uint8_t) (uint16_t) &PINB,
|
&PINB,
|
||||||
(uint8_t) (uint16_t) &PINC,
|
&PINC,
|
||||||
(uint8_t) (uint16_t) &PIND,
|
&PIND,
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM digital_pin_to_port_PGM[] =
|
const uint8_t PROGMEM digital_pin_to_port_PGM[] =
|
||||||
{
|
{
|
||||||
PB, /* 0 */
|
PB, /* 0 */
|
||||||
PB,
|
PB,
|
||||||
PB,
|
PB,
|
||||||
PB,
|
PB,
|
||||||
PB,
|
PB,
|
||||||
PB,
|
PB,
|
||||||
PB,
|
PB,
|
||||||
PB,
|
PB,
|
||||||
PD, /* 8 */
|
PD, /* 8 */
|
||||||
PD,
|
PD,
|
||||||
PD,
|
PD,
|
||||||
PD,
|
PD,
|
||||||
PD,
|
PD,
|
||||||
PD,
|
PD,
|
||||||
PD,
|
PD,
|
||||||
PD,
|
PD,
|
||||||
PC, /* 16 */
|
PC, /* 16 */
|
||||||
PC,
|
PC,
|
||||||
PC,
|
PC,
|
||||||
PC,
|
PC,
|
||||||
PC,
|
PC,
|
||||||
PC,
|
PC,
|
||||||
PC,
|
PC,
|
||||||
PC,
|
PC,
|
||||||
PA, /* 24 */
|
PA, /* 24 */
|
||||||
PA,
|
PA,
|
||||||
PA,
|
PA,
|
||||||
PA,
|
PA,
|
||||||
PA,
|
PA,
|
||||||
PA,
|
PA,
|
||||||
PA,
|
PA,
|
||||||
PA /* 31 */
|
PA /* 31 */
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] =
|
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] =
|
||||||
{
|
{
|
||||||
_BV(0), /* 0, port B */
|
_BV(0), /* 0, port B */
|
||||||
_BV(1),
|
_BV(1),
|
||||||
_BV(2),
|
_BV(2),
|
||||||
_BV(3),
|
_BV(3),
|
||||||
_BV(4),
|
_BV(4),
|
||||||
_BV(5),
|
_BV(5),
|
||||||
_BV(6),
|
_BV(6),
|
||||||
_BV(7),
|
_BV(7),
|
||||||
_BV(0), /* 8, port D */
|
_BV(0), /* 8, port D */
|
||||||
_BV(1),
|
_BV(1),
|
||||||
_BV(2),
|
_BV(2),
|
||||||
_BV(3),
|
_BV(3),
|
||||||
_BV(4),
|
_BV(4),
|
||||||
_BV(5),
|
_BV(5),
|
||||||
_BV(6),
|
_BV(6),
|
||||||
_BV(7),
|
_BV(7),
|
||||||
_BV(0), /* 16, port C */
|
_BV(0), /* 16, port C */
|
||||||
_BV(1),
|
_BV(1),
|
||||||
_BV(2),
|
_BV(2),
|
||||||
_BV(3),
|
_BV(3),
|
||||||
_BV(4),
|
_BV(4),
|
||||||
_BV(5),
|
_BV(5),
|
||||||
_BV(6),
|
_BV(6),
|
||||||
_BV(7),
|
_BV(7),
|
||||||
_BV(7), /* 24, port A */
|
_BV(7), /* 24, port A */
|
||||||
_BV(6),
|
_BV(6),
|
||||||
_BV(5),
|
_BV(5),
|
||||||
_BV(4),
|
_BV(4),
|
||||||
_BV(3),
|
_BV(3),
|
||||||
_BV(2),
|
_BV(2),
|
||||||
_BV(1),
|
_BV(1),
|
||||||
_BV(0)
|
_BV(0)
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM digital_pin_to_timer_PGM[] =
|
const uint8_t PROGMEM digital_pin_to_timer_PGM[] =
|
||||||
{
|
{
|
||||||
NOT_ON_TIMER, /* 0 - PB0 */
|
NOT_ON_TIMER, /* 0 - PB0 */
|
||||||
NOT_ON_TIMER, /* 1 - PB1 */
|
NOT_ON_TIMER, /* 1 - PB1 */
|
||||||
NOT_ON_TIMER, /* 2 - PB2 */
|
NOT_ON_TIMER, /* 2 - PB2 */
|
||||||
TIMER0A, /* 3 - PB3 */
|
TIMER0A, /* 3 - PB3 */
|
||||||
TIMER0B, /* 4 - PB4 */
|
TIMER0B, /* 4 - PB4 */
|
||||||
NOT_ON_TIMER, /* 5 - PB5 */
|
NOT_ON_TIMER, /* 5 - PB5 */
|
||||||
NOT_ON_TIMER, /* 6 - PB6 */
|
NOT_ON_TIMER, /* 6 - PB6 */
|
||||||
NOT_ON_TIMER, /* 7 - PB7 */
|
NOT_ON_TIMER, /* 7 - PB7 */
|
||||||
NOT_ON_TIMER, /* 8 - PD0 */
|
NOT_ON_TIMER, /* 8 - PD0 */
|
||||||
NOT_ON_TIMER, /* 9 - PD1 */
|
NOT_ON_TIMER, /* 9 - PD1 */
|
||||||
NOT_ON_TIMER, /* 10 - PD2 */
|
NOT_ON_TIMER, /* 10 - PD2 */
|
||||||
NOT_ON_TIMER, /* 11 - PD3 */
|
NOT_ON_TIMER, /* 11 - PD3 */
|
||||||
TIMER1B, /* 12 - PD4 */
|
TIMER1B, /* 12 - PD4 */
|
||||||
TIMER1A, /* 13 - PD5 */
|
TIMER1A, /* 13 - PD5 */
|
||||||
TIMER2B, /* 14 - PD6 */
|
TIMER2B, /* 14 - PD6 */
|
||||||
TIMER2A, /* 15 - PD7 */
|
TIMER2A, /* 15 - PD7 */
|
||||||
NOT_ON_TIMER, /* 16 - PC0 */
|
NOT_ON_TIMER, /* 16 - PC0 */
|
||||||
NOT_ON_TIMER, /* 17 - PC1 */
|
NOT_ON_TIMER, /* 17 - PC1 */
|
||||||
NOT_ON_TIMER, /* 18 - PC2 */
|
NOT_ON_TIMER, /* 18 - PC2 */
|
||||||
NOT_ON_TIMER, /* 19 - PC3 */
|
NOT_ON_TIMER, /* 19 - PC3 */
|
||||||
NOT_ON_TIMER, /* 20 - PC4 */
|
NOT_ON_TIMER, /* 20 - PC4 */
|
||||||
NOT_ON_TIMER, /* 21 - PC5 */
|
NOT_ON_TIMER, /* 21 - PC5 */
|
||||||
NOT_ON_TIMER, /* 22 - PC6 */
|
NOT_ON_TIMER, /* 22 - PC6 */
|
||||||
NOT_ON_TIMER, /* 23 - PC7 */
|
NOT_ON_TIMER, /* 23 - PC7 */
|
||||||
NOT_ON_TIMER, /* 24 - PA0 */
|
NOT_ON_TIMER, /* 24 - PA0 */
|
||||||
NOT_ON_TIMER, /* 25 - PA1 */
|
NOT_ON_TIMER, /* 25 - PA1 */
|
||||||
NOT_ON_TIMER, /* 26 - PA2 */
|
NOT_ON_TIMER, /* 26 - PA2 */
|
||||||
NOT_ON_TIMER, /* 27 - PA3 */
|
NOT_ON_TIMER, /* 27 - PA3 */
|
||||||
NOT_ON_TIMER, /* 28 - PA4 */
|
NOT_ON_TIMER, /* 28 - PA4 */
|
||||||
NOT_ON_TIMER, /* 29 - PA5 */
|
NOT_ON_TIMER, /* 29 - PA5 */
|
||||||
NOT_ON_TIMER, /* 30 - PA6 */
|
NOT_ON_TIMER, /* 30 - PA6 */
|
||||||
NOT_ON_TIMER /* 31 - PA7 */
|
NOT_ON_TIMER /* 31 - PA7 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
// these arrays map port names (e.g. port B) to the
|
||||||
|
// appropriate addresses for various functions (e.g. reading
|
||||||
|
// and writing)
|
||||||
|
const uint16_t PROGMEM port_to_mode_PGM[] = {
|
||||||
|
NOT_A_PORT,
|
||||||
|
NOT_A_PORT,
|
||||||
|
&DDRB,
|
||||||
|
&DDRC,
|
||||||
|
&DDRD,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM port_to_output_PGM[] = {
|
||||||
|
NOT_A_PORT,
|
||||||
|
NOT_A_PORT,
|
||||||
|
&PORTB,
|
||||||
|
&PORTC,
|
||||||
|
&PORTD,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM port_to_input_PGM[] = {
|
||||||
|
NOT_A_PORT,
|
||||||
|
NOT_A_PORT,
|
||||||
|
&PINB,
|
||||||
|
&PINC,
|
||||||
|
&PIND,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
||||||
|
PD, /* 0 */
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PB, /* 8 */
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PC, /* 14 */
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
|
||||||
|
_BV(0), /* 0, port D */
|
||||||
|
_BV(1),
|
||||||
|
_BV(2),
|
||||||
|
_BV(3),
|
||||||
|
_BV(4),
|
||||||
|
_BV(5),
|
||||||
|
_BV(6),
|
||||||
|
_BV(7),
|
||||||
|
_BV(0), /* 8, port B */
|
||||||
|
_BV(1),
|
||||||
|
_BV(2),
|
||||||
|
_BV(3),
|
||||||
|
_BV(4),
|
||||||
|
_BV(5),
|
||||||
|
_BV(0), /* 14, port C */
|
||||||
|
_BV(1),
|
||||||
|
_BV(2),
|
||||||
|
_BV(3),
|
||||||
|
_BV(4),
|
||||||
|
_BV(5),
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
|
||||||
|
NOT_ON_TIMER, /* 0 - port D */
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
// on the ATmega168, digital pin 3 has hardware pwm
|
||||||
|
#if defined(__AVR_ATmega8__)
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
#else
|
||||||
|
TIMER2B,
|
||||||
|
#endif
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
// on the ATmega168, digital pins 5 and 6 have hardware pwm
|
||||||
|
#if defined(__AVR_ATmega8__)
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
#else
|
||||||
|
TIMER0B,
|
||||||
|
TIMER0A,
|
||||||
|
#endif
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER, /* 8 - port B */
|
||||||
|
TIMER1A,
|
||||||
|
TIMER1B,
|
||||||
|
#if defined(__AVR_ATmega8__)
|
||||||
|
TIMER2,
|
||||||
|
#else
|
||||||
|
TIMER2A,
|
||||||
|
#endif
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER, /* 14 - port C */
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
|
@ -39,19 +39,43 @@
|
||||||
#define TIMER2A 6
|
#define TIMER2A 6
|
||||||
#define TIMER2B 7
|
#define TIMER2B 7
|
||||||
|
|
||||||
|
#define TIMER3A 8
|
||||||
|
#define TIMER3B 9
|
||||||
|
#define TIMER3C 10
|
||||||
|
#define TIMER4A 11
|
||||||
|
#define TIMER4B 12
|
||||||
|
#define TIMER4C 13
|
||||||
|
#define TIMER5A 14
|
||||||
|
#define TIMER5B 15
|
||||||
|
#define TIMER5C 16
|
||||||
|
|
||||||
|
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
|
const static uint8_t SS = 53;
|
||||||
|
const static uint8_t MOSI = 51;
|
||||||
|
const static uint8_t MISO = 50;
|
||||||
|
const static uint8_t SCK = 52;
|
||||||
|
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)
|
||||||
const static uint8_t SS = 4;
|
const static uint8_t SS = 4;
|
||||||
const static uint8_t MOSI = 5;
|
const static uint8_t MOSI = 5;
|
||||||
const static uint8_t MISO = 6;
|
const static uint8_t MISO = 6;
|
||||||
const static uint8_t SCK = 7;
|
const static uint8_t SCK = 7;
|
||||||
|
|
||||||
extern const uint8_t PROGMEM port_to_mode_PGM[];
|
#else
|
||||||
extern const uint8_t PROGMEM port_to_input_PGM[];
|
const static uint8_t SS = 10;
|
||||||
extern const uint8_t PROGMEM port_to_output_PGM[];
|
const static uint8_t MOSI = 11;
|
||||||
|
const static uint8_t MISO = 12;
|
||||||
|
const static uint8_t SCK = 13;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// On the ATmega1280, the addresses of some of the port registers are
|
||||||
|
// greater than 255, so we can't store them in uint8_t's.
|
||||||
|
extern const uint16_t PROGMEM port_to_mode_PGM[];
|
||||||
|
extern const uint16_t PROGMEM port_to_input_PGM[];
|
||||||
|
extern const uint16_t PROGMEM port_to_output_PGM[];
|
||||||
|
|
||||||
extern const uint8_t PROGMEM digital_pin_to_port_PGM[];
|
extern const uint8_t PROGMEM digital_pin_to_port_PGM[];
|
||||||
extern const uint8_t PROGMEM digital_pin_to_bit_PGM[];
|
// extern const uint8_t PROGMEM digital_pin_to_bit_PGM[];
|
||||||
extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[];
|
extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[];
|
||||||
|
|
||||||
extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];
|
extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];
|
||||||
|
|
||||||
// Get the bit location within the hardware port of the given virtual pin.
|
// Get the bit location within the hardware port of the given virtual pin.
|
||||||
|
@ -63,8 +87,8 @@ extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];
|
||||||
#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
|
#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
|
||||||
#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )
|
#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )
|
||||||
#define analogInPinToBit(P) (P)
|
#define analogInPinToBit(P) (P)
|
||||||
#define portOutputRegister(P) ( (volatile uint8_t *)( (uint16_t) pgm_read_byte( port_to_output_PGM + (P))) )
|
#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) )
|
||||||
#define portInputRegister(P) ( (volatile uint8_t *)( (uint16_t) pgm_read_byte( port_to_input_PGM + (P))) )
|
#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) )
|
||||||
#define portModeRegister(P) ( (volatile uint8_t *)( (uint16_t) pgm_read_byte( port_to_mode_PGM + (P))) )
|
#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) )
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#ifndef Wiring_h
|
#ifndef Wiring_h
|
||||||
#define Wiring_h
|
#define Wiring_h
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "binary.h"
|
#include "binary.h"
|
||||||
|
@ -77,7 +76,10 @@ extern "C"{
|
||||||
#define max(a,b) ((a)>(b)?(a):(b))
|
#define max(a,b) ((a)>(b)?(a):(b))
|
||||||
#define abs(x) ((x)>0?(x):-(x))
|
#define abs(x) ((x)>0?(x):-(x))
|
||||||
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
|
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
|
||||||
#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
|
|
||||||
|
// Removed to work with newer AVRLIBC
|
||||||
|
//#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
|
||||||
|
|
||||||
#define radians(deg) ((deg)*DEG_TO_RAD)
|
#define radians(deg) ((deg)*DEG_TO_RAD)
|
||||||
#define degrees(rad) ((rad)*RAD_TO_DEG)
|
#define degrees(rad) ((rad)*RAD_TO_DEG)
|
||||||
#define sq(x) ((x)*(x))
|
#define sq(x) ((x)*(x))
|
||||||
|
|
|
@ -24,10 +24,10 @@
|
||||||
|
|
||||||
#ifndef WiringPrivate_h
|
#ifndef WiringPrivate_h
|
||||||
#define WiringPrivate_h
|
#define WiringPrivate_h
|
||||||
#include <math.h>
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <util/delay.h>
|
#include <avr/delay.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
@ -55,6 +55,8 @@ extern "C"{
|
||||||
|
|
||||||
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
#define EXTERNAL_NUM_INTERRUPTS 8
|
#define EXTERNAL_NUM_INTERRUPTS 8
|
||||||
|
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)
|
||||||
|
#define EXTERNAL_NUM_INTERRUPTS 3
|
||||||
#else
|
#else
|
||||||
#define EXTERNAL_NUM_INTERRUPTS 2
|
#define EXTERNAL_NUM_INTERRUPTS 2
|
||||||
#endif
|
#endif
|
||||||
|
|
114
ArduinoAddons/Arduino_0.xx/libraries/U8glib/ChangeLog
Normal file
114
ArduinoAddons/Arduino_0.xx/libraries/U8glib/ChangeLog
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
|
||||||
|
u8glib ChangeLog
|
||||||
|
|
||||||
|
2012-01-01 v0.01 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* first beta release for Arduino IDE with simple SSD1325 support
|
||||||
|
2012-01-04 v0.02 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* support for some more display types
|
||||||
|
2012-01-07 v0.03 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* fixed some bugs, added more examples
|
||||||
|
2012-01-07 v0.04 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* single font file
|
||||||
|
2012-01-08 v0.05 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* Cleanup
|
||||||
|
* More examples
|
||||||
|
* SSD1325 graylevel support
|
||||||
|
2012-01-15 v0.06 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* LM6063 support
|
||||||
|
2012-01-17 v0.07 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* LM6063 support (update)
|
||||||
|
2012-01-19 v0.08 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* ST7920 beta device
|
||||||
|
2012-01-21 v0.09 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* ST7920 fixed (192x32)
|
||||||
|
* fixed bug in com layer if pins are none
|
||||||
|
* str reference position
|
||||||
|
2012-01-22 v0.10 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* Experimental LM6059
|
||||||
|
2012-01-24 v0.11 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* new st7920 memory layout for 128x64 lcd
|
||||||
|
* experimental st7920 SPI
|
||||||
|
2012-01-25 v0.12 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* fixed st7920 memory layout for 128x64 lcd
|
||||||
|
* ST7920 SPI performance improvement
|
||||||
|
2012-01-27 v0.13 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* LM6059 (Adafruit Display) fixed
|
||||||
|
2012-02-01 v0.14 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* undoRotation()
|
||||||
|
* setRot..() can be used without restrictions
|
||||||
|
* Class U8GLIB derived from Print class. New function "print"
|
||||||
|
* Fixed memory index bug in the page management procedures
|
||||||
|
2012-02-12 v1.00 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* XBM support
|
||||||
|
* F() macro support
|
||||||
|
* str-rotation commands support ref-height and ref-position
|
||||||
|
2012-03-17 v1.02 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* U8GLIB_ST7687_C144MVGD spi experimental
|
||||||
|
* U8GLIB_LC7981_160X80 8bit
|
||||||
|
* Intersection test for frame and box procedures
|
||||||
|
* 4L double memory architecture
|
||||||
|
* setContrast infrastructure implemented, but not available for all devices
|
||||||
|
* drawCircle, drawDisc
|
||||||
|
* Bugfix for drawStr270
|
||||||
|
* New examples: Chess (ported from dogm128 lib) and GraphicsTest
|
||||||
|
2012-03-31 v1.03 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* experimental parallel mode atmega
|
||||||
|
* more unifont code pages
|
||||||
|
* double memory, for NHD OLED and DOGXL160
|
||||||
|
* "Menu" example
|
||||||
|
* drawLine
|
||||||
|
2012-04-13 v1.04 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* Adjust U8grelease: Same version number with AVR and Arduino variant
|
||||||
|
2012-06-10 v1.05 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* m2icon font
|
||||||
|
* experimental lc7981_240x64 device
|
||||||
|
* experimental ssd1306
|
||||||
|
* experimental ssd1322
|
||||||
|
* Hardware state backup/restore procedure
|
||||||
|
2012-06-15 v1.06 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* SBN1661 (SED1520?) support
|
||||||
|
* SSD1306 support
|
||||||
|
* U8G_PROGMEM bugfix
|
||||||
|
2012-07-04 v1.07 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* Added Makefiles for AVR release (issue 77)
|
||||||
|
* Fixed examples for Arduino Environment (issue 78)
|
||||||
|
2012-10-02 v1.08 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* Improved delay calculation for strobe pulse (issue 20)
|
||||||
|
* Support Chipkit (issue 39)
|
||||||
|
* Improved speed for ST7920 parallel mode (issue 79)
|
||||||
|
* Overall speed optimization (new page intersection algorithm)
|
||||||
|
* Support for Displays Newhaven NHD-C12864, CrystalFontz GFAG20232, Seeedstudio 96x96 OLED
|
||||||
|
* Added SPI support for ST7920 with plain AVR (issue 85)
|
||||||
|
* Add more LC7981 devices
|
||||||
|
2012-12-23 v1.09 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* Support for Displaytech 64128n
|
||||||
|
* Support for MINI12864
|
||||||
|
* HW SPI for ST7920
|
||||||
|
* Add delay after sending a byte with (ST7920 com)
|
||||||
|
* Support ATTiny
|
||||||
|
* Support I2C for SSD1306
|
||||||
|
* bdf2u8g, Windows executable released
|
||||||
|
* LC7981 320x64
|
||||||
|
* Scalue up: u8g::setScale2x2
|
||||||
|
* Added more bitmap fonts
|
||||||
|
* u8g::drawRBox(), u8g::drawRFrame()
|
||||||
|
* Support for CFAG20232 (st7920_202x32)
|
||||||
|
* Fixed ST7920 SW SPI for ChipKit
|
||||||
|
* Support for tls8204
|
||||||
|
2013-02-02 v1.10 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* Support for SSD1309
|
||||||
|
* Support for NHD-C12832A1Z
|
||||||
|
* Bugfix: Fixed reset controll in parallel modes
|
||||||
|
* Bugfix: Fixed calculation of cursor position
|
||||||
|
* Bugfix: ST7920 parallel mode
|
||||||
|
2013-03-2 v1.11 Oliver Kraus <olikraus@gmail.com>
|
||||||
|
* Support for T6963
|
||||||
|
* Support for Arduino Due
|
||||||
|
* Sleep Mode
|
||||||
|
* 4x mode for ST7920
|
||||||
|
* New C++ interface for ST7920
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
21
ArduinoAddons/Arduino_0.xx/libraries/U8glib/INSTALL.TXT
Normal file
21
ArduinoAddons/Arduino_0.xx/libraries/U8glib/INSTALL.TXT
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
U8GLIB
|
||||||
|
http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
|
||||||
|
Install instructions for the Arduino environment.
|
||||||
|
|
||||||
|
1. Unzip u8glib_arduino_vX.XX.zip into the "libraries" folder
|
||||||
|
2. Start Arduino IDE
|
||||||
|
|
||||||
|
Install instructions for the Chipkit (Arduino) environment.
|
||||||
|
|
||||||
|
1. cd <mpide-... path>/libraries
|
||||||
|
2. unzip u8glib_arduino_vX.XX.zip
|
||||||
|
3. cd <mpide-... path>///hardware/pic32/libraries
|
||||||
|
4. again: u8glib_arduino_vX.XX.zip
|
||||||
|
5. Open hardware/pic32/cores/pic32/Print.h
|
||||||
|
Remove line
|
||||||
|
#define BYTE 0
|
||||||
|
from the file, use PRINT_BYTE instead of BYTE.
|
||||||
|
|
80
ArduinoAddons/Arduino_0.xx/libraries/U8glib/U8glib.cpp
Normal file
80
ArduinoAddons/Arduino_0.xx/libraries/U8glib/U8glib.cpp
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
U8glib.cpp
|
||||||
|
|
||||||
|
C++ Interface
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t U8GLIB::initSPI(u8g_dev_t *dev, uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset)
|
||||||
|
{
|
||||||
|
prepare();
|
||||||
|
return u8g_InitSPI(&u8g, dev, sck, mosi, cs, a0, reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t U8GLIB::initHWSPI(u8g_dev_t *dev, uint8_t cs, uint8_t a0, uint8_t reset)
|
||||||
|
{
|
||||||
|
prepare();
|
||||||
|
return u8g_InitHWSPI(&u8g, dev, cs, a0, reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t U8GLIB::initI2C(u8g_dev_t *dev, uint8_t options)
|
||||||
|
{
|
||||||
|
prepare();
|
||||||
|
return u8g_InitI2C(&u8g, dev, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t U8GLIB::init8Bit(u8g_dev_t *dev, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t cs2, uint8_t di, uint8_t rw, uint8_t reset)
|
||||||
|
{
|
||||||
|
prepare();
|
||||||
|
return u8g_Init8Bit(&u8g, dev, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t U8GLIB::init8BitFixedPort(u8g_dev_t *dev, uint8_t en, uint8_t cs, uint8_t di, uint8_t rw, uint8_t reset)
|
||||||
|
{
|
||||||
|
prepare();
|
||||||
|
return u8g_Init8BitFixedPort(&u8g, dev, en, cs, di, rw, reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t U8GLIB::initRW8Bit(u8g_dev_t *dev, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t cs, uint8_t a0, uint8_t wr, uint8_t rd, uint8_t reset)
|
||||||
|
{
|
||||||
|
prepare();
|
||||||
|
return u8g_InitRW8Bit(&u8g, dev, d0, d1, d2, d3, d4, d5, d6, d7, cs, a0, wr, rd, reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
826
ArduinoAddons/Arduino_0.xx/libraries/U8glib/U8glib.h
Normal file
826
ArduinoAddons/Arduino_0.xx/libraries/U8glib/U8glib.h
Normal file
|
@ -0,0 +1,826 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
U8glib.h
|
||||||
|
|
||||||
|
C++ Interface
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CPP_U8GLIB
|
||||||
|
#define _CPP_U8GLIB
|
||||||
|
|
||||||
|
#include <Print.h>
|
||||||
|
#include "utility/u8g.h"
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB : public Print
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
u8g_t u8g;
|
||||||
|
u8g_uint_t tx, ty; // current position for the Print base class procedures
|
||||||
|
uint8_t is_begin;
|
||||||
|
|
||||||
|
void prepare(void) { tx = 0; ty = 0; is_begin = 0; }
|
||||||
|
void cbegin(void) { if ( is_begin == 0 ) { is_begin = 1; u8g_Begin(&u8g); } }
|
||||||
|
uint8_t initSPI(u8g_dev_t *dev, uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE);
|
||||||
|
uint8_t initHWSPI(u8g_dev_t *dev, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE);
|
||||||
|
uint8_t initI2C(u8g_dev_t *dev, uint8_t options);
|
||||||
|
protected:
|
||||||
|
uint8_t init8BitFixedPort(u8g_dev_t *dev, uint8_t en, uint8_t cs, uint8_t di, uint8_t rw, uint8_t reset);
|
||||||
|
private:
|
||||||
|
uint8_t init8Bit(u8g_dev_t *dev, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t cs2, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE);
|
||||||
|
uint8_t initRW8Bit(u8g_dev_t *dev, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t cs, uint8_t a0, uint8_t wr, uint8_t rd, uint8_t reset);
|
||||||
|
public:
|
||||||
|
|
||||||
|
/* constructor */
|
||||||
|
U8GLIB(void)
|
||||||
|
{ }
|
||||||
|
U8GLIB(u8g_dev_t *dev)
|
||||||
|
{ prepare(); u8g_Init(&u8g, dev); }
|
||||||
|
U8GLIB(u8g_dev_t *dev, uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset)
|
||||||
|
{ initSPI(dev, sck, mosi, cs, a0, reset); }
|
||||||
|
U8GLIB(u8g_dev_t *dev, uint8_t cs, uint8_t a0, uint8_t reset)
|
||||||
|
{ initHWSPI(dev, cs, a0, reset); }
|
||||||
|
U8GLIB(u8g_dev_t *dev, uint8_t options)
|
||||||
|
{ initI2C(dev, options); }
|
||||||
|
U8GLIB(u8g_dev_t *dev, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t cs2, uint8_t di, uint8_t rw, uint8_t reset)
|
||||||
|
{ init8Bit(dev, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset); }
|
||||||
|
U8GLIB(u8g_dev_t *dev, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t cs, uint8_t a0, uint8_t wr, uint8_t rd, uint8_t reset)
|
||||||
|
{ initRW8Bit(dev, d0, d1, d2, d3, d4, d5, d6, d7, cs, a0, wr, rd, reset); }
|
||||||
|
|
||||||
|
uint8_t begin(void) { is_begin = 1; return u8g_Begin(&u8g); }
|
||||||
|
|
||||||
|
void setPrintPos(u8g_uint_t x, u8g_uint_t y) { tx = x; ty = y; }
|
||||||
|
u8g_t *getU8g(void) { return &u8g; }
|
||||||
|
|
||||||
|
|
||||||
|
/* implementation of the write interface to the print class */
|
||||||
|
#if defined(ARDUINO) && ARDUINO >= 100
|
||||||
|
size_t write(uint8_t c) { tx += u8g_DrawGlyph(&u8g, tx, ty, c); return 1;}
|
||||||
|
#else
|
||||||
|
void write(uint8_t c) { tx += u8g_DrawGlyph(&u8g, tx, ty, c); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* screen rotation */
|
||||||
|
void undoRotation(void) { u8g_UndoRotation(&u8g); }
|
||||||
|
void setRot90(void) { u8g_SetRot90(&u8g); }
|
||||||
|
void setRot180(void) { u8g_SetRot180(&u8g); }
|
||||||
|
void setRot270(void) { u8g_SetRot270(&u8g); }
|
||||||
|
|
||||||
|
/* screen scaling */
|
||||||
|
void undoScale(void) { u8g_UndoScale(&u8g); }
|
||||||
|
void setScale2x2(void) { u8g_SetScale2x2(&u8g); }
|
||||||
|
|
||||||
|
/* picture loop */
|
||||||
|
void firstPage(void) { cbegin(); u8g_FirstPage(&u8g); }
|
||||||
|
uint8_t nextPage(void) { return u8g_NextPage(&u8g); }
|
||||||
|
|
||||||
|
/* system commands */
|
||||||
|
uint8_t setContrast(uint8_t contrast) { cbegin(); return u8g_SetContrast(&u8g, contrast); }
|
||||||
|
void sleepOn(void) { u8g_SleepOn(&u8g); }
|
||||||
|
void sleepOff(void) { u8g_SleepOff(&u8g); }
|
||||||
|
|
||||||
|
/* graphic primitives */
|
||||||
|
void setColorIndex(uint8_t color_index) { u8g_SetColorIndex(&u8g, color_index); }
|
||||||
|
uint8_t getColorIndex(void) { return u8g_GetColorIndex(&u8g); }
|
||||||
|
|
||||||
|
void setDefaultForegroundColor(void) { u8g_SetDefaultForegroundColor(&u8g); }
|
||||||
|
void setDefaultBackgroundColor(void) { u8g_SetDefaultBackgroundColor(&u8g); }
|
||||||
|
void setDefaultMidColor(void) { u8g_SetDefaultMidColor(&u8g); }
|
||||||
|
|
||||||
|
u8g_uint_t getWidth(void) { return u8g_GetWidth(&u8g); }
|
||||||
|
u8g_uint_t getHeight(void) { return u8g_GetHeight(&u8g); }
|
||||||
|
uint8_t getMode(void) { return u8g_GetMode(&u8g); }
|
||||||
|
|
||||||
|
void drawPixel(u8g_uint_t x, u8g_uint_t y) { return u8g_DrawPixel(&u8g, x, y); }
|
||||||
|
void drawHLine(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w) { u8g_DrawHLine(&u8g, x, y, w); }
|
||||||
|
void drawVLine(u8g_uint_t x, u8g_uint_t y, u8g_uint_t h) { u8g_DrawVLine(&u8g, x, y, h); }
|
||||||
|
void drawLine(u8g_uint_t x1, u8g_uint_t y1, u8g_uint_t x2, u8g_uint_t y2) { u8g_DrawLine(&u8g, x1, y1, x2, y2); }
|
||||||
|
|
||||||
|
void drawFrame(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h) { u8g_DrawFrame(&u8g, x, y, w, h); }
|
||||||
|
void drawRFrame(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, u8g_uint_t r) { u8g_DrawRFrame(&u8g, x, y, w, h,r); }
|
||||||
|
void drawBox(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h) { u8g_DrawBox(&u8g, x, y, w, h); }
|
||||||
|
void drawRBox(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, u8g_uint_t r) { u8g_DrawRBox(&u8g, x, y, w, h,r); }
|
||||||
|
|
||||||
|
void drawCircle(u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t opt = U8G_DRAW_ALL) { u8g_DrawCircle(&u8g, x0, y0, rad, opt); }
|
||||||
|
void drawDisc(u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t opt = U8G_DRAW_ALL) { u8g_DrawDisc(&u8g, x0, y0, rad, opt); }
|
||||||
|
|
||||||
|
/* bitmap handling */
|
||||||
|
void drawBitmap(u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, u8g_uint_t h, const uint8_t *bitmap)
|
||||||
|
{ u8g_DrawBitmap(&u8g, x, y, cnt, h, bitmap); }
|
||||||
|
void drawBitmapP(u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, u8g_uint_t h, const u8g_pgm_uint8_t *bitmap)
|
||||||
|
{ u8g_DrawBitmapP(&u8g, x, y, cnt, h, bitmap); }
|
||||||
|
|
||||||
|
void drawXBM(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, const uint8_t *bitmap)
|
||||||
|
{ u8g_DrawXBM(&u8g, x, y, w, h, bitmap); }
|
||||||
|
void drawXBMP(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, const u8g_pgm_uint8_t *bitmap)
|
||||||
|
{ u8g_DrawXBMP(&u8g, x, y, w, h, bitmap); }
|
||||||
|
|
||||||
|
|
||||||
|
/* font handling */
|
||||||
|
void setFont(const u8g_fntpgm_uint8_t *font) {u8g_SetFont(&u8g, font); }
|
||||||
|
int8_t getFontAscent(void) { return u8g_GetFontAscent(&u8g); }
|
||||||
|
int8_t getFontDescent(void) { return u8g_GetFontDescent(&u8g); }
|
||||||
|
int8_t getFontLineSpacing(void) { return u8g_GetFontLineSpacing(&u8g); }
|
||||||
|
|
||||||
|
u8g_uint_t drawStr(u8g_uint_t x, u8g_uint_t y, const char *s) { return u8g_DrawStr(&u8g, x, y, s); }
|
||||||
|
u8g_uint_t drawStr90(u8g_uint_t x, u8g_uint_t y, const char *s) { return u8g_DrawStr90(&u8g, x, y, s); }
|
||||||
|
u8g_uint_t drawStr180(u8g_uint_t x, u8g_uint_t y, const char *s) { return u8g_DrawStr180(&u8g, x, y, s); }
|
||||||
|
u8g_uint_t drawStr270(u8g_uint_t x, u8g_uint_t y, const char *s) { return u8g_DrawStr270(&u8g, x, y, s); }
|
||||||
|
u8g_uint_t drawStrP(u8g_uint_t x, u8g_uint_t y, const u8g_pgm_uint8_t *s) { return u8g_DrawStrP(&u8g, x, y, s); }
|
||||||
|
u8g_uint_t drawStr90P(u8g_uint_t x, u8g_uint_t y, const u8g_pgm_uint8_t *s) { return u8g_DrawStr90P(&u8g, x, y, s); }
|
||||||
|
u8g_uint_t drawStr180P(u8g_uint_t x, u8g_uint_t y, const u8g_pgm_uint8_t *s) { return u8g_DrawStr180P(&u8g, x, y, s); }
|
||||||
|
u8g_uint_t drawStr270P(u8g_uint_t x, u8g_uint_t y, const u8g_pgm_uint8_t *s) { return u8g_DrawStr270P(&u8g, x, y, s); }
|
||||||
|
|
||||||
|
void setFontPosBaseline(void) { u8g_SetFontPosBaseline(&u8g); }
|
||||||
|
void setFontPosBottom(void) { u8g_SetFontPosBottom(&u8g); }
|
||||||
|
void setFontPosCenter(void) { u8g_SetFontPosCenter(&u8g); }
|
||||||
|
void setFontPosTop(void) { u8g_SetFontPosTop(&u8g); }
|
||||||
|
|
||||||
|
void setFontRefHeightText(void) { u8g_SetFontRefHeightText(&u8g); }
|
||||||
|
void setFontRefHeightExtendedText(void) { u8g_SetFontRefHeightExtendedText(&u8g); }
|
||||||
|
void setFontRefHeightAll(void) { u8g_SetFontRefHeightAll(&u8g); }
|
||||||
|
void setFontLineSpacingFactor(uint8_t factor) { u8g_SetFontLineSpacingFactor(&u8g, factor); }
|
||||||
|
|
||||||
|
|
||||||
|
u8g_uint_t getStrPixelWidth(const char *s) { return u8g_GetStrPixelWidth(&u8g, s); }
|
||||||
|
u8g_uint_t getStrPixelWidthP(u8g_pgm_uint8_t *s) { return u8g_GetStrPixelWidthP(&u8g, s); }
|
||||||
|
u8g_uint_t getStrWidth(const char *s) { return u8g_GetStrWidth(&u8g, s); }
|
||||||
|
u8g_uint_t getStrWidthP(u8g_pgm_uint8_t *s) { return u8g_GetStrWidthP(&u8g, s); }
|
||||||
|
|
||||||
|
void setHardwareBackup(u8g_state_cb backup_cb) { u8g_SetHardwareBackup(&u8g, backup_cb); }
|
||||||
|
|
||||||
|
#if defined(ARDUINO) && ARDUINO >= 100
|
||||||
|
// support for the F() macro
|
||||||
|
|
||||||
|
u8g_uint_t drawStr(u8g_uint_t x, u8g_uint_t y, const __FlashStringHelper *s) { return u8g_DrawStrP(&u8g, x, y, (u8g_pgm_uint8_t *)s); }
|
||||||
|
u8g_uint_t drawStr90(u8g_uint_t x, u8g_uint_t y, const __FlashStringHelper *s) { return u8g_DrawStr90P(&u8g, x, y, (u8g_pgm_uint8_t *)s); }
|
||||||
|
u8g_uint_t drawStr180(u8g_uint_t x, u8g_uint_t y, const __FlashStringHelper *s) { return u8g_DrawStr180P(&u8g, x, y, (u8g_pgm_uint8_t *)s); }
|
||||||
|
u8g_uint_t drawStr270(u8g_uint_t x, u8g_uint_t y, const __FlashStringHelper *s) { return u8g_DrawStr270P(&u8g, x, y, (u8g_pgm_uint8_t *)s); }
|
||||||
|
|
||||||
|
u8g_uint_t getStrPixelWidth(const __FlashStringHelper *s) { return u8g_GetStrPixelWidthP(&u8g, (u8g_pgm_uint8_t *)s); }
|
||||||
|
u8g_uint_t getStrWidth(const __FlashStringHelper *s) { return u8g_GetStrWidthP(&u8g, (u8g_pgm_uint8_t *)s); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* cursor handling */
|
||||||
|
void setCursorFont(const u8g_pgm_uint8_t *cursor_font) { u8g_SetCursorFont(&u8g, cursor_font); }
|
||||||
|
void setCursorStyle(uint8_t encoding) { u8g_SetCursorStyle(&u8g, encoding); }
|
||||||
|
void setCursorPos(u8g_uint_t cursor_x, u8g_uint_t cursor_y) { u8g_SetCursorPos(&u8g, cursor_x, cursor_y); }
|
||||||
|
void setCursorColor(uint8_t fg, uint8_t bg) { u8g_SetCursorColor(&u8g, fg, bg); }
|
||||||
|
void enableCursor(void) { u8g_EnableCursor(&u8g); }
|
||||||
|
void disableCursor(void) { u8g_DisableCursor(&u8g); }
|
||||||
|
void drawCursor(void) { u8g_DrawCursor(&u8g); }
|
||||||
|
|
||||||
|
/* virtual screen */
|
||||||
|
|
||||||
|
void setVirtualScreenDimension(u8g_uint_t width, u8g_uint_t height) { u8g_SetVirtualScreenDimension(&u8g, width, height); }
|
||||||
|
uint8_t addToVirtualScreen(u8g_uint_t x, u8g_uint_t y, U8GLIB &child_u8g) { return u8g_AddToVirtualScreen(&u8g, x, y, &child_u8g.u8g); }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB_DOGS102 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_DOGS102(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1701_dogs102_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_DOGS102(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1701_dogs102_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_MINI12864 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_MINI12864(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1701_mini12864_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_MINI12864(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1701_mini12864_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_DOGM132 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_DOGM132(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_dogm132_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_DOGM132(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_dogm132_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_NHD_C12832 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_NHD_C12832(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_nhd_c12832_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD_C12832(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_nhd_c12832_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD_C12832(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_nhd_c12832_parallel, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, U8G_PIN_NONE, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_DOGM128 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_DOGM128(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_dogm128_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_DOGM128(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_dogm128_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_LM6059 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_LM6059(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_lm6059_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_LM6059(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_lm6059_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_LM6063 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_LM6063(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_lm6063_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_LM6063(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_lm6063_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_64128N : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_64128N(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_64128n_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_64128N(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_64128n_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_NHD_C12864 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_NHD_C12864(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_nhd_c12864_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD_C12864(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7565_nhd_c12864_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB_ST7920_128X64 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_ST7920_128X64(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_128x64_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_128X64(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_128x64_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_128X64(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t cs2, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_128x64_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
// U8GLIB_ST7920_128X64(uint8_t cs)
|
||||||
|
// : U8GLIB(&u8g_dev_st7920_128x64_sw_spi, cs, U8G_PIN_NONE, U8G_PIN_NONE)
|
||||||
|
// { }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_ST7920_128X64_1X : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_ST7920_128X64_1X(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_128x64_sw_spi, sck, mosi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_128X64_1X(uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_128x64_hw_spi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_128X64_1X(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_128x64_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, U8G_PIN_NONE, U8G_PIN_NONE, di, rw, reset) // cs1 = cs2 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_ST7920_128X64_4X : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_ST7920_128X64_4X(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_128x64_4x_sw_spi, sck, mosi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_128X64_4X(uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_128x64_4x_hw_spi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_128X64_4X(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_128x64_4x_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, U8G_PIN_NONE, U8G_PIN_NONE, di, rw, reset) // cs1 = cs2 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB_ST7920_192X32 : public U8GLIB // OBSOLETE, use U8GLIB_ST7920_192X32_1X instead
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_ST7920_192X32(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_192x32_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_192X32(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_192x32_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_192X32(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t cs2, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_192x32_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_ST7920_192X32_1X : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_ST7920_192X32_1X(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_192x32_sw_spi, sck, mosi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_192X32_1X(uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_192x32_hw_spi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_192X32_1X(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_192x32_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, U8G_PIN_NONE, U8G_PIN_NONE, di, rw, reset) // cs1 = cs2 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_ST7920_192X32_4X : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_ST7920_192X32_4X(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_192x32_4x_sw_spi, sck, mosi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_192X32_4X(uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_192x32_4x_hw_spi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_192X32_4X(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_192x32_4x_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, U8G_PIN_NONE, U8G_PIN_NONE, di, rw, reset) // cs1 = cs2 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB_ST7920_202X32 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_ST7920_202X32(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_202x32_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_202X32(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_202x32_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_202X32(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t cs2, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_202x32_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_ST7920_202X32_1X : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_ST7920_202X32_1X(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_202x32_sw_spi, sck, mosi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_202X32_1X(uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_202x32_hw_spi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_202X32_1X(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_202x32_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, U8G_PIN_NONE, U8G_PIN_NONE, di, rw, reset) // cs1 = cs2 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_ST7920_202X32_4X : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_ST7920_202X32_4X(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_202x32_4x_sw_spi, sck, mosi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_202X32_4X(uint8_t cs, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_202x32_4x_hw_spi, cs, U8G_PIN_NONE, reset) // a0 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7920_202X32_4X(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7920_202x32_4x_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, U8G_PIN_NONE, U8G_PIN_NONE, di, rw, reset) // cs1 = cs2 = U8G_PIN_NONE
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB_LC7981_160X80 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_LC7981_160X80(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_lc7981_160x80_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, U8G_PIN_NONE, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_LC7981_240X64 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_LC7981_240X64(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_lc7981_240x64_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, U8G_PIN_NONE, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_LC7981_240X128 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_LC7981_240X128(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_lc7981_240x128_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, U8G_PIN_NONE, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
// 16 bit mode required: Remove comment from "#define U8G_16BIT 1" in utility/u8g.h
|
||||||
|
class U8GLIB_LC7981_320X64 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_LC7981_320X64(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_lc7981_320x64_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, U8G_PIN_NONE, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB_DOGXL160_BW : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_DOGXL160_BW(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1610_dogxl160_bw_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_DOGXL160_BW(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1610_dogxl160_bw_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_DOGXL160_GR : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_DOGXL160_GR(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1610_dogxl160_gr_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_DOGXL160_GR(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1610_dogxl160_gr_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_DOGXL160_2X_BW : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_DOGXL160_2X_BW(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1610_dogxl160_2x_bw_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_DOGXL160_2X_BW(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1610_dogxl160_2x_bw_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_DOGXL160_2X_GR : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_DOGXL160_2X_GR(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1610_dogxl160_2x_gr_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_DOGXL160_2X_GR(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_uc1610_dogxl160_2x_gr_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB_NHD27OLED_BW : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_NHD27OLED_BW(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1325_nhd27oled_bw_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD27OLED_BW(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1325_nhd27oled_bw_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD27OLED_BW(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t cs, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1325_nhd27oled_bw_parallel, d0, d1, d2, d3, d4, d5, d6, d7, U8G_PIN_NONE, cs, U8G_PIN_NONE, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_NHD27OLED_2X_BW : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_NHD27OLED_2X_BW(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1325_nhd27oled_2x_bw_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD27OLED_2X_BW(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1325_nhd27oled_2x_bw_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD27OLED_2X_BW(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t cs, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1325_nhd27oled_2x_bw_parallel, d0, d1, d2, d3, d4, d5, d6, d7, U8G_PIN_NONE, cs, U8G_PIN_NONE, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_NHD31OLED_BW : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_NHD31OLED_BW(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1322_nhd31oled_bw_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD31OLED_BW(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1322_nhd31oled_bw_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_NHD31OLED_2X_BW : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_NHD31OLED_2X_BW(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1322_nhd31oled_2x_bw_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD31OLED_2X_BW(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1322_nhd31oled_2x_bw_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_NHD31OLED_GR : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_NHD31OLED_GR(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1322_nhd31oled_gr_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD31OLED_GR(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1322_nhd31oled_gr_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_NHD31OLED_2X_GR : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_NHD31OLED_2X_GR(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1322_nhd31oled_2x_gr_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD31OLED_2X_GR(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1322_nhd31oled_2x_gr_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB_SSD1306_128X64 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_SSD1306_128X64(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1306_128x64_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_SSD1306_128X64(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1306_128x64_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_SSD1306_128X64(uint8_t options = U8G_I2C_OPT_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1306_128x64_i2c, options)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_SSD1309_128X64 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_SSD1309_128X64(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1309_128x64_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_SSD1309_128X64(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1309_128x64_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_SSD1309_128X64(uint8_t options = U8G_I2C_OPT_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1309_128x64_i2c, options)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_SSD1306_128X32 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_SSD1306_128X32(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1306_128x32_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_SSD1306_128X32(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1306_128x32_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_SSD1306_128X32(uint8_t options = U8G_I2C_OPT_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1306_128x32_i2c, options)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB_NHD27OLED_GR : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_NHD27OLED_GR(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1325_nhd27oled_gr_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD27OLED_GR(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1325_nhd27oled_gr_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_NHD27OLED_2X_GR : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_NHD27OLED_2X_GR(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1325_nhd27oled_2x_gr_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_NHD27OLED_2X_GR(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1325_nhd27oled_2x_gr_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_SSD1327_96X96_GR : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_SSD1327_96X96_GR(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1327_96x96_gr_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_SSD1327_96X96_GR(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1327_96x96_gr_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_SSD1327_96X96_GR(uint8_t options = U8G_I2C_OPT_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1327_96x96_gr_i2c, options)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_SSD1327_96X96_2X_GR : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_SSD1327_96X96_2X_GR(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1327_96x96_2x_gr_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_SSD1327_96X96_2X_GR(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1327_96x96_2x_gr_hw_spi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_SSD1327_96X96_2X_GR(uint8_t options = U8G_I2C_OPT_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ssd1327_96x96_2x_gr_i2c, options)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_PCF8812 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_PCF8812(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_pcf8812_96x65_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_PCD8544 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_PCD8544(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_pcd8544_84x48_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_TLS8204_84X48 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_TLS8204_84X48(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_tls8204_84x48_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_KS0108_128 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_KS0108_128(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t cs2, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ks0108_128x64_fast, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_SBN1661_122X32 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_SBN1661_122X32(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t cs1, uint8_t cs2, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_sbn1661_122x32, d0, d1, d2, d3, d4, d5, d6, d7, U8G_PIN_NONE, cs1, cs2, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_T6963_240X128 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_T6963_240X128(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t cs, uint8_t a0, uint8_t wr, uint8_t rd, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_t6963_240x128_8bit, d0, d1, d2, d3, d4, d5, d6, d7, cs, a0, wr, rd, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_T6963_240X64 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_T6963_240X64(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t cs, uint8_t a0, uint8_t wr, uint8_t rd, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_t6963_240x64_8bit, d0, d1, d2, d3, d4, d5, d6, d7, cs, a0, wr, rd, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_T6963_128X64 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_T6963_128X64(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t cs, uint8_t a0, uint8_t wr, uint8_t rd, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_t6963_128x64_8bit, d0, d1, d2, d3, d4, d5, d6, d7, cs, a0, wr, rd, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class U8GLIB_ST7687_C144MVGD: public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_ST7687_C144MVGD(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_st7687_c144mvgd_sw_spi, sck, mosi, cs, a0, reset)
|
||||||
|
{ }
|
||||||
|
U8GLIB_ST7687_C144MVGD(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs, uint8_t a0, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ks0108_128x64_fast, d0, d1, d2, d3, d4, d5, d6, d7, en, cs, U8G_PIN_NONE, a0, rw, reset)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_ILI9325D_320x240 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/*
|
||||||
|
U8GLIB_ILI9325D_320x240(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
|
||||||
|
uint8_t en, uint8_t cs1, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
: U8GLIB(&u8g_dev_ili9325d_320x240_8bit, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, U8G_PIN_NONE, di, rw, reset)
|
||||||
|
{ }
|
||||||
|
*/
|
||||||
|
U8GLIB_ILI9325D_320x240( uint8_t en, uint8_t cs1, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE)
|
||||||
|
{ init8BitFixedPort(&u8g_dev_ili9325d_320x240_8bit, en, cs1, di, rw, reset); }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_FLIPDISC_2X7 : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_FLIPDISC_2X7(void) : U8GLIB(&u8g_dev_flipdisc_2x7)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
class U8GLIB_VS : public U8GLIB
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
U8GLIB_VS(void) : U8GLIB(&u8g_dev_vs)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _CPP_U8GLIB */
|
|
@ -0,0 +1,130 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Bitmap.pde
|
||||||
|
|
||||||
|
Show simple bitmap
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
const uint8_t rook_bitmap[] PROGMEM = {
|
||||||
|
0x00, // 00000000
|
||||||
|
0x55, // 01010101
|
||||||
|
0x7f, // 01111111
|
||||||
|
0x3e, // 00111110
|
||||||
|
0x3e, // 00111110
|
||||||
|
0x3e, // 00111110
|
||||||
|
0x3e, // 00111110
|
||||||
|
0x7f // 01111111
|
||||||
|
};
|
||||||
|
|
||||||
|
void draw(void) {
|
||||||
|
// graphic commands to redraw the complete screen should be placed here
|
||||||
|
u8g.drawBitmapP( 0, 0, 1, 8, rook_bitmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
// picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
// rebuild the picture after some delay
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,180 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Chess.pde
|
||||||
|
|
||||||
|
Little Rook Chess
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
|
||||||
|
// DOGS102 shield configuration values
|
||||||
|
uint8_t uiKeyPrev = 2;
|
||||||
|
uint8_t uiKeyNext = 4;
|
||||||
|
uint8_t uiKeySelect = 5;
|
||||||
|
uint8_t uiKeyBack = 3;
|
||||||
|
|
||||||
|
// DOGM128-Shield configuration values
|
||||||
|
// DOGXL60-Shield configuration values
|
||||||
|
//uint8_t uiKeyPrev = 7;
|
||||||
|
//uint8_t uiKeyNext = 3;
|
||||||
|
//uint8_t uiKeySelect = 2;
|
||||||
|
//uint8_t uiKeyBack = 8;
|
||||||
|
|
||||||
|
uint8_t uiKeyCodeFirst = CHESS_KEY_NONE;
|
||||||
|
uint8_t uiKeyCodeSecond = CHESS_KEY_NONE;
|
||||||
|
uint8_t uiKeyCode = CHESS_KEY_NONE;
|
||||||
|
|
||||||
|
|
||||||
|
void uiSetup(void) {
|
||||||
|
// configure input keys
|
||||||
|
|
||||||
|
pinMode(uiKeyPrev, INPUT); // set pin to input
|
||||||
|
digitalWrite(uiKeyPrev, HIGH); // turn on pullup resistors
|
||||||
|
pinMode(uiKeyNext, INPUT); // set pin to input
|
||||||
|
digitalWrite(uiKeyNext, HIGH); // turn on pullup resistors
|
||||||
|
pinMode(uiKeySelect, INPUT); // set pin to input
|
||||||
|
digitalWrite(uiKeySelect, HIGH); // turn on pullup resistors
|
||||||
|
pinMode(uiKeyBack, INPUT); // set pin to input
|
||||||
|
digitalWrite(uiKeyBack, HIGH); // turn on pullup resistors
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiStep(void)
|
||||||
|
{
|
||||||
|
uiKeyCodeSecond = uiKeyCodeFirst;
|
||||||
|
if ( digitalRead(uiKeyPrev) == LOW )
|
||||||
|
uiKeyCodeFirst = CHESS_KEY_PREV;
|
||||||
|
else if ( digitalRead(uiKeyNext) == LOW )
|
||||||
|
uiKeyCodeFirst = CHESS_KEY_NEXT;
|
||||||
|
else if ( digitalRead(uiKeySelect) == LOW )
|
||||||
|
uiKeyCodeFirst = CHESS_KEY_SELECT;
|
||||||
|
else if ( digitalRead(uiKeyBack) == LOW )
|
||||||
|
uiKeyCodeFirst = CHESS_KEY_BACK;
|
||||||
|
else
|
||||||
|
uiKeyCodeFirst = CHESS_KEY_NONE;
|
||||||
|
|
||||||
|
if ( uiKeyCodeSecond == uiKeyCodeFirst )
|
||||||
|
uiKeyCode = uiKeyCodeFirst;
|
||||||
|
else
|
||||||
|
uiKeyCode = CHESS_KEY_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// rotate screen, if required
|
||||||
|
u8g.setRot180();
|
||||||
|
|
||||||
|
uiSetup();
|
||||||
|
chess_Init(u8g.getU8g(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
uint8_t keyCode = CHESS_KEY_NONE;
|
||||||
|
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
chess_Draw();
|
||||||
|
uiStep();
|
||||||
|
if ( uiKeyCode != CHESS_KEY_NONE )
|
||||||
|
keyCode = uiKeyCode;
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
u8g_Delay(10);
|
||||||
|
chess_Step(keyCode);
|
||||||
|
uiStep();
|
||||||
|
keyCode = uiKeyCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,230 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Console.pde
|
||||||
|
|
||||||
|
Read from serial monitor, output to display
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
|
||||||
|
// setup input buffer
|
||||||
|
#define LINE_MAX 30
|
||||||
|
uint8_t line_buf[LINE_MAX] = "U8GLIB Console";
|
||||||
|
uint8_t line_pos = 0;
|
||||||
|
|
||||||
|
// setup a text screen to support scrolling
|
||||||
|
#define ROW_MAX 12
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t screen[ROW_MAX][LINE_MAX];
|
||||||
|
uint8_t rows, cols;
|
||||||
|
|
||||||
|
// line height, which matches the selected font (5x7)
|
||||||
|
#define LINE_PIXEL_HEIGHT 7
|
||||||
|
|
||||||
|
// clear entire screen, called during setup
|
||||||
|
void clear_screen(void) {
|
||||||
|
uint8_t i, j;
|
||||||
|
for( i = 0; i < ROW_MAX; i++ )
|
||||||
|
for( j = 0; j < LINE_MAX; j++ )
|
||||||
|
screen[i][j] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// append a line to the screen, scroll up
|
||||||
|
void add_line_to_screen(void) {
|
||||||
|
uint8_t i, j;
|
||||||
|
for( j = 0; j < LINE_MAX; j++ )
|
||||||
|
for( i = 0; i < rows-1; i++ )
|
||||||
|
screen[i][j] = screen[i+1][j];
|
||||||
|
|
||||||
|
for( j = 0; j < LINE_MAX; j++ )
|
||||||
|
screen[rows-1][j] = line_buf[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
// U8GLIB draw procedure: output the screen
|
||||||
|
void draw(void) {
|
||||||
|
uint8_t i, y;
|
||||||
|
// graphic commands to redraw the complete screen are placed here
|
||||||
|
y = 0; // reference is the top left -1 position of the string
|
||||||
|
y--; // correct the -1 position of the drawStr
|
||||||
|
for( i = 0; i < rows; i++ )
|
||||||
|
{
|
||||||
|
u8g.drawStr( 0, y, (char *)(screen[i]));
|
||||||
|
y += u8g.getFontLineSpacing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void exec_line(void) {
|
||||||
|
// echo line to the serial monitor
|
||||||
|
Serial.println((const char *)line_buf);
|
||||||
|
|
||||||
|
// add the line to the screen
|
||||||
|
add_line_to_screen();
|
||||||
|
|
||||||
|
// U8GLIB picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear current input buffer
|
||||||
|
void reset_line(void) {
|
||||||
|
line_pos = 0;
|
||||||
|
line_buf[line_pos] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// add a single character to the input buffer
|
||||||
|
void char_to_line(uint8_t c) {
|
||||||
|
line_buf[line_pos] = c;
|
||||||
|
line_pos++;
|
||||||
|
line_buf[line_pos] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// check serial in and handle the character
|
||||||
|
void read_line(void) {
|
||||||
|
if ( Serial.available() )
|
||||||
|
{
|
||||||
|
uint8_t c;
|
||||||
|
c = Serial.read();
|
||||||
|
if ( line_pos >= cols-1 ) {
|
||||||
|
exec_line();
|
||||||
|
reset_line();
|
||||||
|
char_to_line(c);
|
||||||
|
}
|
||||||
|
else if ( c == '\n' ) {
|
||||||
|
// ignore '\n'
|
||||||
|
}
|
||||||
|
else if ( c == '\r' ) {
|
||||||
|
exec_line();
|
||||||
|
reset_line();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
char_to_line(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Arduino master setup
|
||||||
|
void setup(void) {
|
||||||
|
// set font for the console window
|
||||||
|
u8g.setFont(u8g_font_5x7);
|
||||||
|
//u8g.setFont(u8g_font_9x15);
|
||||||
|
|
||||||
|
// set upper left position for the string draw procedure
|
||||||
|
u8g.setFontPosTop();
|
||||||
|
|
||||||
|
// calculate the number of rows for the display
|
||||||
|
rows = u8g.getHeight() / u8g.getFontLineSpacing();
|
||||||
|
if ( rows > ROW_MAX )
|
||||||
|
rows = ROW_MAX;
|
||||||
|
|
||||||
|
// estimate the number of columns for the display
|
||||||
|
cols = u8g.getWidth() / u8g.getStrWidth("m");
|
||||||
|
if ( cols > LINE_MAX-1 )
|
||||||
|
cols = LINE_MAX-1;
|
||||||
|
|
||||||
|
clear_screen(); // clear screen
|
||||||
|
delay(1000); // do some delay
|
||||||
|
Serial.begin(9600); // init serial
|
||||||
|
exec_line(); // place the input buffer into the screen
|
||||||
|
reset_line(); // clear input buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
// Arduino main loop
|
||||||
|
void loop(void) {
|
||||||
|
read_line();
|
||||||
|
}
|
||||||
|
|
139
ArduinoAddons/Arduino_0.xx/libraries/U8glib/examples/F/F.pde
Normal file
139
ArduinoAddons/Arduino_0.xx/libraries/U8glib/examples/F/F.pde
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
F.pde
|
||||||
|
|
||||||
|
Example code for the F() macro.
|
||||||
|
|
||||||
|
>>> This example requires Arduino 1.0 and above.
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
void draw(void) {
|
||||||
|
// graphic commands to redraw the complete screen should be placed here
|
||||||
|
|
||||||
|
// assign default font
|
||||||
|
u8g.setFont(u8g_font_unifont);
|
||||||
|
|
||||||
|
// pointer to strings in flash memory can be stored in a special type
|
||||||
|
const __FlashStringHelper *flash_ptr;
|
||||||
|
|
||||||
|
// the result of the F() macro can be assigned to this pointer
|
||||||
|
flash_ptr = F("Hello World!");
|
||||||
|
|
||||||
|
// this pointer can be used as argument to the draw procedures
|
||||||
|
u8g.drawStr( 0+1, 20+1, flash_ptr);
|
||||||
|
u8g.drawStr( 0, 20, flash_ptr);
|
||||||
|
|
||||||
|
// of course, the F() macro can be used directly
|
||||||
|
u8g.drawStr( 0, 40, F("PROGMEM"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
// flip screen, if required
|
||||||
|
// u8g.setRot180();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
// picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
// rebuild the picture after some delay
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,223 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
GraphicsTest.pde
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
void u8g_prepare(void) {
|
||||||
|
u8g.setFont(u8g_font_6x10);
|
||||||
|
u8g.setFontRefHeightExtendedText();
|
||||||
|
u8g.setDefaultForegroundColor();
|
||||||
|
u8g.setFontPosTop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_box_frame(uint8_t a) {
|
||||||
|
u8g.drawStr( 0, 0, "drawBox");
|
||||||
|
u8g.drawBox(5,10,20,10);
|
||||||
|
u8g.drawBox(10+a,15,30,7);
|
||||||
|
u8g.drawStr( 0, 30, "drawFrame");
|
||||||
|
u8g.drawFrame(5,10+30,20,10);
|
||||||
|
u8g.drawFrame(10+a,15+30,30,7);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_disc_circle(uint8_t a) {
|
||||||
|
u8g.drawStr( 0, 0, "drawDisc");
|
||||||
|
u8g.drawDisc(10,18,9);
|
||||||
|
u8g.drawDisc(24+a,16,7);
|
||||||
|
u8g.drawStr( 0, 30, "drawCircle");
|
||||||
|
u8g.drawCircle(10,18+30,9);
|
||||||
|
u8g.drawCircle(24+a,16+30,7);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_r_frame(uint8_t a) {
|
||||||
|
u8g.drawStr( 0, 0, "drawRFrame/Box");
|
||||||
|
u8g.drawRFrame(5, 10,40,30, a+1);
|
||||||
|
u8g.drawRBox(50, 10,25,40, a+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_string(uint8_t a) {
|
||||||
|
u8g.drawStr(30+a,31, " 0");
|
||||||
|
u8g.drawStr90(30,31+a, " 90");
|
||||||
|
u8g.drawStr180(30-a,31, " 180");
|
||||||
|
u8g.drawStr270(30,31-a, " 270");
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_line(uint8_t a) {
|
||||||
|
u8g.drawStr( 0, 0, "drawLine");
|
||||||
|
u8g.drawLine(7+a, 10, 40, 55);
|
||||||
|
u8g.drawLine(7+a*2, 10, 60, 55);
|
||||||
|
u8g.drawLine(7+a*3, 10, 80, 55);
|
||||||
|
u8g.drawLine(7+a*4, 10, 100, 55);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_ascii_1() {
|
||||||
|
char s[2] = " ";
|
||||||
|
uint8_t x, y;
|
||||||
|
u8g.drawStr( 0, 0, "ASCII page 1");
|
||||||
|
for( y = 0; y < 6; y++ ) {
|
||||||
|
for( x = 0; x < 16; x++ ) {
|
||||||
|
s[0] = y*16 + x + 32;
|
||||||
|
u8g.drawStr(x*7, y*10+10, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_ascii_2() {
|
||||||
|
char s[2] = " ";
|
||||||
|
uint8_t x, y;
|
||||||
|
u8g.drawStr( 0, 0, "ASCII page 2");
|
||||||
|
for( y = 0; y < 6; y++ ) {
|
||||||
|
for( x = 0; x < 16; x++ ) {
|
||||||
|
s[0] = y*16 + x + 160;
|
||||||
|
u8g.drawStr(x*7, y*10+10, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t draw_state = 0;
|
||||||
|
|
||||||
|
void draw(void) {
|
||||||
|
u8g_prepare();
|
||||||
|
switch(draw_state >> 3) {
|
||||||
|
case 0: u8g_box_frame(draw_state&7); break;
|
||||||
|
case 1: u8g_disc_circle(draw_state&7); break;
|
||||||
|
case 2: u8g_r_frame(draw_state&7); break;
|
||||||
|
case 3: u8g_string(draw_state&7); break;
|
||||||
|
case 4: u8g_line(draw_state&7); break;
|
||||||
|
case 5: u8g_ascii_1(); break;
|
||||||
|
case 6: u8g_ascii_2(); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
|
||||||
|
// flip screen, if required
|
||||||
|
//u8g.setRot180();
|
||||||
|
|
||||||
|
// assign default color value
|
||||||
|
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
|
||||||
|
u8g.setColorIndex(255); // white
|
||||||
|
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
|
||||||
|
u8g.setColorIndex(3); // max intensity
|
||||||
|
else if ( u8g.getMode() == U8G_MODE_BW )
|
||||||
|
u8g.setColorIndex(1); // pixel on
|
||||||
|
|
||||||
|
//u8g.setContrast(0x30);
|
||||||
|
|
||||||
|
pinMode(13, OUTPUT);
|
||||||
|
digitalWrite(13, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
|
||||||
|
// picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
// increase the state
|
||||||
|
draw_state++;
|
||||||
|
if ( draw_state >= 7*8 )
|
||||||
|
draw_state = 0;
|
||||||
|
|
||||||
|
// rebuild the picture after some delay
|
||||||
|
delay(150);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
HelloWorld.pde
|
||||||
|
|
||||||
|
"Hello World!" example code.
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
|
||||||
|
void draw(void) {
|
||||||
|
// graphic commands to redraw the complete screen should be placed here
|
||||||
|
u8g.setFont(u8g_font_unifont);
|
||||||
|
//u8g.setFont(u8g_font_osb21);
|
||||||
|
u8g.drawStr( 0, 22, "Hello World!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
|
||||||
|
// flip screen, if required
|
||||||
|
// u8g.setRot180();
|
||||||
|
|
||||||
|
// set SPI backup if required
|
||||||
|
//u8g.setHardwareBackup(u8g_backup_avr_spi);
|
||||||
|
|
||||||
|
// assign default color value
|
||||||
|
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
|
||||||
|
u8g.setColorIndex(255); // white
|
||||||
|
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
|
||||||
|
u8g.setColorIndex(3); // max intensity
|
||||||
|
else if ( u8g.getMode() == U8G_MODE_BW )
|
||||||
|
u8g.setColorIndex(1); // pixel on
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
// picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
// rebuild the picture after some delay
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,234 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Menu.pde
|
||||||
|
|
||||||
|
Simple Menu Selection
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
|
||||||
|
#define KEY_NONE 0
|
||||||
|
#define KEY_PREV 1
|
||||||
|
#define KEY_NEXT 2
|
||||||
|
#define KEY_SELECT 3
|
||||||
|
#define KEY_BACK 4
|
||||||
|
|
||||||
|
// DOGS102 shield configuration values
|
||||||
|
//uint8_t uiKeyPrev = 2;
|
||||||
|
//uint8_t uiKeyNext = 4;
|
||||||
|
//uint8_t uiKeySelect = 5;
|
||||||
|
//uint8_t uiKeyBack = 3;
|
||||||
|
|
||||||
|
// DOGM128-Shield configuration values
|
||||||
|
// DOGXL60-Shield configuration values
|
||||||
|
uint8_t uiKeyPrev = 7;
|
||||||
|
uint8_t uiKeyNext = 3;
|
||||||
|
uint8_t uiKeySelect = 2;
|
||||||
|
uint8_t uiKeyBack = 8;
|
||||||
|
|
||||||
|
uint8_t uiKeyCodeFirst = KEY_NONE;
|
||||||
|
uint8_t uiKeyCodeSecond = KEY_NONE;
|
||||||
|
uint8_t uiKeyCode = KEY_NONE;
|
||||||
|
|
||||||
|
|
||||||
|
void uiSetup(void) {
|
||||||
|
// configure input keys
|
||||||
|
|
||||||
|
pinMode(uiKeyPrev, INPUT); // set pin to input
|
||||||
|
digitalWrite(uiKeyPrev, HIGH); // turn on pullup resistors
|
||||||
|
pinMode(uiKeyNext, INPUT); // set pin to input
|
||||||
|
digitalWrite(uiKeyNext, HIGH); // turn on pullup resistors
|
||||||
|
pinMode(uiKeySelect, INPUT); // set pin to input
|
||||||
|
digitalWrite(uiKeySelect, HIGH); // turn on pullup resistors
|
||||||
|
pinMode(uiKeyBack, INPUT); // set pin to input
|
||||||
|
digitalWrite(uiKeyBack, HIGH); // turn on pullup resistors
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiStep(void) {
|
||||||
|
uiKeyCodeSecond = uiKeyCodeFirst;
|
||||||
|
if ( digitalRead(uiKeyPrev) == LOW )
|
||||||
|
uiKeyCodeFirst = KEY_PREV;
|
||||||
|
else if ( digitalRead(uiKeyNext) == LOW )
|
||||||
|
uiKeyCodeFirst = KEY_NEXT;
|
||||||
|
else if ( digitalRead(uiKeySelect) == LOW )
|
||||||
|
uiKeyCodeFirst = KEY_SELECT;
|
||||||
|
else if ( digitalRead(uiKeyBack) == LOW )
|
||||||
|
uiKeyCodeFirst = KEY_BACK;
|
||||||
|
else
|
||||||
|
uiKeyCodeFirst = KEY_NONE;
|
||||||
|
|
||||||
|
if ( uiKeyCodeSecond == uiKeyCodeFirst )
|
||||||
|
uiKeyCode = uiKeyCodeFirst;
|
||||||
|
else
|
||||||
|
uiKeyCode = KEY_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define MENU_ITEMS 4
|
||||||
|
char *menu_strings[MENU_ITEMS] = { "First Line", "Second Item", "3333333", "abcdefg" };
|
||||||
|
|
||||||
|
uint8_t menu_current = 0;
|
||||||
|
uint8_t menu_redraw_required = 0;
|
||||||
|
uint8_t last_key_code = KEY_NONE;
|
||||||
|
|
||||||
|
|
||||||
|
void drawMenu(void) {
|
||||||
|
uint8_t i, h;
|
||||||
|
u8g_uint_t w, d;
|
||||||
|
|
||||||
|
u8g.setFont(u8g_font_6x13);
|
||||||
|
u8g.setFontRefHeightText();
|
||||||
|
u8g.setFontPosTop();
|
||||||
|
|
||||||
|
h = u8g.getFontAscent()-u8g.getFontDescent();
|
||||||
|
w = u8g.getWidth();
|
||||||
|
for( i = 0; i < MENU_ITEMS; i++ ) {
|
||||||
|
d = (w-u8g.getStrWidth(menu_strings[i]))/2;
|
||||||
|
u8g.setDefaultForegroundColor();
|
||||||
|
if ( i == menu_current ) {
|
||||||
|
u8g.drawBox(0, i*h+1, w, h);
|
||||||
|
u8g.setDefaultBackgroundColor();
|
||||||
|
}
|
||||||
|
u8g.drawStr(d, i*h, menu_strings[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateMenu(void) {
|
||||||
|
if ( uiKeyCode != KEY_NONE && last_key_code == uiKeyCode ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
last_key_code = uiKeyCode;
|
||||||
|
|
||||||
|
switch ( uiKeyCode ) {
|
||||||
|
case KEY_NEXT:
|
||||||
|
menu_current++;
|
||||||
|
if ( menu_current >= MENU_ITEMS )
|
||||||
|
menu_current = 0;
|
||||||
|
menu_redraw_required = 1;
|
||||||
|
break;
|
||||||
|
case KEY_PREV:
|
||||||
|
if ( menu_current == 0 )
|
||||||
|
menu_current = MENU_ITEMS;
|
||||||
|
menu_current--;
|
||||||
|
menu_redraw_required = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// rotate screen, if required
|
||||||
|
// u8g.setRot180();
|
||||||
|
|
||||||
|
uiSetup(); // setup key detection and debounce algorithm
|
||||||
|
menu_redraw_required = 1; // force initial redraw
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
uiStep(); // check for key press
|
||||||
|
|
||||||
|
if ( menu_redraw_required != 0 ) {
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
drawMenu();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
menu_redraw_required = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateMenu(); // update menu bar
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
PrintTest.pde
|
||||||
|
|
||||||
|
How to use the base class "Print"
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
void draw(void) {
|
||||||
|
// graphic commands to redraw the complete screen should be placed here
|
||||||
|
u8g.setFont(u8g_font_unifont);
|
||||||
|
u8g.setPrintPos(0, 20);
|
||||||
|
// call procedure from base class, http://arduino.cc/en/Serial/Print
|
||||||
|
u8g.print("Hello World!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
// flip screen, if required
|
||||||
|
// u8g.setRot180();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
// picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
// rebuild the picture after some delay
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,152 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
HelloWorld.pde
|
||||||
|
|
||||||
|
"Hello World!" example code.
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
uint8_t offset = 0;
|
||||||
|
|
||||||
|
void draw(void) {
|
||||||
|
// graphic commands to redraw the complete screen should be placed here
|
||||||
|
u8g.setFont(u8g_font_unifont);
|
||||||
|
u8g.drawStr( 0+0, 20+0, "Hello!");
|
||||||
|
u8g.drawStr( 0+2, 20+16, "Hello!");
|
||||||
|
|
||||||
|
u8g.drawBox(0, 0, 3, 3);
|
||||||
|
u8g.drawBox(u8g.getWidth()-6, 0, 6, 6);
|
||||||
|
u8g.drawBox(u8g.getWidth()-9, u8g.getHeight()-9, 9, 9);
|
||||||
|
u8g.drawBox(0, u8g.getHeight()-12, 12, 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void rotate(void) {
|
||||||
|
static uint8_t dir = 0;
|
||||||
|
static unsigned long next_rotation = 0;
|
||||||
|
|
||||||
|
if ( next_rotation < millis() )
|
||||||
|
{
|
||||||
|
switch(dir) {
|
||||||
|
case 0: u8g.undoRotation(); break;
|
||||||
|
case 1: u8g.setRot90(); break;
|
||||||
|
case 2: u8g.setRot180(); break;
|
||||||
|
case 3: u8g.setRot270(); offset = ( offset + 1 ) & 0x0f; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir++;
|
||||||
|
dir &= 3;
|
||||||
|
next_rotation = millis();
|
||||||
|
next_rotation += 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
// screen rotation
|
||||||
|
rotate();
|
||||||
|
|
||||||
|
// picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
// rebuild the picture after some delay
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,141 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
HelloWorld.pde
|
||||||
|
|
||||||
|
"Hello World!" example code.
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
|
||||||
|
void draw(void) {
|
||||||
|
// graphic commands to redraw the complete screen should be placed here
|
||||||
|
u8g.setFont(u8g_font_unifont);
|
||||||
|
u8g.setFontPosTop();
|
||||||
|
u8g.drawStr(0, 1, "Hello");
|
||||||
|
u8g.drawHLine(0, 1+14, 40);
|
||||||
|
u8g.setScale2x2(); // Scale up all draw procedures
|
||||||
|
u8g.drawStr(0, 12, "Hello"); // actual display position is (0,24)
|
||||||
|
u8g.drawHLine(0, 12+14, 40); // All other procedures are also affected
|
||||||
|
u8g.undoScale(); // IMPORTANT: Switch back to normal mode
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
|
||||||
|
// flip screen, if required
|
||||||
|
u8g.setRot180();
|
||||||
|
|
||||||
|
// set SPI backup if required
|
||||||
|
//u8g.setHardwareBackup(u8g_backup_avr_spi);
|
||||||
|
|
||||||
|
// assign default color value
|
||||||
|
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
|
||||||
|
u8g.setColorIndex(255); // white
|
||||||
|
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
|
||||||
|
u8g.setColorIndex(3); // max intensity
|
||||||
|
else if ( u8g.getMode() == U8G_MODE_BW )
|
||||||
|
u8g.setColorIndex(1); // pixel on
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
// picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
// rebuild the picture after some delay
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
TextRotX.pde
|
||||||
|
|
||||||
|
Text rotation example code.
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
// graphic commands to redraw the complete screen should be placed here
|
||||||
|
void draw(void) {
|
||||||
|
u8g_uint_t mx, my;
|
||||||
|
|
||||||
|
mx = u8g.getWidth();
|
||||||
|
mx >>= 1;
|
||||||
|
|
||||||
|
my = u8g.getHeight();
|
||||||
|
my >>= 1;
|
||||||
|
|
||||||
|
u8g.drawStr( mx, my, "Ag");
|
||||||
|
u8g.drawStr90( mx, my, "Ag");
|
||||||
|
u8g.drawStr180( mx, my, "Ag");
|
||||||
|
u8g.drawStr270( mx, my, "Ag");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
u8g.setFont(u8g_font_9x18);
|
||||||
|
}
|
||||||
|
|
||||||
|
void change_font_pos(void) {
|
||||||
|
static uint8_t dir = 0;
|
||||||
|
static unsigned long next = 0;
|
||||||
|
|
||||||
|
if ( next < millis() )
|
||||||
|
{
|
||||||
|
switch(dir) {
|
||||||
|
case 0: u8g.setFontPosBottom(); break;
|
||||||
|
case 1: u8g.setFontPosBaseline(); break;
|
||||||
|
case 2: u8g.setFontPosCenter(); break;
|
||||||
|
case 3: u8g.setFontPosTop(); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir++;
|
||||||
|
dir &= 3;
|
||||||
|
next = millis();
|
||||||
|
next += 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
// change the font position
|
||||||
|
change_font_pos();
|
||||||
|
|
||||||
|
// picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
// rebuild the picture after some delay
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
U8gLogo.pde
|
||||||
|
|
||||||
|
Put the U8GLIB logo on the display.
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
|
||||||
|
void drawColorBox(void)
|
||||||
|
{
|
||||||
|
u8g_uint_t w,h;
|
||||||
|
u8g_uint_t r, g, b;
|
||||||
|
|
||||||
|
w = u8g.getWidth()/32;
|
||||||
|
h = u8g.getHeight()/8;
|
||||||
|
for( b = 0; b < 4; b++ )
|
||||||
|
for( g = 0; g < 8; g++ )
|
||||||
|
for( r = 0; r < 8; r++ )
|
||||||
|
{
|
||||||
|
u8g.setColorIndex((r<<5) | (g<<2) | b );
|
||||||
|
u8g.drawBox(g*w + b*w*8, r*h, w, h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawLogo(uint8_t d)
|
||||||
|
{
|
||||||
|
u8g.setFont(u8g_font_gdr25r);
|
||||||
|
u8g.drawStr(0+d, 30+d, "U");
|
||||||
|
u8g.setFont(u8g_font_gdr30n);
|
||||||
|
u8g.drawStr90(23+d,10+d,"8");
|
||||||
|
u8g.setFont(u8g_font_gdr25r);
|
||||||
|
u8g.drawStr(53+d,30+d,"g");
|
||||||
|
|
||||||
|
u8g.drawHLine(2+d, 35+d, 47);
|
||||||
|
u8g.drawVLine(45+d, 32+d, 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawURL(void)
|
||||||
|
{
|
||||||
|
u8g.setFont(u8g_font_4x6);
|
||||||
|
if ( u8g.getHeight() < 59 )
|
||||||
|
{
|
||||||
|
u8g.drawStr(53,9,"code.google.com");
|
||||||
|
u8g.drawStr(77,18,"/p/u8glib");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u8g.drawStr(1,54,"code.google.com/p/u8glib");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void draw(void) {
|
||||||
|
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
|
||||||
|
drawColorBox();
|
||||||
|
}
|
||||||
|
u8g.setColorIndex(1);
|
||||||
|
if ( U8G_MODE_GET_BITS_PER_PIXEL(u8g.getMode()) > 1 ) {
|
||||||
|
drawLogo(2);
|
||||||
|
u8g.setColorIndex(2);
|
||||||
|
drawLogo(1);
|
||||||
|
u8g.setColorIndex(3);
|
||||||
|
}
|
||||||
|
drawLogo(0);
|
||||||
|
drawURL();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
// flip screen, if required
|
||||||
|
//u8g.setRot180();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
|
||||||
|
// picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
u8g.setColorIndex(1);
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
// rebuild the picture after some delay
|
||||||
|
delay(200);
|
||||||
|
}
|
||||||
|
|
136
ArduinoAddons/Arduino_0.xx/libraries/U8glib/examples/XBM/XBM.pde
Normal file
136
ArduinoAddons/Arduino_0.xx/libraries/U8glib/examples/XBM/XBM.pde
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
XBM.pde
|
||||||
|
|
||||||
|
drawXBM example code.
|
||||||
|
|
||||||
|
>>> Before compiling: Please remove comment from the constructor of the
|
||||||
|
>>> connected graphics display (see below).
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "U8glib.h"
|
||||||
|
|
||||||
|
// setup u8g object, please remove comment from one of the following constructor calls
|
||||||
|
// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device
|
||||||
|
|
||||||
|
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGS102 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
|
||||||
|
//U8GLIB_ST7920_192X32_4X u8g(10); // SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
|
||||||
|
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
|
||||||
|
//U8GLIB_LM6059 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_LM6063 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_BW u8g(10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
|
||||||
|
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
|
||||||
|
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
|
||||||
|
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
|
||||||
|
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11)
|
||||||
|
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
|
||||||
|
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C
|
||||||
|
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
|
||||||
|
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
|
||||||
|
|
||||||
|
#define u8g_logo_width 38
|
||||||
|
#define u8g_logo_height 24
|
||||||
|
//static unsigned char u8g_logo_bits[] = {
|
||||||
|
static unsigned char u8g_logo_bits[] U8G_PROGMEM = {
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xe0, 0xe0,
|
||||||
|
0xff, 0xff, 0x3f, 0xe3, 0xe1, 0xff, 0xff, 0x3f, 0xf3, 0xf1, 0xff, 0xff,
|
||||||
|
0x3f, 0xf3, 0xf1, 0xfe, 0xbf, 0x37, 0xf3, 0x11, 0x1c, 0x1f, 0x30, 0xf3,
|
||||||
|
0x01, 0x08, 0x8c, 0x20, 0xf3, 0x01, 0x00, 0xc0, 0x39, 0xf3, 0x81, 0xc7,
|
||||||
|
0xc1, 0x39, 0xf3, 0xc1, 0xc7, 0xc9, 0x38, 0xf3, 0xc1, 0xc3, 0x19, 0x3c,
|
||||||
|
0xe3, 0x89, 0x01, 0x98, 0x3f, 0xc7, 0x18, 0x00, 0x08, 0x3e, 0x0f, 0x3c,
|
||||||
|
0x70, 0x1c, 0x30, 0x3f, 0xff, 0xfc, 0x87, 0x31, 0xff, 0xff, 0xbf, 0xc7,
|
||||||
|
0x23, 0x01, 0x00, 0x00, 0xc6, 0x23, 0x03, 0x00, 0x00, 0x0e, 0x30, 0xff,
|
||||||
|
0xff, 0x3f, 0x1f, 0x3c, 0xff, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0xff, 0x3f,
|
||||||
|
0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f };
|
||||||
|
|
||||||
|
void draw(void) {
|
||||||
|
// graphic commands to redraw the complete screen should be placed here
|
||||||
|
u8g.drawXBMP( 0, 0, u8g_logo_width, u8g_logo_height, u8g_logo_bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
// flip screen, if required
|
||||||
|
// u8g.setRot180();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
// picture loop
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw();
|
||||||
|
} while( u8g.nextPage() );
|
||||||
|
|
||||||
|
// rebuild the picture after some delay
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
80
ArduinoAddons/Arduino_0.xx/libraries/U8glib/license.txt
Normal file
80
ArduinoAddons/Arduino_0.xx/libraries/U8glib/license.txt
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
|
||||||
|
The U8glib code (http://code.google.com/p/u8glib/) is licensed under the terms of
|
||||||
|
the new-bsd license (two-clause bsd license).
|
||||||
|
See also: http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
|
||||||
|
The repository and optionally the releases contain icons, which are
|
||||||
|
derived from the WPZOOM Developer Icon Set:
|
||||||
|
http://www.wpzoom.com/wpzoom/new-freebie-wpzoom-developer-icon-set-154-free-icons/
|
||||||
|
WPZOOM Developer Icon Set by WPZOOM is licensed under a Creative Commons
|
||||||
|
Attribution-ShareAlike 3.0 Unported License.
|
||||||
|
|
||||||
|
Fonts are licensed under different conditions.
|
||||||
|
See http://code.google.com/p/u8glib/wiki/fontgroup for
|
||||||
|
detailed information on the licensing conditions for each font.
|
||||||
|
|
||||||
|
============ X11 Fonts COUR, HELV, NCEN, TIM, SYMB ============
|
||||||
|
|
||||||
|
For fonts derived from the following files, the license below applies.
|
||||||
|
COURB08.BDF COURB10.BDF COURB12.BDF COURB14.BDF COURB18.BDF
|
||||||
|
COURB24.BDF COURR08.BDF COURR10.BDF COURR12.BDF COURR14.BDF
|
||||||
|
COURR18.BDF COURR24.BDF HELVB08.BDF HELVB10.BDF HELVB12.BDF HELVB14.BDF
|
||||||
|
HELVB18.BDF HELVB24.BDF HELVR08.BDF HELVR10.BDF HELVR12.BDF HELVR14.BDF
|
||||||
|
HELVR18.BDF HELVR24.BDF NCENB08.BDF NCENB10.BDF NCENB12.BDF
|
||||||
|
NCENB14.BDF NCENB18.BDF NCENB24.BDF NCENR08.BDF NCENR10.BDF
|
||||||
|
NCENR12.BDF NCENR14.BDF NCENR18.BDF NCENR24.BDF SYMB08.BDF SYMB10.BDF
|
||||||
|
SYMB12.BDF SYMB14.BDF SYMB18.BDF SYMB24.BDF TIMB08.BDF TIMB10.BDF
|
||||||
|
TIMB12.BDF TIMB14.BDF TIMB18.BDF TIMB24.BDF TIMR08.BDF TIMR10.BDF
|
||||||
|
TIMR12.BDF TIMR14.BDF TIMR18.BDF TIMR24.BDF
|
||||||
|
|
||||||
|
Copyright 1984-1989, 1994 Adobe Systems Incorporated.
|
||||||
|
Copyright 1988, 1994 Digital Equipment Corporation.
|
||||||
|
|
||||||
|
Adobe is a trademark of Adobe Systems Incorporated which may be
|
||||||
|
registered in certain jurisdictions.
|
||||||
|
Permission to use these trademarks is hereby granted only in
|
||||||
|
association with the images described in this file.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute and sell this software
|
||||||
|
and its documentation for any purpose and without fee is hereby
|
||||||
|
granted, provided that the above copyright notices appear in all
|
||||||
|
copies and that both those copyright notices and this permission
|
||||||
|
notice appear in supporting documentation, and that the names of
|
||||||
|
Adobe Systems and Digital Equipment Corporation not be used in
|
||||||
|
advertising or publicity pertaining to distribution of the software
|
||||||
|
without specific, written prior permission. Adobe Systems and
|
||||||
|
Digital Equipment Corporation make no representations about the
|
||||||
|
suitability of this software for any purpose. It is provided "as
|
||||||
|
is" without express or implied warranty.
|
||||||
|
|
||||||
|
|
||||||
|
============ BSD License for U8glib Code ============
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library (http://code.google.com/p/u8glib/)
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2392
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/chessengine.c
Normal file
2392
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/chessengine.c
Normal file
File diff suppressed because it is too large
Load diff
1607
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g.h
Normal file
1607
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g.h
Normal file
File diff suppressed because it is too large
Load diff
177
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g_bitmap.c
Normal file
177
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g_bitmap.c
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_bitmap.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
void u8g_DrawHBitmap(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, const uint8_t *bitmap)
|
||||||
|
{
|
||||||
|
while( cnt > 0 )
|
||||||
|
{
|
||||||
|
u8g_Draw8Pixel(u8g, x, y, 0, *bitmap);
|
||||||
|
bitmap++;
|
||||||
|
cnt--;
|
||||||
|
x+=8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_DrawBitmap(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, u8g_uint_t h, const uint8_t *bitmap)
|
||||||
|
{
|
||||||
|
if ( u8g_IsBBXIntersection(u8g, x, y, cnt*8, h) == 0 )
|
||||||
|
return;
|
||||||
|
while( h > 0 )
|
||||||
|
{
|
||||||
|
u8g_DrawHBitmap(u8g, x, y, cnt, bitmap);
|
||||||
|
bitmap += cnt;
|
||||||
|
y++;
|
||||||
|
h--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void u8g_DrawHBitmapP(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, const u8g_pgm_uint8_t *bitmap)
|
||||||
|
{
|
||||||
|
while( cnt > 0 )
|
||||||
|
{
|
||||||
|
u8g_Draw8Pixel(u8g, x, y, 0, u8g_pgm_read(bitmap));
|
||||||
|
bitmap++;
|
||||||
|
cnt--;
|
||||||
|
x+=8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_DrawBitmapP(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, u8g_uint_t h, const u8g_pgm_uint8_t *bitmap)
|
||||||
|
{
|
||||||
|
if ( u8g_IsBBXIntersection(u8g, x, y, cnt*8, h) == 0 )
|
||||||
|
return;
|
||||||
|
while( h > 0 )
|
||||||
|
{
|
||||||
|
u8g_DrawHBitmapP(u8g, x, y, cnt, bitmap);
|
||||||
|
bitmap += cnt;
|
||||||
|
y++;
|
||||||
|
h--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=========================================================================*/
|
||||||
|
|
||||||
|
static void u8g_DrawHXBM(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, const uint8_t *bitmap)
|
||||||
|
{
|
||||||
|
uint8_t d;
|
||||||
|
x+=7;
|
||||||
|
while( w >= 8 )
|
||||||
|
{
|
||||||
|
u8g_Draw8Pixel(u8g, x, y, 2, *bitmap);
|
||||||
|
bitmap++;
|
||||||
|
w-= 8;
|
||||||
|
x+=8;
|
||||||
|
}
|
||||||
|
if ( w > 0 )
|
||||||
|
{
|
||||||
|
d = *bitmap;
|
||||||
|
x -= 7;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( d & 1 )
|
||||||
|
u8g_DrawPixel(u8g, x, y);
|
||||||
|
x++;
|
||||||
|
w--;
|
||||||
|
d >>= 1;
|
||||||
|
} while ( w > 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_DrawXBM(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, const uint8_t *bitmap)
|
||||||
|
{
|
||||||
|
u8g_uint_t b;
|
||||||
|
b = w;
|
||||||
|
b += 7;
|
||||||
|
b >>= 3;
|
||||||
|
|
||||||
|
if ( u8g_IsBBXIntersection(u8g, x, y, w, h) == 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
while( h > 0 )
|
||||||
|
{
|
||||||
|
u8g_DrawHXBM(u8g, x, y, w, bitmap);
|
||||||
|
bitmap += b;
|
||||||
|
y++;
|
||||||
|
h--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_DrawHXBMP(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, const u8g_pgm_uint8_t *bitmap)
|
||||||
|
{
|
||||||
|
uint8_t d;
|
||||||
|
x+=7;
|
||||||
|
while( w >= 8 )
|
||||||
|
{
|
||||||
|
u8g_Draw8Pixel(u8g, x, y, 2, u8g_pgm_read(bitmap));
|
||||||
|
bitmap++;
|
||||||
|
w-= 8;
|
||||||
|
x+=8;
|
||||||
|
}
|
||||||
|
if ( w > 0 )
|
||||||
|
{
|
||||||
|
d = u8g_pgm_read(bitmap);
|
||||||
|
x -= 7;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( d & 1 )
|
||||||
|
u8g_DrawPixel(u8g, x, y);
|
||||||
|
x++;
|
||||||
|
w--;
|
||||||
|
d >>= 1;
|
||||||
|
} while ( w > 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_DrawXBMP(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, const u8g_pgm_uint8_t *bitmap)
|
||||||
|
{
|
||||||
|
u8g_uint_t b;
|
||||||
|
b = w;
|
||||||
|
b += 7;
|
||||||
|
b >>= 3;
|
||||||
|
|
||||||
|
if ( u8g_IsBBXIntersection(u8g, x, y, w, h) == 0 )
|
||||||
|
return;
|
||||||
|
while( h > 0 )
|
||||||
|
{
|
||||||
|
u8g_DrawHXBMP(u8g, x, y, w, bitmap);
|
||||||
|
bitmap += b;
|
||||||
|
y++;
|
||||||
|
h--;
|
||||||
|
}
|
||||||
|
}
|
382
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g_circle.c
Normal file
382
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g_circle.c
Normal file
|
@ -0,0 +1,382 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_circle.c
|
||||||
|
|
||||||
|
Utility to draw empty and filled circles.
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, bjthom@gmail.com
|
||||||
|
u8g_DrawCircle & u8g_DrawDisc by olikraus@gmail.com
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
Addition to the U8G Library 02/25/12
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#ifdef OLD_CODE
|
||||||
|
|
||||||
|
void circ_upperRight(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t x0, u8g_uint_t y0) {
|
||||||
|
u8g_DrawPixel(u8g, x0 + x, y0 - y);
|
||||||
|
u8g_DrawPixel(u8g, x0 + y, y0 - x);
|
||||||
|
}
|
||||||
|
|
||||||
|
void circ_upperLeft(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t x0, u8g_uint_t y0) {
|
||||||
|
u8g_DrawPixel(u8g, x0 - x, y0 - y);
|
||||||
|
u8g_DrawPixel(u8g, x0 - y, y0 - x);
|
||||||
|
}
|
||||||
|
|
||||||
|
void circ_lowerRight(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t x0, u8g_uint_t y0) {
|
||||||
|
u8g_DrawPixel(u8g, x0 + x, y0 + y);
|
||||||
|
u8g_DrawPixel(u8g, x0 + y, y0 + x);
|
||||||
|
}
|
||||||
|
|
||||||
|
void circ_lowerLeft(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t x0, u8g_uint_t y0) {
|
||||||
|
u8g_DrawPixel(u8g, x0 - x, y0 + y);
|
||||||
|
u8g_DrawPixel(u8g, x0 - y, y0 + x);
|
||||||
|
}
|
||||||
|
|
||||||
|
void circ_all(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t x0, u8g_uint_t y0) {
|
||||||
|
circ_upperRight(u8g, x, y, x0, y0);
|
||||||
|
circ_upperLeft(u8g, x, y, x0, y0);
|
||||||
|
circ_lowerRight(u8g, x, y, x0, y0);
|
||||||
|
circ_lowerLeft(u8g, x, y, x0, y0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_DrawEmpCirc(u8g_t *u8g, u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t option)
|
||||||
|
{
|
||||||
|
if ( u8g_IsBBXIntersection(u8g, x0-rad-1, y0-rad-1, 2*rad+1, 2*rad+1) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int f = 1 - rad;
|
||||||
|
int ddF_x = 1;
|
||||||
|
int ddF_y = -2*rad;
|
||||||
|
uint8_t x = 0;
|
||||||
|
uint8_t y = rad;
|
||||||
|
|
||||||
|
void ( *circ_util )(u8g_t *, u8g_uint_t, u8g_uint_t, u8g_uint_t, u8g_uint_t);
|
||||||
|
|
||||||
|
switch (option)
|
||||||
|
{
|
||||||
|
case U8G_CIRC_UPPER_RIGHT:
|
||||||
|
u8g_DrawPixel(u8g, x0, y0 - rad);
|
||||||
|
u8g_DrawPixel(u8g, x0 + rad, y0);
|
||||||
|
circ_util = circ_upperRight;
|
||||||
|
break;
|
||||||
|
case U8G_CIRC_UPPER_LEFT:
|
||||||
|
u8g_DrawPixel(u8g, x0, y0 - rad);
|
||||||
|
u8g_DrawPixel(u8g, x0 - rad, y0);
|
||||||
|
circ_util = circ_upperLeft;
|
||||||
|
break;
|
||||||
|
case U8G_CIRC_LOWER_RIGHT:
|
||||||
|
u8g_DrawPixel(u8g, x0, y0 + rad);
|
||||||
|
u8g_DrawPixel(u8g, x0 + rad, y0);
|
||||||
|
circ_util = circ_lowerRight;
|
||||||
|
break;
|
||||||
|
case U8G_CIRC_LOWER_LEFT:
|
||||||
|
u8g_DrawPixel(u8g, x0, y0 + rad);
|
||||||
|
u8g_DrawPixel(u8g, x0 - rad, y0);
|
||||||
|
circ_util = circ_lowerLeft;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case U8G_CIRC_ALL:
|
||||||
|
u8g_DrawPixel(u8g, x0, y0 + rad);
|
||||||
|
u8g_DrawPixel(u8g, x0, y0 - rad);
|
||||||
|
u8g_DrawPixel(u8g, x0 + rad, y0);
|
||||||
|
u8g_DrawPixel(u8g, x0 - rad, y0);
|
||||||
|
circ_util = circ_all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( x < y )
|
||||||
|
{
|
||||||
|
if(f >= 0)
|
||||||
|
{
|
||||||
|
y--;
|
||||||
|
ddF_y += 2;
|
||||||
|
f += ddF_y;
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
ddF_x += 2;
|
||||||
|
f += ddF_x;
|
||||||
|
|
||||||
|
circ_util(u8g, x, y, x0, y0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void u8g_DrawFillCirc(u8g_t *u8g, u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t option)
|
||||||
|
{
|
||||||
|
if ( u8g_IsBBXIntersection(u8g, x0-rad-1, y0-rad-1, 2*rad+1, 2*rad+1) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int f = 1 - rad;
|
||||||
|
int ddF_x = 1;
|
||||||
|
int ddF_y = -2*rad;
|
||||||
|
uint8_t x = 0;
|
||||||
|
uint8_t y = rad;
|
||||||
|
|
||||||
|
// Draw vertical diameter at the horiz. center
|
||||||
|
// u8g_DrawVLine(u8g, x0, y0 - rad, 2*rad+1);
|
||||||
|
|
||||||
|
if (option == U8G_CIRC_UPPER_LEFT || option == U8G_CIRC_UPPER_RIGHT) {
|
||||||
|
u8g_DrawVLine(u8g, x0, y0 - rad, rad+1);
|
||||||
|
}
|
||||||
|
else if (option == U8G_CIRC_LOWER_LEFT || option == U8G_CIRC_LOWER_RIGHT) {
|
||||||
|
u8g_DrawVLine(u8g, x0, y0, rad+1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
u8g_DrawVLine(u8g, x0, y0 - rad, 2*rad+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while( x < y )
|
||||||
|
{
|
||||||
|
if(f >= 0)
|
||||||
|
{
|
||||||
|
y--;
|
||||||
|
ddF_y += 2;
|
||||||
|
f += ddF_y;
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
ddF_x += 2;
|
||||||
|
f += ddF_x;
|
||||||
|
|
||||||
|
//Draw vertical lines from one point to another
|
||||||
|
|
||||||
|
switch (option)
|
||||||
|
{
|
||||||
|
case U8G_CIRC_UPPER_RIGHT:
|
||||||
|
u8g_DrawVLine(u8g, x0+x, y0-y, y+1);
|
||||||
|
u8g_DrawVLine(u8g, x0+y, y0-x, x+1);
|
||||||
|
break;
|
||||||
|
case U8G_CIRC_UPPER_LEFT:
|
||||||
|
u8g_DrawVLine(u8g, x0-x, y0-y, y+1);
|
||||||
|
u8g_DrawVLine(u8g, x0-y, y0-x, x+1);
|
||||||
|
break;
|
||||||
|
case U8G_CIRC_LOWER_RIGHT:
|
||||||
|
u8g_DrawVLine(u8g, x0+x, y0, y+1);
|
||||||
|
u8g_DrawVLine(u8g, x0+y, y0, x+1);
|
||||||
|
break;
|
||||||
|
case U8G_CIRC_LOWER_LEFT:
|
||||||
|
u8g_DrawVLine(u8g, x0-x, y0, y+1);
|
||||||
|
u8g_DrawVLine(u8g, x0-y, y0, x+1);
|
||||||
|
break;
|
||||||
|
case U8G_CIRC_ALL:
|
||||||
|
u8g_DrawVLine(u8g, x0+x, y0-y, 2*y+1);
|
||||||
|
u8g_DrawVLine(u8g, x0-x, y0-y, 2*y+1);
|
||||||
|
u8g_DrawVLine(u8g, x0+y, y0-x, 2*x+1);
|
||||||
|
u8g_DrawVLine(u8g, x0-y, y0-x, 2*x+1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*=========================================================================*/
|
||||||
|
|
||||||
|
static void u8g_draw_circle_section(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t x0, u8g_uint_t y0, uint8_t option) U8G_NOINLINE;
|
||||||
|
|
||||||
|
static void u8g_draw_circle_section(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t x0, u8g_uint_t y0, uint8_t option)
|
||||||
|
{
|
||||||
|
/* upper right */
|
||||||
|
if ( option & U8G_DRAW_UPPER_RIGHT )
|
||||||
|
{
|
||||||
|
u8g_DrawPixel(u8g, x0 + x, y0 - y);
|
||||||
|
u8g_DrawPixel(u8g, x0 + y, y0 - x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* upper left */
|
||||||
|
if ( option & U8G_DRAW_UPPER_LEFT )
|
||||||
|
{
|
||||||
|
u8g_DrawPixel(u8g, x0 - x, y0 - y);
|
||||||
|
u8g_DrawPixel(u8g, x0 - y, y0 - x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lower right */
|
||||||
|
if ( option & U8G_DRAW_LOWER_RIGHT )
|
||||||
|
{
|
||||||
|
u8g_DrawPixel(u8g, x0 + x, y0 + y);
|
||||||
|
u8g_DrawPixel(u8g, x0 + y, y0 + x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lower left */
|
||||||
|
if ( option & U8G_DRAW_LOWER_LEFT )
|
||||||
|
{
|
||||||
|
u8g_DrawPixel(u8g, x0 - x, y0 + y);
|
||||||
|
u8g_DrawPixel(u8g, x0 - y, y0 + x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_draw_circle(u8g_t *u8g, u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t option)
|
||||||
|
{
|
||||||
|
u8g_int_t f;
|
||||||
|
u8g_int_t ddF_x;
|
||||||
|
u8g_int_t ddF_y;
|
||||||
|
u8g_uint_t x;
|
||||||
|
u8g_uint_t y;
|
||||||
|
|
||||||
|
f = 1;
|
||||||
|
f -= rad;
|
||||||
|
ddF_x = 1;
|
||||||
|
ddF_y = 0;
|
||||||
|
ddF_y -= rad;
|
||||||
|
ddF_y *= 2;
|
||||||
|
x = 0;
|
||||||
|
y = rad;
|
||||||
|
|
||||||
|
u8g_draw_circle_section(u8g, x, y, x0, y0, option);
|
||||||
|
|
||||||
|
while ( x < y )
|
||||||
|
{
|
||||||
|
if (f >= 0)
|
||||||
|
{
|
||||||
|
y--;
|
||||||
|
ddF_y += 2;
|
||||||
|
f += ddF_y;
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
ddF_x += 2;
|
||||||
|
f += ddF_x;
|
||||||
|
|
||||||
|
u8g_draw_circle_section(u8g, x, y, x0, y0, option);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_DrawCircle(u8g_t *u8g, u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t option)
|
||||||
|
{
|
||||||
|
/* check for bounding box */
|
||||||
|
{
|
||||||
|
u8g_uint_t radp, radp2;
|
||||||
|
|
||||||
|
radp = rad;
|
||||||
|
radp++;
|
||||||
|
radp2 = radp;
|
||||||
|
radp2 *= 2;
|
||||||
|
|
||||||
|
if ( u8g_IsBBXIntersection(u8g, x0-radp, y0-radp, radp2, radp2) == 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* draw circle */
|
||||||
|
u8g_draw_circle(u8g, x0, y0, rad, option);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_draw_disc_section(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t x0, u8g_uint_t y0, uint8_t option) U8G_NOINLINE;
|
||||||
|
|
||||||
|
static void u8g_draw_disc_section(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t x0, u8g_uint_t y0, uint8_t option)
|
||||||
|
{
|
||||||
|
/* upper right */
|
||||||
|
if ( option & U8G_DRAW_UPPER_RIGHT )
|
||||||
|
{
|
||||||
|
u8g_DrawVLine(u8g, x0+x, y0-y, y+1);
|
||||||
|
u8g_DrawVLine(u8g, x0+y, y0-x, x+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* upper left */
|
||||||
|
if ( option & U8G_DRAW_UPPER_LEFT )
|
||||||
|
{
|
||||||
|
u8g_DrawVLine(u8g, x0-x, y0-y, y+1);
|
||||||
|
u8g_DrawVLine(u8g, x0-y, y0-x, x+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lower right */
|
||||||
|
if ( option & U8G_DRAW_LOWER_RIGHT )
|
||||||
|
{
|
||||||
|
u8g_DrawVLine(u8g, x0+x, y0, y+1);
|
||||||
|
u8g_DrawVLine(u8g, x0+y, y0, x+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lower left */
|
||||||
|
if ( option & U8G_DRAW_LOWER_LEFT )
|
||||||
|
{
|
||||||
|
u8g_DrawVLine(u8g, x0-x, y0, y+1);
|
||||||
|
u8g_DrawVLine(u8g, x0-y, y0, x+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_draw_disc(u8g_t *u8g, u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t option)
|
||||||
|
{
|
||||||
|
u8g_int_t f;
|
||||||
|
u8g_int_t ddF_x;
|
||||||
|
u8g_int_t ddF_y;
|
||||||
|
u8g_uint_t x;
|
||||||
|
u8g_uint_t y;
|
||||||
|
|
||||||
|
f = 1;
|
||||||
|
f -= rad;
|
||||||
|
ddF_x = 1;
|
||||||
|
ddF_y = 0;
|
||||||
|
ddF_y -= rad;
|
||||||
|
ddF_y *= 2;
|
||||||
|
x = 0;
|
||||||
|
y = rad;
|
||||||
|
|
||||||
|
u8g_draw_disc_section(u8g, x, y, x0, y0, option);
|
||||||
|
|
||||||
|
while ( x < y )
|
||||||
|
{
|
||||||
|
if (f >= 0)
|
||||||
|
{
|
||||||
|
y--;
|
||||||
|
ddF_y += 2;
|
||||||
|
f += ddF_y;
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
ddF_x += 2;
|
||||||
|
f += ddF_x;
|
||||||
|
|
||||||
|
u8g_draw_disc_section(u8g, x, y, x0, y0, option);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_DrawDisc(u8g_t *u8g, u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t option)
|
||||||
|
{
|
||||||
|
/* check for bounding box */
|
||||||
|
{
|
||||||
|
u8g_uint_t radp, radp2;
|
||||||
|
|
||||||
|
radp = rad;
|
||||||
|
radp++;
|
||||||
|
radp2 = radp;
|
||||||
|
radp2 *= 2;
|
||||||
|
|
||||||
|
if ( u8g_IsBBXIntersection(u8g, x0-radp, y0-radp, radp2, radp2) == 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* draw disc */
|
||||||
|
u8g_draw_disc(u8g, x0, y0, rad, option);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
156
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g_clip.c
Normal file
156
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g_clip.c
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_clip.c
|
||||||
|
|
||||||
|
procedures for clipping
|
||||||
|
taken over from procs in u8g_pb.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
Notes
|
||||||
|
|
||||||
|
This is one of the most critical parts of u8glib. It must be fast, but still reliable.
|
||||||
|
Based on the intersection program (see tools folder), there is minimized version of
|
||||||
|
the condition for the intersaction test:
|
||||||
|
minimized version
|
||||||
|
---1----0 1 b1 <= a2 && b1 > b2
|
||||||
|
-----1--0 1 b2 >= a1 && b1 > b2
|
||||||
|
---1-1--- 1 b1 <= a2 && b2 >= a1
|
||||||
|
It includes the assumption, that a1 <= a2 is always true (correct, because
|
||||||
|
a1, a2 are the page dimensions.
|
||||||
|
|
||||||
|
The direct implementation of the above result is done in:
|
||||||
|
uint8_t u8g_is_intersection_boolean(u8g_uint_t a0, u8g_uint_t a1, u8g_uint_t v0, u8g_uint_t v1)
|
||||||
|
However, this is slower than a decision tree version:
|
||||||
|
static uint8_t u8g_is_intersection_decision_tree(u8g_uint_t a0, u8g_uint_t a1, u8g_uint_t v0, u8g_uint_t v1)
|
||||||
|
Also suprising is, that he the macro implementation is slower than the inlined version.
|
||||||
|
|
||||||
|
The decision tree is based on the expansion of the truth table.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define U8G_ALWAYS_INLINE __attribute__((always_inline))
|
||||||
|
#else
|
||||||
|
#define U8G_ALWAYS_INLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
intersection assumptions:
|
||||||
|
a1 <= a2 is always true
|
||||||
|
|
||||||
|
minimized version
|
||||||
|
---1----0 1 b1 <= a2 && b1 > b2
|
||||||
|
-----1--0 1 b2 >= a1 && b1 > b2
|
||||||
|
---1-1--- 1 b1 <= a2 && b2 >= a1
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef OLD_CODE_WHICH_IS_TOO_SLOW
|
||||||
|
static uint8_t u8g_is_intersection_boolean(u8g_uint_t a0, u8g_uint_t a1, u8g_uint_t v0, u8g_uint_t v1)
|
||||||
|
{
|
||||||
|
uint8_t c1, c2, c3, tmp;
|
||||||
|
c1 = v0 <= a1;
|
||||||
|
c2 = v1 >= a0;
|
||||||
|
c3 = v0 > v1;
|
||||||
|
|
||||||
|
tmp = c1;
|
||||||
|
c1 &= c2;
|
||||||
|
c2 &= c3;
|
||||||
|
c3 &= tmp;
|
||||||
|
c1 |= c2;
|
||||||
|
c1 |= c3;
|
||||||
|
return c1 & 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define U8G_IS_INTERSECTION_MACRO(a0,a1,v0,v1) ((uint8_t)( (v0) <= (a1) ) ? ( ( (v1) >= (a0) ) ? ( 1 ) : ( (v0) > (v1) ) ) : ( ( (v1) >= (a0) ) ? ( (v0) > (v1) ) : ( 0 ) ))
|
||||||
|
|
||||||
|
static uint8_t u8g_is_intersection_decision_tree(u8g_uint_t a0, u8g_uint_t a1, u8g_uint_t v0, u8g_uint_t v1) U8G_ALWAYS_INLINE;
|
||||||
|
static uint8_t u8g_is_intersection_decision_tree(u8g_uint_t a0, u8g_uint_t a1, u8g_uint_t v0, u8g_uint_t v1)
|
||||||
|
{
|
||||||
|
/* surprisingly the macro leads to larger code */
|
||||||
|
/* return U8G_IS_INTERSECTION_MACRO(a0,a1,v0,v1); */
|
||||||
|
if ( v0 <= a1 )
|
||||||
|
{
|
||||||
|
if ( v1 >= a0 )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( v0 > v1 )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( v1 >= a0 )
|
||||||
|
{
|
||||||
|
if ( v0 > v1 )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_IsBBXIntersection(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h)
|
||||||
|
{
|
||||||
|
register u8g_uint_t tmp;
|
||||||
|
tmp = y;
|
||||||
|
tmp += h;
|
||||||
|
tmp--;
|
||||||
|
if ( u8g_is_intersection_decision_tree(u8g->current_page.y0, u8g->current_page.y1, y, tmp) == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
tmp = x;
|
||||||
|
tmp += w;
|
||||||
|
tmp--;
|
||||||
|
return u8g_is_intersection_decision_tree(u8g->current_page.x0, u8g->current_page.x1, x, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,173 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_api.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
uint8_t u8g_InitCom(u8g_t *u8g, u8g_dev_t *dev)
|
||||||
|
{
|
||||||
|
return dev->com_fn(u8g, U8G_COM_MSG_INIT, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_StopCom(u8g_t *u8g, u8g_dev_t *dev)
|
||||||
|
{
|
||||||
|
dev->com_fn(u8g, U8G_COM_MSG_STOP, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cs contains the chip number, which should be enabled */
|
||||||
|
void u8g_SetChipSelect(u8g_t *u8g, u8g_dev_t *dev, uint8_t cs)
|
||||||
|
{
|
||||||
|
dev->com_fn(u8g, U8G_COM_MSG_CHIP_SELECT, cs, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetResetLow(u8g_t *u8g, u8g_dev_t *dev)
|
||||||
|
{
|
||||||
|
dev->com_fn(u8g, U8G_COM_MSG_RESET, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetResetHigh(u8g_t *u8g, u8g_dev_t *dev)
|
||||||
|
{
|
||||||
|
dev->com_fn(u8g, U8G_COM_MSG_RESET, 1, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void u8g_SetAddress(u8g_t *u8g, u8g_dev_t *dev, uint8_t address)
|
||||||
|
{
|
||||||
|
dev->com_fn(u8g, U8G_COM_MSG_ADDRESS, address, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_WriteByte(u8g_t *u8g, u8g_dev_t *dev, uint8_t val)
|
||||||
|
{
|
||||||
|
return dev->com_fn(u8g, U8G_COM_MSG_WRITE_BYTE, val, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_WriteSequence(u8g_t *u8g, u8g_dev_t *dev, uint8_t cnt, uint8_t *seq)
|
||||||
|
{
|
||||||
|
return dev->com_fn(u8g, U8G_COM_MSG_WRITE_SEQ, cnt, seq);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_WriteSequenceP(u8g_t *u8g, u8g_dev_t *dev, uint8_t cnt, const uint8_t *seq)
|
||||||
|
{
|
||||||
|
return dev->com_fn(u8g, U8G_COM_MSG_WRITE_SEQ_P, cnt, (void *)seq);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
sequence := { direct_value | escape_sequence }
|
||||||
|
direct_value := 0..254
|
||||||
|
escape_sequence := value_255 | sequence_end | delay | adr | cs | not_used
|
||||||
|
value_255 := 255 255
|
||||||
|
sequence_end = 255 254
|
||||||
|
delay := 255 0..127
|
||||||
|
adr := 255 0x0e0 .. 0x0ef
|
||||||
|
cs := 255 0x0d0 .. 0x0df
|
||||||
|
not_used := 255 101..254
|
||||||
|
|
||||||
|
#define U8G_ESC_DLY(x) 255, ((x) & 0x7f)
|
||||||
|
#define U8G_ESC_CS(x) 255, (0xd0 | ((x)&0x0f))
|
||||||
|
#define U8G_ESC_ADR(x) 255, (0xe0 | ((x)&0x0f))
|
||||||
|
#define U8G_ESC_VCC(x) 255, (0xbe | ((x)&0x01))
|
||||||
|
#define U8G_ESC_END 255, 254
|
||||||
|
#define U8G_ESC_255 255, 255
|
||||||
|
#define U8G_ESC_RST(x) 255, (0xc0 | ((x)&0x0f))
|
||||||
|
|
||||||
|
*/
|
||||||
|
uint8_t u8g_WriteEscSeqP(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq)
|
||||||
|
{
|
||||||
|
uint8_t is_escape = 0;
|
||||||
|
uint8_t value;
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
value = u8g_pgm_read(esc_seq);
|
||||||
|
if ( is_escape == 0 )
|
||||||
|
{
|
||||||
|
if ( value != 255 )
|
||||||
|
{
|
||||||
|
if ( u8g_WriteByte(u8g, dev, value) == 0 )
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
is_escape = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( value == 255 )
|
||||||
|
{
|
||||||
|
if ( u8g_WriteByte(u8g, dev, value) == 0 )
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if ( value == 254 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if ( value >= 0x0f0 )
|
||||||
|
{
|
||||||
|
/* not yet used, do nothing */
|
||||||
|
}
|
||||||
|
else if ( value >= 0xe0 )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, value & 0x0f);
|
||||||
|
}
|
||||||
|
else if ( value >= 0xd0 )
|
||||||
|
{
|
||||||
|
u8g_SetChipSelect(u8g, dev, value & 0x0f);
|
||||||
|
}
|
||||||
|
else if ( value >= 0xc0 )
|
||||||
|
{
|
||||||
|
u8g_SetResetLow(u8g, dev);
|
||||||
|
value &= 0x0f;
|
||||||
|
value <<= 4;
|
||||||
|
value+=2;
|
||||||
|
u8g_Delay(value);
|
||||||
|
u8g_SetResetHigh(u8g, dev);
|
||||||
|
u8g_Delay(value);
|
||||||
|
}
|
||||||
|
else if ( value >= 0xbe )
|
||||||
|
{
|
||||||
|
/* not yet implemented */
|
||||||
|
/* u8g_SetVCC(u8g, dev, value & 0x01); */
|
||||||
|
}
|
||||||
|
else if ( value <= 127 )
|
||||||
|
{
|
||||||
|
u8g_Delay(value);
|
||||||
|
}
|
||||||
|
is_escape = 0;
|
||||||
|
}
|
||||||
|
esc_seq++;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_api_16gr.c
|
||||||
|
|
||||||
|
Extension of the com api for devices with 16 graylevels (4 bit per pixel).
|
||||||
|
This should fit to the 8h and 16h architectures (pb8v1, pb8v2, pb16v1, pb16v2),
|
||||||
|
mainly intended for SSD OLEDs
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
/* interpret b as a monochrome bit pattern, write value 15 for high bit and value 0 for a low bit */
|
||||||
|
/* topbit (msb) is sent last */
|
||||||
|
/* example: b = 0x083 will send 0xff, 0x00, 0x00, 0xf0 */
|
||||||
|
uint8_t u8g_WriteByteBWTo16GrDevice(u8g_t *u8g, u8g_dev_t *dev, uint8_t b)
|
||||||
|
{
|
||||||
|
static uint8_t buf[4];
|
||||||
|
static uint8_t map[4] = { 0, 0x00f, 0x0f0, 0x0ff };
|
||||||
|
buf [3] = map[b & 3];
|
||||||
|
b>>=2;
|
||||||
|
buf [2] = map[b & 3];
|
||||||
|
b>>=2;
|
||||||
|
buf [1] = map[b & 3];
|
||||||
|
b>>=2;
|
||||||
|
buf [0] = map[b & 3];
|
||||||
|
return dev->com_fn(u8g, U8G_COM_MSG_WRITE_SEQ, 4, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_WriteSequenceBWTo16GrDevice(u8g_t *u8g, u8g_dev_t *dev, uint8_t cnt, uint8_t *ptr)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( u8g_WriteByteBWTo16GrDevice(u8g, dev, *ptr++) == 0 )
|
||||||
|
return 0;
|
||||||
|
cnt--;
|
||||||
|
} while( cnt != 0 );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* interpret b as a 4L bit pattern, write values 0x000, 0x004, 0x008, 0x00c */
|
||||||
|
uint8_t u8g_WriteByte4LTo16GrDevice(u8g_t *u8g, u8g_dev_t *dev, uint8_t b)
|
||||||
|
{
|
||||||
|
//static uint8_t map[16] = { 0x000, 0x004, 0x008, 0x00c, 0x040, 0x044, 0x048, 0x04c, 0x080, 0x084, 0x088, 0x08c, 0x0c0, 0x0c4, 0x0c8, 0x0cc};
|
||||||
|
//static uint8_t map[16] = { 0x000, 0x004, 0x00a, 0x00f, 0x040, 0x044, 0x04a, 0x04f, 0x0a0, 0x0a4, 0x0aa, 0x0af, 0x0f0, 0x0f4, 0x0fa, 0x0ff};
|
||||||
|
static uint8_t map[16] = { 0x000, 0x040, 0x0a0, 0x0f0, 0x004, 0x044, 0x0a4, 0x0f4, 0x00a, 0x04a, 0x0aa, 0x0fa, 0x00f, 0x04f, 0x0af, 0x0ff};
|
||||||
|
uint8_t bb;
|
||||||
|
bb = b;
|
||||||
|
bb &= 15;
|
||||||
|
b>>=4;
|
||||||
|
dev->com_fn(u8g, U8G_COM_MSG_WRITE_BYTE, map[bb], NULL);
|
||||||
|
return dev->com_fn(u8g, U8G_COM_MSG_WRITE_BYTE, map[b], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_WriteSequence4LTo16GrDevice(u8g_t *u8g, u8g_dev_t *dev, uint8_t cnt, uint8_t *ptr)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( u8g_WriteByte4LTo16GrDevice(u8g, dev, *ptr++) == 0 )
|
||||||
|
return 0;
|
||||||
|
cnt--;
|
||||||
|
} while( cnt != 0 );
|
||||||
|
return 1;
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_arduino_common.c
|
||||||
|
|
||||||
|
shared procedures for the arduino communication procedures
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
#include <WProgram.h>
|
||||||
|
#else
|
||||||
|
#include <Arduino.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void u8g_com_arduino_digital_write(u8g_t *u8g, uint8_t pin_index, uint8_t value)
|
||||||
|
{
|
||||||
|
uint8_t pin;
|
||||||
|
pin = u8g->pin_list[pin_index];
|
||||||
|
if ( pin != U8G_PIN_NONE )
|
||||||
|
digitalWrite(pin, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this procedure does not set the RW pin */
|
||||||
|
void u8g_com_arduino_assign_pin_output_high(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
/* skip the RW pin, which is the last pin in the list */
|
||||||
|
for( i = 0; i < U8G_PIN_LIST_LEN-1; i++ )
|
||||||
|
{
|
||||||
|
if ( u8g->pin_list[i] != U8G_PIN_NONE )
|
||||||
|
{
|
||||||
|
pinMode(u8g->pin_list[i], OUTPUT);
|
||||||
|
digitalWrite(u8g->pin_list[i], HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,245 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_arduino_fast_parallel.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
PIN_D0 8
|
||||||
|
PIN_D1 9
|
||||||
|
PIN_D2 10
|
||||||
|
PIN_D3 11
|
||||||
|
PIN_D4 4
|
||||||
|
PIN_D5 5
|
||||||
|
PIN_D6 6
|
||||||
|
PIN_D7 7
|
||||||
|
|
||||||
|
PIN_CS1 14
|
||||||
|
PIN_CS2 15
|
||||||
|
PIN_RW 16
|
||||||
|
PIN_DI 17
|
||||||
|
PIN_EN 18
|
||||||
|
|
||||||
|
u8g_Init8Bit(u8g, dev, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset)
|
||||||
|
u8g_Init8Bit(u8g, dev, 8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16, U8G_PIN_NONE)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
//#include <WProgram.h>
|
||||||
|
#include <wiring_private.h>
|
||||||
|
#include <pins_arduino.h>
|
||||||
|
#else
|
||||||
|
#include <Arduino.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define PIN_D0 8
|
||||||
|
#define PIN_D1 9
|
||||||
|
#define PIN_D2 10
|
||||||
|
#define PIN_D3 11
|
||||||
|
#define PIN_D4 4
|
||||||
|
#define PIN_D5 5
|
||||||
|
#define PIN_D6 6
|
||||||
|
#define PIN_D7 7
|
||||||
|
|
||||||
|
#define PIN_CS1 14
|
||||||
|
#define PIN_CS2 15
|
||||||
|
#define PIN_RW 16
|
||||||
|
#define PIN_DI 17
|
||||||
|
#define PIN_EN 18
|
||||||
|
|
||||||
|
//#define PIN_RESET
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__PIC32MX)
|
||||||
|
/* CHIPKIT PIC32 */
|
||||||
|
static volatile uint32_t *u8g_data_port[8];
|
||||||
|
static uint32_t u8g_data_mask[8];
|
||||||
|
#else
|
||||||
|
static volatile uint8_t *u8g_data_port[8];
|
||||||
|
static uint8_t u8g_data_mask[8];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_com_arduino_fast_parallel_init(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
u8g_data_port[0] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D0]));
|
||||||
|
u8g_data_mask[0] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D0]);
|
||||||
|
u8g_data_port[1] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D1]));
|
||||||
|
u8g_data_mask[1] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D1]);
|
||||||
|
u8g_data_port[2] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D2]));
|
||||||
|
u8g_data_mask[2] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D2]);
|
||||||
|
u8g_data_port[3] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D3]));
|
||||||
|
u8g_data_mask[3] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D3]);
|
||||||
|
|
||||||
|
u8g_data_port[4] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D4]));
|
||||||
|
u8g_data_mask[4] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D4]);
|
||||||
|
u8g_data_port[5] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D5]));
|
||||||
|
u8g_data_mask[5] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D5]);
|
||||||
|
u8g_data_port[6] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D6]));
|
||||||
|
u8g_data_mask[6] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D6]);
|
||||||
|
u8g_data_port[7] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D7]));
|
||||||
|
u8g_data_mask[7] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D7]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_com_arduino_fast_write_data_pin(uint8_t pin, uint8_t val)
|
||||||
|
{
|
||||||
|
if ( val != 0 )
|
||||||
|
*u8g_data_port[pin] |= u8g_data_mask[pin];
|
||||||
|
else
|
||||||
|
*u8g_data_port[pin] &= ~u8g_data_mask[pin];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void u8g_com_arduino_fast_parallel_write(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
u8g_com_arduino_fast_write_data_pin( 0, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_fast_write_data_pin( 1, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_fast_write_data_pin( 2, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_fast_write_data_pin( 3, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
|
||||||
|
u8g_com_arduino_fast_write_data_pin( 4, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_fast_write_data_pin( 5, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_fast_write_data_pin( 6, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_fast_write_data_pin( 7, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
|
||||||
|
/* EN cycle time must be 1 micro second */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_EN, HIGH);
|
||||||
|
u8g_MicroDelay(); /* delay by 1000ns, reference: ST7920: 140ns, SBN1661: 100ns */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_EN, LOW);
|
||||||
|
u8g_10MicroDelay(); /* ST7920 commands: 72us */
|
||||||
|
u8g_10MicroDelay(); /* ST7920 commands: 72us */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_fast_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g_com_arduino_fast_parallel_init(u8g);
|
||||||
|
/* setup the RW pin as output and force it to low */
|
||||||
|
if ( u8g->pin_list[U8G_PI_RW] != U8G_PIN_NONE )
|
||||||
|
{
|
||||||
|
pinMode(u8g->pin_list[U8G_PI_RW], OUTPUT);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RW, LOW);
|
||||||
|
}
|
||||||
|
/* set all pins (except RW pin) */
|
||||||
|
u8g_com_arduino_assign_pin_output_high(u8g);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, HIGH);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, HIGH);
|
||||||
|
}
|
||||||
|
else if ( arg_val == 1 )
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, HIGH);
|
||||||
|
}
|
||||||
|
else if ( arg_val == 2 )
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, HIGH);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, LOW);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, LOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_com_arduino_fast_parallel_write(u8g, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_fast_parallel_write(u8g, *ptr++);
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_fast_parallel_write(u8g, u8g_pgm_read(ptr));
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_DI, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE )
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_fast_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* ARDUINO */
|
||||||
|
|
|
@ -0,0 +1,191 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_arduino_hw_spi.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
#include <WProgram.h>
|
||||||
|
|
||||||
|
/* fixed pins */
|
||||||
|
#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) // Sanguino.cc board
|
||||||
|
#define PIN_SCK 7
|
||||||
|
#define PIN_MISO 6
|
||||||
|
#define PIN_MOSI 5
|
||||||
|
#define PIN_CS 4
|
||||||
|
#else // Arduino Board
|
||||||
|
#define PIN_SCK 13
|
||||||
|
#define PIN_MISO 12
|
||||||
|
#define PIN_MOSI 11
|
||||||
|
#define PIN_CS 10
|
||||||
|
#endif // (__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
/* use Arduino pin definitions */
|
||||||
|
#define PIN_SCK SCK
|
||||||
|
#define PIN_MISO MISO
|
||||||
|
#define PIN_MOSI MOSI
|
||||||
|
#define PIN_CS SS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//static uint8_t u8g_spi_out(uint8_t data) U8G_NOINLINE;
|
||||||
|
static uint8_t u8g_spi_out(uint8_t data)
|
||||||
|
{
|
||||||
|
/* unsigned char x = 100; */
|
||||||
|
/* send data */
|
||||||
|
SPDR = data;
|
||||||
|
/* wait for transmission */
|
||||||
|
while (!(SPSR & (1<<SPIF)))
|
||||||
|
;
|
||||||
|
/* clear the SPIF flag by reading SPDR */
|
||||||
|
return SPDR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g_com_arduino_assign_pin_output_high(u8g);
|
||||||
|
pinMode(PIN_SCK, OUTPUT);
|
||||||
|
digitalWrite(PIN_SCK, LOW);
|
||||||
|
pinMode(PIN_MOSI, OUTPUT);
|
||||||
|
digitalWrite(PIN_MOSI, LOW);
|
||||||
|
/* pinMode(PIN_MISO, INPUT); */
|
||||||
|
|
||||||
|
pinMode(PIN_CS, OUTPUT); /* system chip select for the atmega board */
|
||||||
|
digitalWrite(PIN_CS, HIGH);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
SPR1 SPR0
|
||||||
|
0 0 fclk/4
|
||||||
|
0 1 fclk/16
|
||||||
|
1 0 fclk/64
|
||||||
|
1 1 fclk/128
|
||||||
|
*/
|
||||||
|
SPCR = 0;
|
||||||
|
SPCR = (1<<SPE) | (1<<MSTR)|(0<<SPR1)|(1<<SPR0)|(0<<CPOL)|(0<<CPHA);
|
||||||
|
#ifdef U8G_HW_SPI_2X
|
||||||
|
SPSR = (1 << SPI2X); /* double speed, issue 89 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_A0, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE )
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_spi_out(arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_spi_out(*ptr++);
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_spi_out(u8g_pgm_read(ptr));
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* #elif defined(__18CXX) || defined(__PIC32MX) */
|
||||||
|
|
||||||
|
#else /* __AVR__ */
|
||||||
|
|
||||||
|
#endif /* __AVR__ */
|
||||||
|
|
||||||
|
#else /* ARDUINO */
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARDUINO */
|
||||||
|
|
|
@ -0,0 +1,221 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_arduino_no_en_parallel.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
PIN_D0 8
|
||||||
|
PIN_D1 9
|
||||||
|
PIN_D2 10
|
||||||
|
PIN_D3 11
|
||||||
|
PIN_D4 4
|
||||||
|
PIN_D5 5
|
||||||
|
PIN_D6 6
|
||||||
|
PIN_D7 7
|
||||||
|
|
||||||
|
PIN_CS1 14
|
||||||
|
PIN_CS2 15
|
||||||
|
PIN_RW 16
|
||||||
|
PIN_DI 17
|
||||||
|
PIN_EN 18
|
||||||
|
|
||||||
|
u8g_Init8Bit(u8g, dev, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset)
|
||||||
|
u8g_Init8Bit(u8g, dev, 8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16, U8G_PIN_NONE)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
//#include <WProgram.h>
|
||||||
|
#include <wiring_private.h>
|
||||||
|
#include <pins_arduino.h>
|
||||||
|
#else
|
||||||
|
#include <Arduino.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#define PIN_RESET
|
||||||
|
|
||||||
|
#if defined(__PIC32MX)
|
||||||
|
/* CHIPKIT PIC32 */
|
||||||
|
static volatile uint32_t *u8g_data_port[8];
|
||||||
|
static uint32_t u8g_data_mask[8];
|
||||||
|
#else
|
||||||
|
static volatile uint8_t *u8g_data_port[8];
|
||||||
|
static uint8_t u8g_data_mask[8];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_com_arduino_no_en_parallel_init(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
u8g_data_port[0] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D0]));
|
||||||
|
u8g_data_mask[0] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D0]);
|
||||||
|
u8g_data_port[1] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D1]));
|
||||||
|
u8g_data_mask[1] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D1]);
|
||||||
|
u8g_data_port[2] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D2]));
|
||||||
|
u8g_data_mask[2] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D2]);
|
||||||
|
u8g_data_port[3] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D3]));
|
||||||
|
u8g_data_mask[3] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D3]);
|
||||||
|
|
||||||
|
u8g_data_port[4] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D4]));
|
||||||
|
u8g_data_mask[4] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D4]);
|
||||||
|
u8g_data_port[5] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D5]));
|
||||||
|
u8g_data_mask[5] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D5]);
|
||||||
|
u8g_data_port[6] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D6]));
|
||||||
|
u8g_data_mask[6] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D6]);
|
||||||
|
u8g_data_port[7] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D7]));
|
||||||
|
u8g_data_mask[7] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D7]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_com_arduino_no_en_write_data_pin(uint8_t pin, uint8_t val)
|
||||||
|
{
|
||||||
|
if ( val != 0 )
|
||||||
|
*u8g_data_port[pin] |= u8g_data_mask[pin];
|
||||||
|
else
|
||||||
|
*u8g_data_port[pin] &= ~u8g_data_mask[pin];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void u8g_com_arduino_no_en_parallel_write(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
u8g_com_arduino_no_en_write_data_pin( 0, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_no_en_write_data_pin( 1, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_no_en_write_data_pin( 2, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_no_en_write_data_pin( 3, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
|
||||||
|
u8g_com_arduino_no_en_write_data_pin( 4, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_no_en_write_data_pin( 5, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_no_en_write_data_pin( 6, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_no_en_write_data_pin( 7, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
|
||||||
|
/* EN cycle time must be 1 micro second, digitalWrite is slow enough to do this */
|
||||||
|
if ( u8g->pin_list[U8G_PI_CS_STATE] == 1 )
|
||||||
|
{
|
||||||
|
u8g_MicroDelay();
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, HIGH);
|
||||||
|
u8g_MicroDelay();
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, LOW);
|
||||||
|
u8g_MicroDelay();
|
||||||
|
}
|
||||||
|
else if ( u8g->pin_list[U8G_PI_CS_STATE] == 2 )
|
||||||
|
{
|
||||||
|
u8g_MicroDelay();
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, HIGH);
|
||||||
|
u8g_MicroDelay();
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, LOW);
|
||||||
|
u8g_MicroDelay();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_no_en_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g_com_arduino_no_en_parallel_init(u8g);
|
||||||
|
/* setup the RW pin as output and force it to low */
|
||||||
|
if ( u8g->pin_list[U8G_PI_RW] != U8G_PIN_NONE )
|
||||||
|
{
|
||||||
|
pinMode(u8g->pin_list[U8G_PI_RW], OUTPUT);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RW, LOW);
|
||||||
|
}
|
||||||
|
/* set all pins (except RW pin) */
|
||||||
|
u8g_com_arduino_assign_pin_output_high(u8g);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
/*
|
||||||
|
0: nothing selected
|
||||||
|
1: CS1 will be used as enable line
|
||||||
|
2: CS2 will be used as enable line
|
||||||
|
this will be used in the u8g_com_arduino_no_en_parallel_write() procedure
|
||||||
|
*/
|
||||||
|
u8g->pin_list[U8G_PI_CS_STATE] = arg_val;
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_com_arduino_no_en_parallel_write(u8g, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_no_en_parallel_write(u8g, *ptr++);
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_no_en_parallel_write(u8g, u8g_pgm_read(ptr));
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_DI, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE )
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_no_en_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* ARDUINO */
|
||||||
|
|
|
@ -0,0 +1,187 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_arduino_parallel.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
PIN_D0 8
|
||||||
|
PIN_D1 9
|
||||||
|
PIN_D2 10
|
||||||
|
PIN_D3 11
|
||||||
|
PIN_D4 4
|
||||||
|
PIN_D5 5
|
||||||
|
PIN_D6 6
|
||||||
|
PIN_D7 7
|
||||||
|
|
||||||
|
PIN_CS1 14
|
||||||
|
PIN_CS2 15
|
||||||
|
PIN_RW 16
|
||||||
|
PIN_DI 17
|
||||||
|
PIN_EN 18
|
||||||
|
|
||||||
|
u8g_Init8Bit(u8g, dev, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset)
|
||||||
|
u8g_Init8Bit(u8g, dev, 8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16, U8G_PIN_NONE)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
#include <WProgram.h>
|
||||||
|
#else
|
||||||
|
#include <Arduino.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void u8g_com_arduino_parallel_write(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_D0, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_D1, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_D2, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_D3, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_D4, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_D5, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_D6, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_D7, val&1);
|
||||||
|
|
||||||
|
/* EN cycle time must be 1 micro second, digitalWrite is slow enough to do this */
|
||||||
|
//u8g_Delay(1);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_EN, HIGH);
|
||||||
|
//u8g_Delay(1);
|
||||||
|
u8g_MicroDelay(); /* delay by 1000ns, reference: ST7920: 140ns, SBN1661: 100ns */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_EN, LOW);
|
||||||
|
u8g_10MicroDelay(); /* ST7920 commands: 72us */
|
||||||
|
//u8g_Delay(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
/* setup the RW pin as output and force it to low */
|
||||||
|
if ( u8g->pin_list[U8G_PI_RW] != U8G_PIN_NONE )
|
||||||
|
{
|
||||||
|
pinMode(u8g->pin_list[U8G_PI_RW], OUTPUT);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RW, LOW);
|
||||||
|
}
|
||||||
|
/* set all pins (except RW pin) */
|
||||||
|
u8g_com_arduino_assign_pin_output_high(u8g);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, HIGH);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, HIGH);
|
||||||
|
}
|
||||||
|
else if ( arg_val == 1 )
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, HIGH);
|
||||||
|
}
|
||||||
|
else if ( arg_val == 2 )
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, HIGH);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, LOW);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, LOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_com_arduino_parallel_write(u8g, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_parallel_write(u8g, *ptr++);
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_parallel_write(u8g, u8g_pgm_read(ptr));
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_DI, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE )
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARDUINO */
|
||||||
|
|
|
@ -0,0 +1,168 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_arduino_port_d_wr.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
Assumes PORTD for 8 bit data transfer.
|
||||||
|
EN is assumed to be a low active write signal (WR)
|
||||||
|
|
||||||
|
ILI9325D_320x240 from iteadstudio.com
|
||||||
|
RS=19, WR=18, CS=17, RST=16
|
||||||
|
|
||||||
|
|
||||||
|
u8g_Init8Bit(u8g, dev, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset)
|
||||||
|
u8g_Init8Bit(u8g, dev, 8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16, U8G_PIN_NONE)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARDUINO) && defined(PORTD)
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
#include <WProgram.h>
|
||||||
|
#else
|
||||||
|
#include <Arduino.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_com_arduino_port_d_8bit_wr(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
PORTD = val;
|
||||||
|
|
||||||
|
/* WR cycle time must be 1 micro second, digitalWrite is slow enough to do this */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_EN, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_EN, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_port_d_wr_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
|
||||||
|
#ifdef UCSR0B
|
||||||
|
UCSR0B = 0; // disable USART 0
|
||||||
|
#endif
|
||||||
|
DDRD = 0x0ff;
|
||||||
|
PORTD = 0x0ff;
|
||||||
|
|
||||||
|
/* setup the RW pin as output and force it to low */
|
||||||
|
if ( u8g->pin_list[U8G_PI_RW] != U8G_PIN_NONE )
|
||||||
|
{
|
||||||
|
pinMode(u8g->pin_list[U8G_PI_RW], OUTPUT);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RW, HIGH);
|
||||||
|
}
|
||||||
|
/* set all pins (except RW pin) */
|
||||||
|
u8g_com_arduino_assign_pin_output_high(u8g);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_EN, HIGH);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, HIGH);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, HIGH);
|
||||||
|
}
|
||||||
|
else if ( arg_val == 1 )
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, HIGH);
|
||||||
|
}
|
||||||
|
else if ( arg_val == 2 )
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, HIGH);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, LOW);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, LOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_com_arduino_port_d_8bit_wr(u8g, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_port_d_8bit_wr(u8g, *ptr++);
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_port_d_8bit_wr(u8g, u8g_pgm_read(ptr));
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_DI, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE )
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_port_d_wr_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARDUINO && PORTD */
|
||||||
|
|
|
@ -0,0 +1,201 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_arduino_ssd_i2c.c
|
||||||
|
|
||||||
|
com interface for arduino (AND atmega) and the SSDxxxx chip (SOLOMON) variant
|
||||||
|
I2C protocol
|
||||||
|
|
||||||
|
ToDo: Rename this to u8g_com_avr_ssd_i2c.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
Special pin usage:
|
||||||
|
U8G_PI_I2C_OPTION additional options
|
||||||
|
U8G_PI_A0_STATE used to store the last value of the command/data register selection
|
||||||
|
U8G_PI_SET_A0 1: Signal request to update I2C device with new A0_STATE, 0: Do nothing, A0_STATE matches I2C device
|
||||||
|
U8G_PI_SCL clock line (NOT USED)
|
||||||
|
U8G_PI_SDA data line (NOT USED)
|
||||||
|
|
||||||
|
U8G_PI_RESET reset line (currently disabled, see below)
|
||||||
|
|
||||||
|
Protocol:
|
||||||
|
SLA, Cmd/Data Selection, Arguments
|
||||||
|
The command/data register is selected by a special instruction byte, which is sent after SLA
|
||||||
|
|
||||||
|
The continue bit is always 0 so that a (re)start is equired for the change from cmd to/data mode
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define I2C_SLA (0x3c*2)
|
||||||
|
//#define I2C_CMD_MODE 0x080
|
||||||
|
#define I2C_CMD_MODE 0x000
|
||||||
|
#define I2C_DATA_MODE 0x040
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_ssd_start_sequence(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
/* are we requested to set the a0 state? */
|
||||||
|
if ( u8g->pin_list[U8G_PI_SET_A0] == 0 )
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* setup bus, might be a repeated start */
|
||||||
|
if ( u8g_i2c_start(I2C_SLA) == 0 )
|
||||||
|
return 0;
|
||||||
|
if ( u8g->pin_list[U8G_PI_A0_STATE] == 0 )
|
||||||
|
{
|
||||||
|
if ( u8g_i2c_send_byte(I2C_CMD_MODE) == 0 )
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( u8g_i2c_send_byte(I2C_DATA_MODE) == 0 )
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
u8g->pin_list[U8G_PI_SET_A0] = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
//u8g_com_arduino_digital_write(u8g, U8G_PI_SCL, HIGH);
|
||||||
|
//u8g_com_arduino_digital_write(u8g, U8G_PI_SDA, HIGH);
|
||||||
|
//u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: unknown mode */
|
||||||
|
|
||||||
|
u8g_i2c_init(u8g->pin_list[U8G_PI_I2C_OPTION]);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
/* Currently disabled, but it could be enable. Previous restrictions have been removed */
|
||||||
|
/* u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = 0;
|
||||||
|
u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again, also forces start condition */
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable chip, send stop condition */
|
||||||
|
u8g_i2c_stop();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable, do nothing: any byte writing will trigger the i2c start */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
//u8g->pin_list[U8G_PI_SET_A0] = 1;
|
||||||
|
if ( u8g_com_arduino_ssd_start_sequence(u8g) == 0 )
|
||||||
|
return u8g_i2c_stop(), 0;
|
||||||
|
if ( u8g_i2c_send_byte(arg_val) == 0 )
|
||||||
|
return u8g_i2c_stop(), 0;
|
||||||
|
// u8g_i2c_stop();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
//u8g->pin_list[U8G_PI_SET_A0] = 1;
|
||||||
|
if ( u8g_com_arduino_ssd_start_sequence(u8g) == 0 )
|
||||||
|
return u8g_i2c_stop(), 0;
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
if ( u8g_i2c_send_byte(*ptr++) == 0 )
|
||||||
|
return u8g_i2c_stop(), 0;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// u8g_i2c_stop();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
//u8g->pin_list[U8G_PI_SET_A0] = 1;
|
||||||
|
if ( u8g_com_arduino_ssd_start_sequence(u8g) == 0 )
|
||||||
|
return u8g_i2c_stop(), 0;
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
if ( u8g_i2c_send_byte(u8g_pgm_read(ptr)) == 0 )
|
||||||
|
return 0;
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// u8g_i2c_stop();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
|
||||||
|
u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again */
|
||||||
|
|
||||||
|
#ifdef OLD_CODE
|
||||||
|
if ( i2c_state != 0 )
|
||||||
|
{
|
||||||
|
u8g_i2c_stop();
|
||||||
|
i2c_state = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( u8g_com_arduino_ssd_start_sequence(arg_val) == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* setup bus, might be a repeated start */
|
||||||
|
/*
|
||||||
|
if ( u8g_i2c_start(I2C_SLA) == 0 )
|
||||||
|
return 0;
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
i2c_state = 1;
|
||||||
|
|
||||||
|
if ( u8g_i2c_send_byte(I2C_CMD_MODE) == 0 )
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i2c_state = 2;
|
||||||
|
if ( u8g_i2c_send_byte(I2C_DATA_MODE) == 0 )
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
|
@ -0,0 +1,220 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_arduino_st7920_hw_spi.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
A special HW SPI interface for ST7920 controller
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
#include <WProgram.h>
|
||||||
|
#include "wiring_private.h"
|
||||||
|
#include "pins_arduino.h"
|
||||||
|
|
||||||
|
#else
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "wiring_private.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
#define U8G_ARDUINO_ATMEGA_HW_SPI
|
||||||
|
|
||||||
|
/* remove the definition for attiny */
|
||||||
|
#if __AVR_ARCH__ == 2
|
||||||
|
#undef U8G_ATMEGA_HW_SPI
|
||||||
|
#endif
|
||||||
|
#if __AVR_ARCH__ == 25
|
||||||
|
#undef U8G_ATMEGA_HW_SPI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(U8G_ARDUINO_ATMEGA_HW_SPI)
|
||||||
|
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
static uint8_t u8g_arduino_st7920_hw_spi_shift_out(u8g_t *u8g, uint8_t val) U8G_NOINLINE;
|
||||||
|
static uint8_t u8g_arduino_st7920_hw_spi_shift_out(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
/* send data */
|
||||||
|
SPDR = val;
|
||||||
|
/* wait for transmission */
|
||||||
|
while (!(SPSR & (1<<SPIF)))
|
||||||
|
;
|
||||||
|
/* clear the SPIF flag by reading SPDR */
|
||||||
|
return SPDR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_com_arduino_st7920_write_byte_hw_spi(u8g_t *u8g, uint8_t rs, uint8_t val) U8G_NOINLINE;
|
||||||
|
static void u8g_com_arduino_st7920_write_byte_hw_spi(u8g_t *u8g, uint8_t rs, uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
if ( rs == 0 )
|
||||||
|
{
|
||||||
|
/* command */
|
||||||
|
u8g_arduino_st7920_hw_spi_shift_out(u8g, 0x0f8);
|
||||||
|
}
|
||||||
|
else if ( rs == 1 )
|
||||||
|
{
|
||||||
|
/* data */
|
||||||
|
u8g_arduino_st7920_hw_spi_shift_out(u8g, 0x0fa);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* do nothing, keep same state */
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_arduino_st7920_hw_spi_shift_out(u8g, val & 0x0f0);
|
||||||
|
u8g_arduino_st7920_hw_spi_shift_out(u8g, val << 4);
|
||||||
|
|
||||||
|
for( i = 0; i < 4; i++ )
|
||||||
|
u8g_10MicroDelay();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g_com_arduino_assign_pin_output_high(u8g);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW);
|
||||||
|
|
||||||
|
DDRB |= _BV(3); /* D0, MOSI */
|
||||||
|
DDRB |= _BV(5); /* SCK */
|
||||||
|
DDRB |= _BV(2); /* slave select */
|
||||||
|
|
||||||
|
PORTB &= ~_BV(3); /* D0, MOSI = 0 */
|
||||||
|
PORTB &= ~_BV(5); /* SCK = 0 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
SPR1 SPR0
|
||||||
|
0 0 fclk/4
|
||||||
|
0 1 fclk/16
|
||||||
|
1 0 fclk/64
|
||||||
|
1 1 fclk/128
|
||||||
|
*/
|
||||||
|
SPCR = 0;
|
||||||
|
|
||||||
|
/* 20 Dez 2012: set CPOL and CPHA to 1 !!! */
|
||||||
|
SPCR = (1<<SPE) | (1<<MSTR)|(0<<SPR1)|(0<<SPR0)|(1<<CPOL)|(1<<CPHA);
|
||||||
|
#ifdef U8G_HW_SPI_2X
|
||||||
|
SPSR = (1 << SPI2X); /* double speed, issue 89 */
|
||||||
|
#endif
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE )
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable, note: the st7920 has an active high chip select */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
//u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_com_arduino_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], arg_val);
|
||||||
|
// u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
//u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
|
||||||
|
// u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], u8g_pgm_read(ptr) );
|
||||||
|
// u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /* ARDUINO */
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARDUINO */
|
||||||
|
|
|
@ -0,0 +1,295 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_arduino_st7920_spi.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
A special SPI interface for ST7920 controller
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
#include <WProgram.h>
|
||||||
|
#include "wiring_private.h"
|
||||||
|
#include "pins_arduino.h"
|
||||||
|
|
||||||
|
#else
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "wiring_private.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
|
||||||
|
uint8_t u8g_bitData, u8g_bitNotData;
|
||||||
|
uint8_t u8g_bitClock, u8g_bitNotClock;
|
||||||
|
volatile uint8_t *u8g_outData;
|
||||||
|
volatile uint8_t *u8g_outClock;
|
||||||
|
|
||||||
|
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin)
|
||||||
|
{
|
||||||
|
u8g_outData = portOutputRegister(digitalPinToPort(dataPin));
|
||||||
|
u8g_outClock = portOutputRegister(digitalPinToPort(clockPin));
|
||||||
|
u8g_bitData = digitalPinToBitMask(dataPin);
|
||||||
|
u8g_bitClock = digitalPinToBitMask(clockPin);
|
||||||
|
|
||||||
|
u8g_bitNotClock = u8g_bitClock;
|
||||||
|
u8g_bitNotClock ^= 0x0ff;
|
||||||
|
|
||||||
|
u8g_bitNotData = u8g_bitData;
|
||||||
|
u8g_bitNotData ^= 0x0ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_com_arduino_do_shift_out_msb_first(uint8_t val) U8G_NOINLINE;
|
||||||
|
static void u8g_com_arduino_do_shift_out_msb_first(uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t cnt = 8;
|
||||||
|
uint8_t bitData = u8g_bitData;
|
||||||
|
uint8_t bitNotData = u8g_bitNotData;
|
||||||
|
uint8_t bitClock = u8g_bitClock;
|
||||||
|
uint8_t bitNotClock = u8g_bitNotClock;
|
||||||
|
volatile uint8_t *outData = u8g_outData;
|
||||||
|
volatile uint8_t *outClock = u8g_outClock;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( val & 128 )
|
||||||
|
*outData |= bitData;
|
||||||
|
else
|
||||||
|
*outData &= bitNotData;
|
||||||
|
|
||||||
|
/*
|
||||||
|
*outClock |= bitClock;
|
||||||
|
val <<= 1;
|
||||||
|
cnt--;
|
||||||
|
*outClock &= bitNotClock;
|
||||||
|
*/
|
||||||
|
|
||||||
|
val <<= 1;
|
||||||
|
*outClock &= bitNotClock;
|
||||||
|
cnt--;
|
||||||
|
// removed micro delays, because AVRs are too slow and the delay is not required
|
||||||
|
//u8g_MicroDelay();
|
||||||
|
*outClock |= bitClock;
|
||||||
|
//u8g_MicroDelay();
|
||||||
|
} while( cnt != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(__18CXX) || defined(__PIC32MX)
|
||||||
|
|
||||||
|
uint16_t dog_bitData, dog_bitNotData;
|
||||||
|
uint16_t dog_bitClock, dog_bitNotClock;
|
||||||
|
volatile uint32_t *dog_outData;
|
||||||
|
volatile uint32_t *dog_outClock;
|
||||||
|
volatile uint32_t dog_pic32_spi_tmp;
|
||||||
|
|
||||||
|
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin)
|
||||||
|
{
|
||||||
|
dog_outData = portOutputRegister(digitalPinToPort(dataPin));
|
||||||
|
dog_outClock = portOutputRegister(digitalPinToPort(clockPin));
|
||||||
|
dog_bitData = digitalPinToBitMask(dataPin);
|
||||||
|
dog_bitClock = digitalPinToBitMask(clockPin);
|
||||||
|
|
||||||
|
dog_bitNotClock = dog_bitClock;
|
||||||
|
dog_bitNotClock ^= 0x0ffff;
|
||||||
|
|
||||||
|
dog_bitNotData = dog_bitData;
|
||||||
|
dog_bitNotData ^= 0x0ffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_com_arduino_do_shift_out_msb_first(uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t cnt = 8;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( val & 128 )
|
||||||
|
*dog_outData |= dog_bitData;
|
||||||
|
else
|
||||||
|
*dog_outData &= dog_bitNotData;
|
||||||
|
val <<= 1;
|
||||||
|
//u8g_MicroDelay();
|
||||||
|
//*dog_outClock |= dog_bitClock;
|
||||||
|
*dog_outClock &= dog_bitNotClock;
|
||||||
|
cnt--;
|
||||||
|
u8g_MicroDelay();
|
||||||
|
//*dog_outClock &= dog_bitNotClock;
|
||||||
|
*dog_outClock |= dog_bitClock;
|
||||||
|
u8g_MicroDelay();
|
||||||
|
|
||||||
|
} while( cnt != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* default interface, Arduino DUE (__arm__) */
|
||||||
|
|
||||||
|
uint8_t u8g_data_pin;
|
||||||
|
uint8_t u8g_clock_pin;
|
||||||
|
|
||||||
|
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin)
|
||||||
|
{
|
||||||
|
u8g_data_pin = dataPin;
|
||||||
|
u8g_clock_pin = clockPin;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_com_arduino_do_shift_out_msb_first(uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t cnt = 8;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( val & 128 )
|
||||||
|
digitalWrite(u8g_data_pin, HIGH);
|
||||||
|
else
|
||||||
|
digitalWrite(u8g_data_pin, LOW);
|
||||||
|
val <<= 1;
|
||||||
|
//u8g_MicroDelay();
|
||||||
|
digitalWrite(u8g_clock_pin, LOW);
|
||||||
|
cnt--;
|
||||||
|
u8g_MicroDelay();
|
||||||
|
digitalWrite(u8g_clock_pin, HIGH);
|
||||||
|
u8g_MicroDelay();
|
||||||
|
} while( cnt != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_com_arduino_st7920_write_byte(uint8_t rs, uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
if ( rs == 0 )
|
||||||
|
{
|
||||||
|
/* command */
|
||||||
|
u8g_com_arduino_do_shift_out_msb_first(0x0f8);
|
||||||
|
}
|
||||||
|
else if ( rs == 1 )
|
||||||
|
{
|
||||||
|
/* data */
|
||||||
|
u8g_com_arduino_do_shift_out_msb_first(0x0fa);
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_com_arduino_do_shift_out_msb_first(val & 0x0f0);
|
||||||
|
u8g_com_arduino_do_shift_out_msb_first(val << 4);
|
||||||
|
|
||||||
|
for( i = 0; i < 4; i++ )
|
||||||
|
u8g_10MicroDelay();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_st7920_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g_com_arduino_assign_pin_output_high(u8g);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW);
|
||||||
|
// u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, HIGH);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_MOSI, LOW);
|
||||||
|
u8g_com_arduino_init_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK]);
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE )
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable, note: the st7920 has an active high chip select */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
//u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, HIGH);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_com_arduino_st7920_write_byte( u8g->pin_list[U8G_PI_A0_STATE], arg_val);
|
||||||
|
//u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
//u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_st7920_write_byte(u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
|
||||||
|
//u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_st7920_write_byte(u8g->pin_list[U8G_PI_A0_STATE], u8g_pgm_read(ptr) );
|
||||||
|
//u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* ARDUINO */
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_st7920_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARDUINO */
|
||||||
|
|
|
@ -0,0 +1,144 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_arduino_std_sw_spi.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
#include <WProgram.h>
|
||||||
|
#else
|
||||||
|
#include <Arduino.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void u8g_arduino_sw_spi_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t i = 8;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( val & 128 )
|
||||||
|
digitalWrite(dataPin, HIGH);
|
||||||
|
else
|
||||||
|
digitalWrite(dataPin, LOW);
|
||||||
|
val <<= 1;
|
||||||
|
u8g_MicroDelay(); /* 23 Sep 2012 */
|
||||||
|
//delay(1);
|
||||||
|
digitalWrite(clockPin, HIGH);
|
||||||
|
u8g_MicroDelay(); /* 23 Sep 2012 */
|
||||||
|
//delay(1);
|
||||||
|
digitalWrite(clockPin, LOW);
|
||||||
|
u8g_MicroDelay(); /* 23 Sep 2012 */
|
||||||
|
//delay(1);
|
||||||
|
i--;
|
||||||
|
} while( i != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_std_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g_com_arduino_assign_pin_output_high(u8g);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_MOSI, LOW);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE )
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], *ptr++);
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], u8g_pgm_read(ptr));
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_A0, arg_val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* ARDUINO */
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_std_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARDUINO */
|
||||||
|
|
|
@ -0,0 +1,239 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_arduino_sw_spi.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
#include <WProgram.h>
|
||||||
|
#include "wiring_private.h"
|
||||||
|
#include "pins_arduino.h"
|
||||||
|
|
||||||
|
#else
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "wiring_private.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
|
||||||
|
uint8_t u8g_bitData, u8g_bitNotData;
|
||||||
|
uint8_t u8g_bitClock, u8g_bitNotClock;
|
||||||
|
volatile uint8_t *u8g_outData;
|
||||||
|
volatile uint8_t *u8g_outClock;
|
||||||
|
|
||||||
|
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin)
|
||||||
|
{
|
||||||
|
u8g_outData = portOutputRegister(digitalPinToPort(dataPin));
|
||||||
|
u8g_outClock = portOutputRegister(digitalPinToPort(clockPin));
|
||||||
|
u8g_bitData = digitalPinToBitMask(dataPin);
|
||||||
|
u8g_bitClock = digitalPinToBitMask(clockPin);
|
||||||
|
|
||||||
|
u8g_bitNotClock = u8g_bitClock;
|
||||||
|
u8g_bitNotClock ^= 0x0ff;
|
||||||
|
|
||||||
|
u8g_bitNotData = u8g_bitData;
|
||||||
|
u8g_bitNotData ^= 0x0ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_com_arduino_do_shift_out_msb_first(uint8_t val) U8G_NOINLINE;
|
||||||
|
static void u8g_com_arduino_do_shift_out_msb_first(uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t cnt = 8;
|
||||||
|
uint8_t bitData = u8g_bitData;
|
||||||
|
uint8_t bitNotData = u8g_bitNotData;
|
||||||
|
uint8_t bitClock = u8g_bitClock;
|
||||||
|
uint8_t bitNotClock = u8g_bitNotClock;
|
||||||
|
volatile uint8_t *outData = u8g_outData;
|
||||||
|
volatile uint8_t *outClock = u8g_outClock;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( val & 128 )
|
||||||
|
*outData |= bitData;
|
||||||
|
else
|
||||||
|
*outData &= bitNotData;
|
||||||
|
|
||||||
|
*outClock |= bitClock;
|
||||||
|
val <<= 1;
|
||||||
|
cnt--;
|
||||||
|
*outClock &= bitNotClock;
|
||||||
|
} while( cnt != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(__18CXX) || defined(__PIC32MX)
|
||||||
|
|
||||||
|
uint16_t dog_bitData, dog_bitNotData;
|
||||||
|
uint16_t dog_bitClock, dog_bitNotClock;
|
||||||
|
volatile uint32_t *dog_outData;
|
||||||
|
volatile uint32_t *dog_outClock;
|
||||||
|
volatile uint32_t dog_pic32_spi_tmp;
|
||||||
|
|
||||||
|
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin)
|
||||||
|
{
|
||||||
|
dog_outData = portOutputRegister(digitalPinToPort(dataPin));
|
||||||
|
dog_outClock = portOutputRegister(digitalPinToPort(clockPin));
|
||||||
|
dog_bitData = digitalPinToBitMask(dataPin);
|
||||||
|
dog_bitClock = digitalPinToBitMask(clockPin);
|
||||||
|
|
||||||
|
dog_bitNotClock = dog_bitClock;
|
||||||
|
dog_bitNotClock ^= 0x0ffff;
|
||||||
|
|
||||||
|
dog_bitNotData = dog_bitData;
|
||||||
|
dog_bitNotData ^= 0x0ffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_com_arduino_do_shift_out_msb_first(uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t cnt = 8;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( val & 128 )
|
||||||
|
*dog_outData |= dog_bitData;
|
||||||
|
else
|
||||||
|
*dog_outData &= dog_bitNotData;
|
||||||
|
val <<= 1;
|
||||||
|
/*
|
||||||
|
There must be some delay here. However
|
||||||
|
fetching the adress dog_outClock is enough delay, so
|
||||||
|
do not place dog_outClock in a local variable. This will
|
||||||
|
break the procedure
|
||||||
|
*/
|
||||||
|
*dog_outClock |= dog_bitClock;
|
||||||
|
cnt--;
|
||||||
|
*dog_outClock &= dog_bitNotClock;
|
||||||
|
/*
|
||||||
|
little additional delay after clk pulse, done by 3x32bit reads
|
||||||
|
from I/O. Optimized for PIC32 with 80 MHz.
|
||||||
|
*/
|
||||||
|
dog_pic32_spi_tmp = *dog_outClock;
|
||||||
|
dog_pic32_spi_tmp = *dog_outClock;
|
||||||
|
dog_pic32_spi_tmp = *dog_outClock;
|
||||||
|
} while( cnt != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* empty interface */
|
||||||
|
|
||||||
|
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_com_arduino_do_shift_out_msb_first(uint8_t val)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g_com_arduino_assign_pin_output_high(u8g);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_MOSI, LOW);
|
||||||
|
u8g_com_arduino_init_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE )
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_com_arduino_do_shift_out_msb_first( arg_val );
|
||||||
|
//u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_do_shift_out_msb_first(*ptr++);
|
||||||
|
// u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], *ptr++);
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_do_shift_out_msb_first( u8g_pgm_read(ptr) );
|
||||||
|
//u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], u8g_pgm_read(ptr));
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_A0, arg_val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* ARDUINO */
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARDUINO */
|
||||||
|
|
|
@ -0,0 +1,385 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_arduino_t6963.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
PIN_D0 8
|
||||||
|
PIN_D1 9
|
||||||
|
PIN_D2 10
|
||||||
|
PIN_D3 11
|
||||||
|
PIN_D4 4
|
||||||
|
PIN_D5 5
|
||||||
|
PIN_D6 6
|
||||||
|
PIN_D7 7
|
||||||
|
|
||||||
|
PIN_CS 14
|
||||||
|
PIN_A0 15
|
||||||
|
PIN_RESET 16
|
||||||
|
PIN_WR 17
|
||||||
|
PIN_RD 18
|
||||||
|
|
||||||
|
u8g_InitRW8Bit(u8g, dev, d0, d1, d2, d3, d4, d5, d6, d7, cs, a0, wr, rd, reset)
|
||||||
|
u8g_InitRW8Bit(u8g, dev, 8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
|
||||||
|
#if ARDUINO < 100
|
||||||
|
//#include <WProgram.h>
|
||||||
|
#include <wiring_private.h>
|
||||||
|
#include <pins_arduino.h>
|
||||||
|
#else
|
||||||
|
#include <Arduino.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__PIC32MX)
|
||||||
|
/* CHIPKIT PIC32 */
|
||||||
|
static volatile uint32_t *u8g_output_data_port[8];
|
||||||
|
static volatile uint32_t *u8g_input_data_port[8];
|
||||||
|
static volatile uint32_t *u8g_mode_port[8];
|
||||||
|
static uint32_t u8g_data_mask[8];
|
||||||
|
#else
|
||||||
|
static volatile uint8_t *u8g_output_data_port[8];
|
||||||
|
static volatile uint8_t *u8g_input_data_port[8];
|
||||||
|
static volatile uint8_t *u8g_mode_port[8];
|
||||||
|
static uint8_t u8g_data_mask[8];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_com_arduino_t6963_init(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
u8g_output_data_port[0] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D0]));
|
||||||
|
u8g_input_data_port[0] = portInputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D0]));
|
||||||
|
u8g_mode_port[0] = portModeRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D0]));
|
||||||
|
u8g_data_mask[0] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D0]);
|
||||||
|
|
||||||
|
u8g_output_data_port[1] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D1]));
|
||||||
|
u8g_input_data_port[1] = portInputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D1]));
|
||||||
|
u8g_mode_port[1] = portModeRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D1]));
|
||||||
|
u8g_data_mask[1] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D1]);
|
||||||
|
|
||||||
|
u8g_output_data_port[2] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D2]));
|
||||||
|
u8g_input_data_port[2] = portInputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D2]));
|
||||||
|
u8g_mode_port[2] = portModeRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D2]));
|
||||||
|
u8g_data_mask[2] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D2]);
|
||||||
|
|
||||||
|
u8g_output_data_port[3] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D3]));
|
||||||
|
u8g_input_data_port[3] = portInputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D3]));
|
||||||
|
u8g_mode_port[3] = portModeRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D3]));
|
||||||
|
u8g_data_mask[3] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D3]);
|
||||||
|
|
||||||
|
u8g_output_data_port[4] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D4]));
|
||||||
|
u8g_input_data_port[4] = portInputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D4]));
|
||||||
|
u8g_mode_port[4] = portModeRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D4]));
|
||||||
|
u8g_data_mask[4] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D4]);
|
||||||
|
|
||||||
|
u8g_output_data_port[5] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D5]));
|
||||||
|
u8g_input_data_port[5] = portInputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D5]));
|
||||||
|
u8g_mode_port[5] = portModeRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D5]));
|
||||||
|
u8g_data_mask[5] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D5]);
|
||||||
|
|
||||||
|
u8g_output_data_port[6] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D6]));
|
||||||
|
u8g_input_data_port[6] = portInputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D6]));
|
||||||
|
u8g_mode_port[6] = portModeRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D6]));
|
||||||
|
u8g_data_mask[6] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D6]);
|
||||||
|
|
||||||
|
u8g_output_data_port[7] = portOutputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D7]));
|
||||||
|
u8g_input_data_port[7] = portInputRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D7]));
|
||||||
|
u8g_mode_port[7] = portModeRegister(digitalPinToPort(u8g->pin_list[U8G_PI_D7]));
|
||||||
|
u8g_data_mask[7] = digitalPinToBitMask(u8g->pin_list[U8G_PI_D7]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_com_arduino_t6963_write_data_pin(uint8_t pin, uint8_t val)
|
||||||
|
{
|
||||||
|
if ( val != 0 )
|
||||||
|
*u8g_output_data_port[pin] |= u8g_data_mask[pin];
|
||||||
|
else
|
||||||
|
*u8g_output_data_port[pin] &= ~u8g_data_mask[pin];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_com_arduino_t6963_set_port_output(void)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
for( i = 0; i < 8; i++ )
|
||||||
|
{
|
||||||
|
#if defined(__PIC32MX)
|
||||||
|
/* CHIPKIT PIC32 */
|
||||||
|
*u8g_mode_port[i] |= u8g_data_mask[i];
|
||||||
|
#elif defined(__AVR__)
|
||||||
|
*u8g_mode_port[i] |= u8g_data_mask[i];
|
||||||
|
#else
|
||||||
|
/* TODO: use generic Arduino API */
|
||||||
|
*u8g_mode_port[i] |= u8g_data_mask[i];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_com_arduino_t6963_set_port_input(void)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
for( i = 0; i < 8; i++ )
|
||||||
|
{
|
||||||
|
#if defined(__PIC32MX)
|
||||||
|
/* CHIPKIT PIC32 */
|
||||||
|
*u8g_mode_port[i] &= ~u8g_data_mask[i];
|
||||||
|
#elif defined(__AVR__)
|
||||||
|
/* avr */
|
||||||
|
*u8g_mode_port[i] &= ~u8g_data_mask[i];
|
||||||
|
*u8g_output_data_port[i] &= ~u8g_data_mask[i]; // no pullup
|
||||||
|
#else
|
||||||
|
/* TODO: use generic Arduino API */
|
||||||
|
*u8g_mode_port[i] &= ~u8g_data_mask[i];
|
||||||
|
*u8g_output_data_port[i] &= ~u8g_data_mask[i]; // no pullup
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_com_arduino_t6963_write(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
u8g_com_arduino_t6963_write_data_pin( 0, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_t6963_write_data_pin( 1, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_t6963_write_data_pin( 2, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_t6963_write_data_pin( 3, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
|
||||||
|
u8g_com_arduino_t6963_write_data_pin( 4, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_t6963_write_data_pin( 5, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_t6963_write_data_pin( 6, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
u8g_com_arduino_t6963_write_data_pin( 7, val&1 );
|
||||||
|
val >>= 1;
|
||||||
|
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_WR, 0);
|
||||||
|
u8g_MicroDelay(); /* 80ns, reference: t6963 datasheet */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_WR, 1);
|
||||||
|
u8g_MicroDelay(); /* 10ns, reference: t6963 datasheet */
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t u8g_com_arduino_t6963_read(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
uint8_t val = 0;
|
||||||
|
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RD, 0);
|
||||||
|
u8g_MicroDelay(); /* 150ns, reference: t6963 datasheet */
|
||||||
|
|
||||||
|
/* only read bits 0, 1 and 3 */
|
||||||
|
if ( (*u8g_input_data_port[3] & u8g_data_mask[3]) != 0 )
|
||||||
|
val++;
|
||||||
|
val <<= 1;
|
||||||
|
val <<= 1;
|
||||||
|
if ( (*u8g_input_data_port[1] & u8g_data_mask[1]) != 0 )
|
||||||
|
val++;
|
||||||
|
val <<= 1;
|
||||||
|
if ( (*u8g_input_data_port[0] & u8g_data_mask[0]) != 0 )
|
||||||
|
val++;
|
||||||
|
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RD, 1);
|
||||||
|
u8g_MicroDelay(); /* 10ns, reference: t6963 datasheet */
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define U8G_STATUS_TIMEOUT 50
|
||||||
|
|
||||||
|
static uint8_t u8g_com_arduino_t6963_until_01_ok(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
long x;
|
||||||
|
|
||||||
|
u8g_com_arduino_t6963_set_port_input();
|
||||||
|
x = millis();
|
||||||
|
x += U8G_STATUS_TIMEOUT;
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
if ( (u8g_com_arduino_t6963_read(u8g) & 3) == 3 )
|
||||||
|
break;
|
||||||
|
if ( x < millis() )
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
u8g_com_arduino_t6963_set_port_output();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t u8g_com_arduino_t6963_until_3_ok(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
long x;
|
||||||
|
|
||||||
|
u8g_com_arduino_t6963_set_port_input();
|
||||||
|
x = millis();
|
||||||
|
x += U8G_STATUS_TIMEOUT;
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
if ( (u8g_com_arduino_t6963_read(u8g) & 8) == 8 )
|
||||||
|
break;
|
||||||
|
if ( x < millis() )
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
u8g_com_arduino_t6963_set_port_output();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t u8g_com_arduino_t6963_write_cmd(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_A0, 1);
|
||||||
|
if ( u8g_com_arduino_t6963_until_01_ok(u8g) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_A0, 1);
|
||||||
|
u8g_com_arduino_t6963_write(u8g, val);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t u8g_com_arduino_t6963_write_data(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_A0, 1);
|
||||||
|
if ( u8g_com_arduino_t6963_until_01_ok(u8g) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_A0, 0);
|
||||||
|
u8g_com_arduino_t6963_write(u8g, val);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t u8g_com_arduino_t6963_write_auto_data(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_A0, 1);
|
||||||
|
if ( u8g_com_arduino_t6963_until_3_ok(u8g) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_A0, 0);
|
||||||
|
u8g_com_arduino_t6963_write(u8g, val);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_t6963_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = 0;
|
||||||
|
u8g_com_arduino_t6963_init(u8g);
|
||||||
|
/* setup the RW (equal to WR) pin as output and force it to high */
|
||||||
|
if ( u8g->pin_list[U8G_PI_WR] != U8G_PIN_NONE )
|
||||||
|
{
|
||||||
|
pinMode(u8g->pin_list[U8G_PI_WR], OUTPUT);
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_WR, HIGH);
|
||||||
|
}
|
||||||
|
/* set all pins (except WR pin) */
|
||||||
|
u8g_com_arduino_assign_pin_output_high(u8g);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable, active low chip select */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
if ( u8g->pin_list[U8G_PI_A0_STATE] == 0 )
|
||||||
|
{
|
||||||
|
u8g_com_arduino_t6963_write_data(u8g, arg_val);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u8g_com_arduino_t6963_write_cmd(u8g, arg_val);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
u8g_com_arduino_t6963_write_cmd(u8g, 0x0b0); /* auto write */
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
if ( u8g_com_arduino_t6963_write_auto_data(u8g, *ptr++) == 0 )
|
||||||
|
break;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
u8g_com_arduino_t6963_write_cmd(u8g, 0x0b2); /* auto reset */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
u8g_com_arduino_t6963_write_cmd(u8g, 0x0b0); /* auto write */
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
if ( u8g_com_arduino_t6963_write_auto_data(u8g, u8g_pgm_read(ptr)) == 0 )
|
||||||
|
break;
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
u8g_com_arduino_t6963_write_cmd(u8g, 0x0b2); /* auto reset */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 1) or data mode (arg_val = 0) */
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
|
||||||
|
//u8g_com_arduino_digital_write(u8g, U8G_PI_DI, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE )
|
||||||
|
u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_arduino_t6963_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* ARDUINO */
|
||||||
|
|
|
@ -0,0 +1,174 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_atmega_hw_spi.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
Assumes, that
|
||||||
|
MOSI is at PORTB, Pin 3
|
||||||
|
and
|
||||||
|
SCK is at PORTB, Pin 5
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
#define U8G_ATMEGA_HW_SPI
|
||||||
|
|
||||||
|
/* remove the definition for attiny */
|
||||||
|
#if __AVR_ARCH__ == 2
|
||||||
|
#undef U8G_ATMEGA_HW_SPI
|
||||||
|
#endif
|
||||||
|
#if __AVR_ARCH__ == 25
|
||||||
|
#undef U8G_ATMEGA_HW_SPI
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(U8G_ATMEGA_HW_SPI)
|
||||||
|
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
|
||||||
|
static uint8_t u8g_atmega_spi_out(uint8_t data)
|
||||||
|
{
|
||||||
|
/* unsigned char x = 100; */
|
||||||
|
/* send data */
|
||||||
|
SPDR = data;
|
||||||
|
/* wait for transmission */
|
||||||
|
while (!(SPSR & (1<<SPIF)))
|
||||||
|
;
|
||||||
|
/* clear the SPIF flag by reading SPDR */
|
||||||
|
return SPDR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_atmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_CS);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_A0);
|
||||||
|
|
||||||
|
DDRB |= _BV(3); /* D0, MOSI */
|
||||||
|
DDRB |= _BV(5); /* SCK */
|
||||||
|
DDRB |= _BV(2); /* slave select */
|
||||||
|
|
||||||
|
PORTB &= ~_BV(3); /* D0, MOSI = 0 */
|
||||||
|
PORTB &= ~_BV(5); /* SCK = 0 */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
SPR1 SPR0
|
||||||
|
0 0 fclk/4 x
|
||||||
|
0 1 fclk/16
|
||||||
|
1 0 fclk/64
|
||||||
|
1 1 fclk/128
|
||||||
|
*/
|
||||||
|
SPCR = 0;
|
||||||
|
SPCR = (1<<SPE) | (1<<MSTR)|(0<<SPR1)|(0<<SPR0)|(0<<CPOL)|(0<<CPHA);
|
||||||
|
#ifdef U8G_HW_SPI_2X
|
||||||
|
SPSR = (1 << SPI2X); /* double speed, issue 89 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_A0, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PORTB &= ~_BV(5); /* SCK = 0 */
|
||||||
|
/* enable */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 0); /* CS = 0 (low active) */
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_atmega_spi_out(arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_atmega_spi_out(*ptr++);
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_atmega_spi_out(u8g_pgm_read(ptr));
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
uint8_t u8g_com_atmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,183 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_atmega_parallel.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
PIN_D0 8
|
||||||
|
PIN_D1 9
|
||||||
|
PIN_D2 10
|
||||||
|
PIN_D3 11
|
||||||
|
PIN_D4 4
|
||||||
|
PIN_D5 5
|
||||||
|
PIN_D6 6
|
||||||
|
PIN_D7 7
|
||||||
|
|
||||||
|
PIN_CS1 14
|
||||||
|
PIN_CS2 15
|
||||||
|
PIN_RW 16
|
||||||
|
PIN_DI 17
|
||||||
|
PIN_EN 18
|
||||||
|
|
||||||
|
u8g_Init8Bit(u8g, dev, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset)
|
||||||
|
u8g_Init8Bit(u8g, dev, 8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16, U8G_PIN_NONE)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
|
||||||
|
static void u8g_com_atmega_parallel_write(u8g_t *u8g, uint8_t val) U8G_NOINLINE;
|
||||||
|
static void u8g_com_atmega_parallel_write(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_D0, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_D1, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_D2, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_D3, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_D4, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_D5, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_D6, val&1);
|
||||||
|
val >>= 1;
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_D7, val&1);
|
||||||
|
|
||||||
|
/* EN cycle time must be 1 micro second */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_EN, 1);
|
||||||
|
u8g_MicroDelay(); /* delay by 1000ns, reference: ST7920: 140ns, SBN1661: 100ns */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_EN, 0);
|
||||||
|
u8g_10MicroDelay(); /* ST7920 commands: 72us */
|
||||||
|
u8g_10MicroDelay(); /* ST7920 commands: 72us */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_atmega_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
/* setup the RW pin as output and force it to low */
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_RW);
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_RW, 0);
|
||||||
|
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_D0);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_D1);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_D2);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_D3);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_D4);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_D5);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_D6);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_D7);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_EN);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_CS1);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_CS2);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_DI);
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS1, 1);
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS2, 1);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS1, 1);
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS2, 1);
|
||||||
|
}
|
||||||
|
else if ( arg_val == 1 )
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS1, 0);
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS2, 1);
|
||||||
|
}
|
||||||
|
else if ( arg_val == 2 )
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS1, 1);
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS2, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS1, 0);
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS2, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_com_atmega_parallel_write(u8g, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_atmega_parallel_write(u8g, *ptr++);
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_atmega_parallel_write(u8g, u8g_pgm_read(ptr));
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_DI, arg_val);
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
uint8_t u8g_com_atmega_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARDUINO */
|
||||||
|
|
|
@ -0,0 +1,205 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_atmega_st7920_hw_spi.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
A special SPI interface for ST7920 controller with HW SPI Support
|
||||||
|
|
||||||
|
Assumes, that
|
||||||
|
MOSI is at PORTB, Pin 3
|
||||||
|
and
|
||||||
|
SCK is at PORTB, Pin 5
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
#define U8G_ATMEGA_HW_SPI
|
||||||
|
|
||||||
|
/* remove the definition for attiny */
|
||||||
|
#if __AVR_ARCH__ == 2
|
||||||
|
#undef U8G_ATMEGA_HW_SPI
|
||||||
|
#endif
|
||||||
|
#if __AVR_ARCH__ == 25
|
||||||
|
#undef U8G_ATMEGA_HW_SPI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(U8G_ATMEGA_HW_SPI)
|
||||||
|
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
static uint8_t u8g_atmega_st7920_hw_spi_shift_out(u8g_t *u8g, uint8_t val) U8G_NOINLINE;
|
||||||
|
static uint8_t u8g_atmega_st7920_hw_spi_shift_out(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
/* send data */
|
||||||
|
SPDR = val;
|
||||||
|
/* wait for transmission */
|
||||||
|
while (!(SPSR & (1<<SPIF)))
|
||||||
|
;
|
||||||
|
/* clear the SPIF flag by reading SPDR */
|
||||||
|
return SPDR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_com_atmega_st7920_write_byte_hw_spi(u8g_t *u8g, uint8_t rs, uint8_t val) U8G_NOINLINE;
|
||||||
|
static void u8g_com_atmega_st7920_write_byte_hw_spi(u8g_t *u8g, uint8_t rs, uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
if ( rs == 0 )
|
||||||
|
{
|
||||||
|
/* command */
|
||||||
|
u8g_atmega_st7920_hw_spi_shift_out(u8g, 0x0f8);
|
||||||
|
}
|
||||||
|
else if ( rs == 1 )
|
||||||
|
{
|
||||||
|
/* data */
|
||||||
|
u8g_atmega_st7920_hw_spi_shift_out(u8g, 0x0fa);
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_atmega_st7920_hw_spi_shift_out(u8g, val & 0x0f0);
|
||||||
|
u8g_atmega_st7920_hw_spi_shift_out(u8g, val << 4);
|
||||||
|
|
||||||
|
for( i = 0; i < 4; i++ )
|
||||||
|
u8g_10MicroDelay();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_atmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_CS);
|
||||||
|
//u8g_SetPIOutput(u8g, U8G_PI_A0);
|
||||||
|
|
||||||
|
DDRB |= _BV(3); /* D0, MOSI */
|
||||||
|
DDRB |= _BV(5); /* SCK */
|
||||||
|
DDRB |= _BV(2); /* slave select */
|
||||||
|
|
||||||
|
PORTB &= ~_BV(3); /* D0, MOSI = 0 */
|
||||||
|
PORTB &= ~_BV(5); /* SCK = 0 */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
SPR1 SPR0
|
||||||
|
0 0 fclk/4
|
||||||
|
0 1 fclk/16
|
||||||
|
1 0 fclk/64
|
||||||
|
1 1 fclk/128
|
||||||
|
*/
|
||||||
|
SPCR = 0;
|
||||||
|
|
||||||
|
/* maybe set CPOL and CPHA to 1 */
|
||||||
|
/* 20 Dez 2012: did set CPOL and CPHA to 1 in Arduino variant! */
|
||||||
|
SPCR = (1<<SPE) | (1<<MSTR)|(0<<SPR1)|(0<<SPR0)|(0<<CPOL)|(0<<CPHA);
|
||||||
|
#ifdef U8G_HW_SPI_2X
|
||||||
|
SPSR = (1 << SPI2X); /* double speed, issue 89 */
|
||||||
|
#endif
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable, note: the st7920 has an active high chip select */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* u8g_SetPILevel(u8g, U8G_PI_SCK, 0 ); */
|
||||||
|
/* enable */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 1); /* CS = 1 (high active) */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_com_atmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], arg_val);
|
||||||
|
//u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_atmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
|
||||||
|
//u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_atmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], u8g_pgm_read(ptr));
|
||||||
|
//u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_atmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,170 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_atmega_st7920_spi.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
A special SPI interface for ST7920 controller
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
|
||||||
|
static void u8g_atmega_st7920_sw_spi_shift_out(u8g_t *u8g, uint8_t val) U8G_NOINLINE;
|
||||||
|
static void u8g_atmega_st7920_sw_spi_shift_out(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t i = 8;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_MOSI, val & 128 );
|
||||||
|
val <<= 1;
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_SCK, 1 );
|
||||||
|
u8g_MicroDelay(); /* 15 Aug 2012: added for high speed uC */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_SCK, 0 );
|
||||||
|
u8g_MicroDelay(); /* 15 Aug 2012: added for high speed uC */
|
||||||
|
i--;
|
||||||
|
} while( i != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_com_atmega_st7920_write_byte(u8g_t *u8g, uint8_t rs, uint8_t val) U8G_NOINLINE;
|
||||||
|
static void u8g_com_atmega_st7920_write_byte(u8g_t *u8g, uint8_t rs, uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
if ( rs == 0 )
|
||||||
|
{
|
||||||
|
/* command */
|
||||||
|
u8g_atmega_st7920_sw_spi_shift_out(u8g, 0x0f8);
|
||||||
|
}
|
||||||
|
else if ( rs == 1 )
|
||||||
|
{
|
||||||
|
/* data */
|
||||||
|
u8g_atmega_st7920_sw_spi_shift_out(u8g, 0x0fa);
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_atmega_st7920_sw_spi_shift_out(u8g, val & 0x0f0);
|
||||||
|
u8g_atmega_st7920_sw_spi_shift_out(u8g, val << 4);
|
||||||
|
|
||||||
|
for( i = 0; i < 4; i++ )
|
||||||
|
u8g_10MicroDelay();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_atmega_st7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_SCK);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_MOSI);
|
||||||
|
/* u8g_SetPIOutput(u8g, U8G_PI_A0); */
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_CS);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_RESET);
|
||||||
|
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_SCK, 0 );
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_MOSI, 0 );
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 0 );
|
||||||
|
/* u8g_SetPILevel(u8g, U8G_PI_A0, 0); */
|
||||||
|
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable, note: the st7920 has an active high chip select */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* u8g_SetPILevel(u8g, U8G_PI_SCK, 0 ); */
|
||||||
|
/* enable */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 1); /* CS = 1 (high active) */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_com_atmega_st7920_write_byte(u8g, u8g->pin_list[U8G_PI_A0_STATE], arg_val);
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_atmega_st7920_write_byte(u8g, u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_com_atmega_st7920_write_byte(u8g, u8g->pin_list[U8G_PI_A0_STATE], u8g_pgm_read(ptr));
|
||||||
|
u8g->pin_list[U8G_PI_A0_STATE] = 2;
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_atmega_st7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,141 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_atmega_sw_spi.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
|
||||||
|
static void u8g_atmega_sw_spi_shift_out(u8g_t *u8g, uint8_t val) U8G_NOINLINE;
|
||||||
|
static void u8g_atmega_sw_spi_shift_out(u8g_t *u8g, uint8_t val)
|
||||||
|
{
|
||||||
|
uint8_t i = 8;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_MOSI, val & 128 );
|
||||||
|
val <<= 1;
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_SCK, 1 );
|
||||||
|
u8g_MicroDelay(); /* 15 Aug 2012: added for high speed uC */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_SCK, 0 );
|
||||||
|
u8g_MicroDelay(); /* 15 Aug 2012: added for high speed uC */
|
||||||
|
i--;
|
||||||
|
} while( i != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_com_atmega_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_SCK);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_MOSI);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_A0);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_CS);
|
||||||
|
u8g_SetPIOutput(u8g, U8G_PI_RESET);
|
||||||
|
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_SCK, 0 );
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_MOSI, 0 );
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 1 );
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_A0, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_A0, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
|
||||||
|
if ( arg_val == 0 )
|
||||||
|
{
|
||||||
|
/* disable */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_SCK, 0 );
|
||||||
|
/* enable */
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_CS, 0); /* CS = 0 (low active) */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_RESET:
|
||||||
|
u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
u8g_atmega_sw_spi_shift_out(u8g, arg_val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_atmega_sw_spi_shift_out(u8g, *ptr++);
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ_P:
|
||||||
|
{
|
||||||
|
register uint8_t *ptr = arg_ptr;
|
||||||
|
while( arg_val > 0 )
|
||||||
|
{
|
||||||
|
u8g_atmega_sw_spi_shift_out(u8g, u8g_pgm_read(ptr));
|
||||||
|
ptr++;
|
||||||
|
arg_val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_com_atmega_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,249 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_i2c.c
|
||||||
|
|
||||||
|
generic i2c interface
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
static uint8_t u8g_i2c_err_code;
|
||||||
|
|
||||||
|
/*
|
||||||
|
position values
|
||||||
|
1: start condition
|
||||||
|
2: sla transfer
|
||||||
|
*/
|
||||||
|
static uint8_t u8g_i2c_err_pos;
|
||||||
|
|
||||||
|
|
||||||
|
void u8g_i2c_clear_error(void)
|
||||||
|
{
|
||||||
|
u8g_i2c_err_code = U8G_I2C_ERR_NONE;
|
||||||
|
u8g_i2c_err_pos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_i2c_get_error(void)
|
||||||
|
{
|
||||||
|
return u8g_i2c_err_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_i2c_get_err_pos(void)
|
||||||
|
{
|
||||||
|
return u8g_i2c_err_pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_i2c_set_error(uint8_t code, uint8_t pos)
|
||||||
|
{
|
||||||
|
if ( u8g_i2c_err_code > 0 )
|
||||||
|
return;
|
||||||
|
u8g_i2c_err_code |= code;
|
||||||
|
u8g_i2c_err_pos = pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
#define U8G_ATMEGA_HW_TWI
|
||||||
|
|
||||||
|
/* remove the definition for attiny */
|
||||||
|
#if __AVR_ARCH__ == 2
|
||||||
|
#undef U8G_ATMEGA_HW_TWI
|
||||||
|
#endif
|
||||||
|
#if __AVR_ARCH__ == 25
|
||||||
|
#undef U8G_ATMEGA_HW_TWI
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(U8G_ATMEGA_HW_TWI)
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <util/twi.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void u8g_i2c_init(uint8_t options)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
TWBR: bit rate register
|
||||||
|
TWSR: status register (contains preselector bits)
|
||||||
|
|
||||||
|
prescalar
|
||||||
|
0 1
|
||||||
|
1 4
|
||||||
|
2 16
|
||||||
|
3 64
|
||||||
|
|
||||||
|
f = F_CPU/(16+2*TWBR*prescalar)
|
||||||
|
|
||||||
|
F_CPU = 16MHz
|
||||||
|
TWBR = 152;
|
||||||
|
TWSR = 0;
|
||||||
|
--> 50KHz
|
||||||
|
|
||||||
|
TWBR = 72;
|
||||||
|
TWSR = 0;
|
||||||
|
--> 100KHz
|
||||||
|
|
||||||
|
F_CPU/(2*100000)-8 --> calculate TWBR value for 100KHz
|
||||||
|
*/
|
||||||
|
TWSR = 0;
|
||||||
|
TWBR = F_CPU/(2*100000)-8;
|
||||||
|
u8g_i2c_clear_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos)
|
||||||
|
{
|
||||||
|
volatile uint16_t cnt = 2000; /* timout value should be > 280 for 50KHz Bus and 16 Mhz CPU, however the start condition might need longer */
|
||||||
|
while( !(TWCR & mask) )
|
||||||
|
{
|
||||||
|
if ( cnt == 0 )
|
||||||
|
{
|
||||||
|
u8g_i2c_set_error(U8G_I2C_ERR_TIMEOUT, pos);
|
||||||
|
return 0; /* error */
|
||||||
|
}
|
||||||
|
cnt--;
|
||||||
|
}
|
||||||
|
return 1; /* all ok */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* sla includes all 8 bits (with r/w bit), assums master transmit */
|
||||||
|
uint8_t u8g_i2c_start(uint8_t sla)
|
||||||
|
{
|
||||||
|
register uint8_t status;
|
||||||
|
|
||||||
|
/* send start */
|
||||||
|
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);
|
||||||
|
|
||||||
|
/* wait */
|
||||||
|
if ( u8g_i2c_wait(_BV(TWINT), 1) == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
status = TW_STATUS;
|
||||||
|
|
||||||
|
/* check status after start */
|
||||||
|
if ( status != TW_START && status != TW_REP_START )
|
||||||
|
{
|
||||||
|
u8g_i2c_set_error(U8G_I2C_ERR_BUS, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set slave address */
|
||||||
|
TWDR = sla;
|
||||||
|
|
||||||
|
/* enable sla transfer */
|
||||||
|
TWCR = _BV(TWINT) | _BV(TWEN);
|
||||||
|
|
||||||
|
/* wait */
|
||||||
|
if ( u8g_i2c_wait(_BV(TWINT), 2) == 0 )
|
||||||
|
return 0;
|
||||||
|
status = TW_STATUS;
|
||||||
|
|
||||||
|
/* check status after sla */
|
||||||
|
if ( status != TW_MT_SLA_ACK )
|
||||||
|
{
|
||||||
|
u8g_i2c_set_error(U8G_I2C_ERR_BUS, 2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_i2c_send_byte(uint8_t data)
|
||||||
|
{
|
||||||
|
register uint8_t status;
|
||||||
|
TWDR = data;
|
||||||
|
TWCR = _BV(TWINT) | _BV(TWEN);
|
||||||
|
if ( u8g_i2c_wait(_BV(TWINT), 3) == 0 )
|
||||||
|
return 0;
|
||||||
|
status = TW_STATUS;
|
||||||
|
|
||||||
|
if ( status != TW_MT_DATA_ACK )
|
||||||
|
{
|
||||||
|
u8g_i2c_set_error(U8G_I2C_ERR_BUS, 3);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_i2c_stop(void)
|
||||||
|
{
|
||||||
|
/* write stop */
|
||||||
|
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTO);
|
||||||
|
|
||||||
|
/* no error is checked for the stop condition */
|
||||||
|
u8g_i2c_wait(_BV(TWSTO), 4);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void twi_send(uint8_t adr, uint8_t data1, uint8_t data2)
|
||||||
|
{
|
||||||
|
u8g_i2c_start(adr<<1);
|
||||||
|
u8g_i2c_send_byte(data1);
|
||||||
|
u8g_i2c_send_byte(data2);
|
||||||
|
u8g_i2c_stop();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* empty interface */
|
||||||
|
|
||||||
|
void u8g_i2c_init(uint8_t options)
|
||||||
|
{
|
||||||
|
u8g_i2c_clear_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_i2c_start(uint8_t sla)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
uint8_t u8g_i2c_send_byte(uint8_t data)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_i2c_stop(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
218
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g_com_io.c
Normal file
218
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g_com_io.c
Normal file
|
@ -0,0 +1,218 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_io.c
|
||||||
|
|
||||||
|
abstraction layer for low level i/o
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
typedef volatile uint8_t * IO_PTR;
|
||||||
|
|
||||||
|
/* create internal pin number */
|
||||||
|
uint8_t u8g_Pin(uint8_t port, uint8_t bitpos)
|
||||||
|
{
|
||||||
|
port <<= 3;
|
||||||
|
port += bitpos;
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
const IO_PTR u8g_avr_ddr_P[] PROGMEM = {
|
||||||
|
#ifdef DDRA
|
||||||
|
&DDRA,
|
||||||
|
#else
|
||||||
|
0,
|
||||||
|
#endif
|
||||||
|
&DDRB,
|
||||||
|
#ifdef DDRC
|
||||||
|
&DDRC,
|
||||||
|
#ifdef DDRD
|
||||||
|
&DDRD,
|
||||||
|
#ifdef DDRE
|
||||||
|
&DDRE,
|
||||||
|
#ifdef DDRF
|
||||||
|
&DDRF,
|
||||||
|
#ifdef DDRG
|
||||||
|
&DDRG,
|
||||||
|
#ifdef DDRH
|
||||||
|
&DDRH,
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const IO_PTR u8g_avr_port_P[] PROGMEM = {
|
||||||
|
#ifdef PORTA
|
||||||
|
&PORTA,
|
||||||
|
#else
|
||||||
|
0,
|
||||||
|
#endif
|
||||||
|
&PORTB,
|
||||||
|
#ifdef PORTC
|
||||||
|
&PORTC,
|
||||||
|
#ifdef PORTD
|
||||||
|
&PORTD,
|
||||||
|
#ifdef PORTE
|
||||||
|
&PORTE,
|
||||||
|
#ifdef PORTF
|
||||||
|
&PORTF,
|
||||||
|
#ifdef PORTG
|
||||||
|
&PORTG,
|
||||||
|
#ifdef PORTH
|
||||||
|
&PORTH,
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
const IO_PTR u8g_avr_pin_P[] PROGMEM = {
|
||||||
|
#ifdef PINA
|
||||||
|
&PINA,
|
||||||
|
#else
|
||||||
|
0,
|
||||||
|
#endif
|
||||||
|
&PINB,
|
||||||
|
#ifdef PINC
|
||||||
|
&PINC,
|
||||||
|
#ifdef PIND
|
||||||
|
&PIND,
|
||||||
|
#ifdef PINE
|
||||||
|
&PINE,
|
||||||
|
#ifdef PINF
|
||||||
|
&PINF,
|
||||||
|
#ifdef PING
|
||||||
|
&PING,
|
||||||
|
#ifdef PINH
|
||||||
|
&PINH,
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static volatile uint8_t *u8g_get_avr_io_ptr(const IO_PTR *base, uint8_t offset)
|
||||||
|
{
|
||||||
|
volatile uint8_t * tmp;
|
||||||
|
base += offset;
|
||||||
|
memcpy_P(&tmp, base, sizeof(volatile uint8_t * PROGMEM));
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set direction to output of the specified pin (internal pin number) */
|
||||||
|
void u8g_SetPinOutput(uint8_t internal_pin_number)
|
||||||
|
{
|
||||||
|
*u8g_get_avr_io_ptr(u8g_avr_ddr_P, internal_pin_number>>3) |= _BV(internal_pin_number&7);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetPinInput(uint8_t internal_pin_number)
|
||||||
|
{
|
||||||
|
*u8g_get_avr_io_ptr(u8g_avr_ddr_P, internal_pin_number>>3) &= ~_BV(internal_pin_number&7);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetPinLevel(uint8_t internal_pin_number, uint8_t level)
|
||||||
|
{
|
||||||
|
volatile uint8_t * tmp = u8g_get_avr_io_ptr(u8g_avr_port_P, internal_pin_number>>3);
|
||||||
|
|
||||||
|
if ( level == 0 )
|
||||||
|
*tmp &= ~_BV(internal_pin_number&7);
|
||||||
|
else
|
||||||
|
*tmp |= _BV(internal_pin_number&7);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_GetPinLevel(uint8_t internal_pin_number)
|
||||||
|
{
|
||||||
|
volatile uint8_t * tmp = u8g_get_avr_io_ptr(u8g_avr_pin_P, internal_pin_number>>3);
|
||||||
|
if ( ((*tmp) & _BV(internal_pin_number&7)) != 0 )
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
uint8_t u8g_Pin(uint8_t port, uint8_t bitpos)
|
||||||
|
{
|
||||||
|
port <<= 3;
|
||||||
|
port += bitpos;
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetPinOutput(uint8_t internal_pin_number)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetPinInput(uint8_t internal_pin_number)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetPinLevel(uint8_t internal_pin_number, uint8_t level)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_GetPinLevel(uint8_t internal_pin_number)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void u8g_SetPIOutput(u8g_t *u8g, uint8_t pi)
|
||||||
|
{
|
||||||
|
uint8_t pin;
|
||||||
|
pin = u8g->pin_list[pi];
|
||||||
|
if ( pin != U8G_PIN_NONE )
|
||||||
|
u8g_SetPinOutput(pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetPILevel(u8g_t *u8g, uint8_t pi, uint8_t level)
|
||||||
|
{
|
||||||
|
uint8_t pin;
|
||||||
|
pin = u8g->pin_list[pi];
|
||||||
|
if ( pin != U8G_PIN_NONE )
|
||||||
|
u8g_SetPinLevel(pin, level);
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_com_null.c
|
||||||
|
|
||||||
|
communication null device
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
uint8_t u8g_com_null_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_COM_MSG_INIT:
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_STOP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case U8G_COM_MSG_CHIP_SELECT:
|
||||||
|
/* arg_val contains the chip number, which should be enabled */
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case U8G_COM_MSG_WRITE_BYTE:
|
||||||
|
break;
|
||||||
|
case U8G_COM_MSG_WRITE_SEQ:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_cursor.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
void u8g_SetCursorFont(u8g_t *u8g, const u8g_pgm_uint8_t *cursor_font)
|
||||||
|
{
|
||||||
|
u8g->cursor_font = cursor_font;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetCursorStyle(u8g_t *u8g, uint8_t encoding)
|
||||||
|
{
|
||||||
|
u8g->cursor_encoding = encoding;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetCursorColor(u8g_t *u8g, uint8_t fg, uint8_t bg)
|
||||||
|
{
|
||||||
|
u8g->cursor_bg_color = bg;
|
||||||
|
u8g->cursor_fg_color = fg;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_SetCursorPos(u8g_t *u8g, u8g_uint_t cursor_x, u8g_uint_t cursor_y)
|
||||||
|
{
|
||||||
|
u8g->cursor_x = cursor_x;
|
||||||
|
u8g->cursor_y = cursor_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_EnableCursor(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
u8g->cursor_fn = u8g_DrawCursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_DisableCursor(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
u8g->cursor_fn = (u8g_draw_cursor_fn)0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_DrawCursor(u8g_t *u8g)
|
||||||
|
{
|
||||||
|
const u8g_pgm_uint8_t *font;
|
||||||
|
uint8_t color;
|
||||||
|
uint8_t encoding = u8g->cursor_encoding;
|
||||||
|
|
||||||
|
/* get current values */
|
||||||
|
color = u8g_GetColorIndex(u8g);
|
||||||
|
font = u8g->font;
|
||||||
|
|
||||||
|
/* draw cursor */
|
||||||
|
u8g->font = u8g->cursor_font;
|
||||||
|
encoding++;
|
||||||
|
u8g_SetColorIndex(u8g, u8g->cursor_bg_color);
|
||||||
|
/* 27. Jan 2013: replaced call to u8g_DrawGlyph with call to u8g_draw_glyph */
|
||||||
|
/* required, because y adjustment should not happen to the cursor fonts */
|
||||||
|
u8g_draw_glyph(u8g, u8g->cursor_x, u8g->cursor_y, encoding);
|
||||||
|
encoding--;
|
||||||
|
u8g_SetColorIndex(u8g, u8g->cursor_fg_color);
|
||||||
|
/* 27. Jan 2013: replaced call to u8g_DrawGlyph with call to u8g_draw_glyph */
|
||||||
|
/* required, because y adjustment should not happen to the cursor fonts */
|
||||||
|
/* u8g_DrawGlyph(u8g, u8g->cursor_x, u8g->cursor_y, encoding); */
|
||||||
|
u8g_draw_glyph(u8g, u8g->cursor_x, u8g->cursor_y, encoding);
|
||||||
|
|
||||||
|
/* restore previous values */
|
||||||
|
u8g->font = font;
|
||||||
|
u8g_SetColorIndex(u8g, color);
|
||||||
|
}
|
||||||
|
|
215
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g_delay.c
Normal file
215
ArduinoAddons/Arduino_0.xx/libraries/U8glib/utility/u8g_delay.c
Normal file
|
@ -0,0 +1,215 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_delay.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
/*==== Part 1: Derive suitable delay procedure ====*/
|
||||||
|
|
||||||
|
#if defined(ARDUINO)
|
||||||
|
# if defined(__AVR__)
|
||||||
|
# define USE_AVR_DELAY
|
||||||
|
# elif defined(__PIC32MX)
|
||||||
|
# define USE_PIC32_DELAY
|
||||||
|
# elif defined(__arm__) /* Arduino Due */
|
||||||
|
# define USE_ARDUINO_DELAY
|
||||||
|
# else
|
||||||
|
# define USE_ARDUINO_DELAY
|
||||||
|
# endif
|
||||||
|
#elif defined(__AVR__)
|
||||||
|
# define USE_AVR_DELAY
|
||||||
|
#elif defined(__18CXX)
|
||||||
|
# define USE_PIC18_DELAY
|
||||||
|
#else
|
||||||
|
# define USE_DUMMY_DELAY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*==== Part 2: Definition of the delay procedures ====*/
|
||||||
|
|
||||||
|
/*== AVR Delay ==*/
|
||||||
|
|
||||||
|
#if defined(USE_AVR_DELAY)
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
Delay by the provided number of milliseconds.
|
||||||
|
Thus, a 16 bit value will allow a delay of 0..65 seconds
|
||||||
|
Makes use of the _delay_loop_2
|
||||||
|
|
||||||
|
_delay_loop_2 will do a delay of n * 4 prozessor cycles.
|
||||||
|
with f = F_CPU cycles per second,
|
||||||
|
n = f / (1000 * 4 )
|
||||||
|
with f = 16000000 the result is 4000
|
||||||
|
with f = 1000000 the result is 250
|
||||||
|
|
||||||
|
the millisec loop, gcc requires the following overhead:
|
||||||
|
- movev 1
|
||||||
|
- subwi 2x2
|
||||||
|
- bne i 2
|
||||||
|
==> 7 cycles
|
||||||
|
==> must be devided by 4, rounded up 7/4 = 2
|
||||||
|
*/
|
||||||
|
void u8g_Delay(uint16_t val)
|
||||||
|
{
|
||||||
|
/* old version did a call to the arduino lib: delay(val); */
|
||||||
|
while( val != 0 )
|
||||||
|
{
|
||||||
|
_delay_loop_2( (F_CPU / 4000 ) -2);
|
||||||
|
val--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* delay by one micro second */
|
||||||
|
void u8g_MicroDelay(void)
|
||||||
|
{
|
||||||
|
#if (F_CPU / 4000000 ) > 0
|
||||||
|
_delay_loop_2( (F_CPU / 4000000 ) );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* delay by 10 micro seconds */
|
||||||
|
void u8g_10MicroDelay(void)
|
||||||
|
{
|
||||||
|
#if (F_CPU / 400000 ) > 0
|
||||||
|
_delay_loop_2( (F_CPU / 400000 ) );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*== Delay for PIC18 (not tested) ==*/
|
||||||
|
|
||||||
|
#if defined(USE_PIC18_DELAY)
|
||||||
|
#include <delays.h>
|
||||||
|
#define GetSystemClock() (64000000ul) // Hz
|
||||||
|
#define GetInstructionClock() (GetSystemClock()/4)
|
||||||
|
|
||||||
|
void u8g_Delay(uint16_t val)
|
||||||
|
{/*
|
||||||
|
unsigned int _iTemp = (val);
|
||||||
|
while(_iTemp--)
|
||||||
|
Delay1KTCYx((GetInstructionClock()+999999)/1000000);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
void u8g_MicroDelay(void)
|
||||||
|
{
|
||||||
|
/* not implemented */
|
||||||
|
}
|
||||||
|
void u8g_10MicroDelay(void)
|
||||||
|
{
|
||||||
|
/* not implemented */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*== Arduino Delay ==*/
|
||||||
|
#if defined(USE_ARDUINO_DELAY)
|
||||||
|
void u8g_Delay(uint16_t val)
|
||||||
|
{
|
||||||
|
delay(val);
|
||||||
|
}
|
||||||
|
void u8g_MicroDelay(void)
|
||||||
|
{
|
||||||
|
delayMicroseconds(1);
|
||||||
|
}
|
||||||
|
void u8g_10MicroDelay(void)
|
||||||
|
{
|
||||||
|
delayMicroseconds(10);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(USE_PIC32_DELAY)
|
||||||
|
/*
|
||||||
|
Assume chipkit here with F_CPU correctly defined
|
||||||
|
The problem was, that u8g_Delay() is called within the constructor.
|
||||||
|
It seems that the chipkit is not fully setup at this time, so a
|
||||||
|
call to delay() will not work. So here is my own implementation.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#define CPU_COUNTS_PER_SECOND (F_CPU/2UL)
|
||||||
|
#define TICKS_PER_MILLISECOND (CPU_COUNTS_PER_SECOND/1000UL)
|
||||||
|
#include "plib.h"
|
||||||
|
void u8g_Delay(uint16_t val)
|
||||||
|
{
|
||||||
|
uint32_t d;
|
||||||
|
uint32_t s;
|
||||||
|
d = val;
|
||||||
|
d *= TICKS_PER_MILLISECOND;
|
||||||
|
s = ReadCoreTimer();
|
||||||
|
while ( (uint32_t)(ReadCoreTimer() - s) < d )
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_MicroDelay(void)
|
||||||
|
{
|
||||||
|
uint32_t d;
|
||||||
|
uint32_t s;
|
||||||
|
d = TICKS_PER_MILLISECOND/1000;
|
||||||
|
s = ReadCoreTimer();
|
||||||
|
while ( (uint32_t)(ReadCoreTimer() - s) < d )
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
void u8g_10MicroDelay(void)
|
||||||
|
{
|
||||||
|
uint32_t d;
|
||||||
|
uint32_t s;
|
||||||
|
d = TICKS_PER_MILLISECOND/100;
|
||||||
|
s = ReadCoreTimer();
|
||||||
|
while ( (uint32_t)(ReadCoreTimer() - s) < d )
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*== Any other systems: Dummy Delay ==*/
|
||||||
|
#if defined(USE_DUMMY_DELAY)
|
||||||
|
void u8g_Delay(uint16_t val)
|
||||||
|
{
|
||||||
|
/* do not know how to delay... */
|
||||||
|
}
|
||||||
|
void u8g_MicroDelay(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void u8g_10MicroDelay(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_flipdisc.c
|
||||||
|
|
||||||
|
1-Bit (BW) Driver for flip disc matrix
|
||||||
|
2x 7 pixel height
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 28
|
||||||
|
#define HEIGHT 14
|
||||||
|
#define PAGE_HEIGHT 14
|
||||||
|
|
||||||
|
/*
|
||||||
|
Write data to the flip disc matrix.
|
||||||
|
This procedure must be implemented by the user.
|
||||||
|
Arguments:
|
||||||
|
id: Id for the matrix. Currently always 0.
|
||||||
|
page: A page has a height of 14 pixel. For a matrix with HEIGHT == 14 this will be always 0
|
||||||
|
width: The width of the flip disc matrix. Always equal to WIDTH
|
||||||
|
row1: first data line (7 pixel per byte)
|
||||||
|
row2: first data line (7 pixel per byte)
|
||||||
|
*/
|
||||||
|
void writeFlipDiscMatrix(uint8_t id, uint8_t page, uint8_t width, uint8_t *row1, uint8_t *row2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void (*u8g_write_flip_disc_matrix)(uint8_t id, uint8_t page, uint8_t width, uint8_t *row1, uint8_t *row2);
|
||||||
|
|
||||||
|
void u8g_SetFlipDiscCallback(u8g_t *u8g, void (*cb)(uint8_t id, uint8_t page, uint8_t width, uint8_t *row1, uint8_t *row2))
|
||||||
|
{
|
||||||
|
u8g_write_flip_disc_matrix = cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_flipdisc_2x7_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
/* current page: pb->p.page */
|
||||||
|
/* ptr to the buffer: pb->buf */
|
||||||
|
|
||||||
|
(*u8g_write_flip_disc_matrix)(0, pb->p.page, WIDTH, pb->buf, pb->buf+WIDTH);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb14v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_flipdisc_2x7_bw_buf[WIDTH*2] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_flipdisc_2x7_bw_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_flipdisc_2x7_bw_buf};
|
||||||
|
u8g_dev_t u8g_dev_flipdisc_2x7 = { u8g_dev_flipdisc_2x7_bw_fn, &u8g_dev_flipdisc_2x7_bw_pb, u8g_com_null_fn };
|
|
@ -0,0 +1,130 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_gprof.c
|
||||||
|
|
||||||
|
Device for performance measurement with gprof.
|
||||||
|
Does not write any data, but uses a buffer.
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
uint8_t u8g_dev_gprof_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg);
|
||||||
|
|
||||||
|
uint8_t u8g_pb_dev_gprof_buf[WIDTH];
|
||||||
|
u8g_pb_t u8g_pb_dev_gprof = { {PAGE_HEIGHT, HEIGHT, 0, 0, 0}, WIDTH, u8g_pb_dev_gprof_buf };
|
||||||
|
|
||||||
|
u8g_dev_t u8g_dev_gprof = { u8g_dev_gprof_fn, &u8g_pb_dev_gprof, NULL };
|
||||||
|
|
||||||
|
uint8_t u8g_dev_gprof_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_FIRST:
|
||||||
|
u8g_pb_Clear(pb);
|
||||||
|
u8g_page_First(&(pb->p));
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
uint8_t i, j;
|
||||||
|
uint8_t page_height;
|
||||||
|
page_height = pb->p.page_y1;
|
||||||
|
page_height -= pb->p.page_y0;
|
||||||
|
page_height++;
|
||||||
|
for( j = 0; j < page_height; j++ )
|
||||||
|
{
|
||||||
|
printf("%02d ", j);
|
||||||
|
for( i = 0; i < WIDTH; i++ )
|
||||||
|
{
|
||||||
|
if ( (u8g_pb_dev_stdout_buf[i] & (1<<j)) != 0 )
|
||||||
|
printf("#");
|
||||||
|
else
|
||||||
|
printf(".");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
if ( u8g_page_Next(&(pb->p)) == 0 )
|
||||||
|
{
|
||||||
|
//printf("\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
u8g_pb_Clear(pb);
|
||||||
|
break;
|
||||||
|
#ifdef U8G_DEV_MSG_IS_BBX_INTERSECTION
|
||||||
|
case U8G_DEV_MSG_IS_BBX_INTERSECTION:
|
||||||
|
{
|
||||||
|
u8g_dev_arg_bbx_t *bbx = (u8g_dev_arg_bbx_t *)arg;
|
||||||
|
u8g_uint_t x2, y2;
|
||||||
|
|
||||||
|
y2 = bbx->y;
|
||||||
|
y2 += bbx->h;
|
||||||
|
y2--;
|
||||||
|
|
||||||
|
if ( u8g_pb_IsYIntersection(pb, bbx->y, y2) == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* maybe this one can be skiped... probability is very high to have an intersection, so it would be ok to always return 1 */
|
||||||
|
x2 = bbx->x;
|
||||||
|
x2 += bbx->w;
|
||||||
|
x2--;
|
||||||
|
|
||||||
|
if ( u8g_pb_IsXIntersection(pb, bbx->x, x2) == 0 )
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
case U8G_DEV_MSG_GET_PAGE_BOX:
|
||||||
|
u8g_pb_GetPageBox(pb, (u8g_box_t *)arg);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SET_COLOR_INDEX:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SET_XY_CB:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
|
@ -0,0 +1,326 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ili9325d_320x240.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
Color format
|
||||||
|
Red: 5 Bit
|
||||||
|
Green: 6 Bit
|
||||||
|
Blue: 5 Bit
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 240
|
||||||
|
|
||||||
|
#if defined(U8G_16BIT)
|
||||||
|
#define HEIGHT 320
|
||||||
|
#else
|
||||||
|
/* if the user tries to compile the 8Bit version of the lib, then restrict the height to something which fits to 8Bit */
|
||||||
|
#define HEIGHT 240
|
||||||
|
#endif
|
||||||
|
#define PAGE_HEIGHT 4
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
reference board for this device:
|
||||||
|
http://iteadstudio.com/store/index.php?main_page=product_info&cPath=57_58&products_id=55
|
||||||
|
documentation:
|
||||||
|
http://iteadstudio.com/Downloadfile/ITDB02_material.rar
|
||||||
|
datasheet
|
||||||
|
http://www.newhavendisplay.com/app_notes/ILI9325D.pdf
|
||||||
|
other libs
|
||||||
|
http://henningkarlsen.com/electronics/library.php
|
||||||
|
init sequence
|
||||||
|
http://code.google.com/p/itdb02/, ITDB02.cpp, iteadstudio.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ili9325d_320x240_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
|
||||||
|
//U8G_ESC_ADR(0), 0x000, 0x0E5, /* only used for none D version: set SRAM internal timing */
|
||||||
|
//U8G_ESC_ADR(1), 0x078, 0x0f0,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x001, /* Driver Output Control, bits 8 & 10 */
|
||||||
|
U8G_ESC_ADR(1), 0x001, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x002, /* LCD Driving Wave Control, bit 9: Set line inversion */
|
||||||
|
U8G_ESC_ADR(1), 0x002, 0x000, /* ITDB02 none D verion: 0x007, 0x000 */
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x003, /* Entry Mode, GRAM write direction and BGR=1 */
|
||||||
|
U8G_ESC_ADR(1), 0x010, 0x030,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x004, /* Resize register */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x008, /* Display Control 2: set the back porch and front porch */
|
||||||
|
U8G_ESC_ADR(1), 0x002, 0x007,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x009, /* Display Control 3 */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x00a, /* Display Control 4: FMARK */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x00c, /* RGB Display Interface Control 1 */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x00d, /* Frame Maker Position */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x00f, /* RGB Display Interface Control 2 */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x010, /* Power Control 1: SAP, BT[3:0], AP, DSTB, SLP, STB */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x011, /* Power Control 2: DC1[2:0], DC0[2:0], VC[2:0] */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x007,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x012, /* Power Control 3: VREG1OUT voltage */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x013, /* Power Control 4: VDV[4:0] for VCOM amplitude */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x007, /* Display Control 1: Operate, but do not display */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x001,
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */ /* ITDB02 none D verion: 50ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x010, /* Power Control 1: SAP, BT[3:0], AP, DSTB, SLP, STB */
|
||||||
|
U8G_ESC_ADR(1), 0x016, 0x090, /* ITDB02 none D verion: 0x010, 0x090 */
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x011, /* Power Control 2: SAP, BT[3:0], AP, DSTB, SLP, STB */
|
||||||
|
U8G_ESC_ADR(1), 0x002, 0x027,
|
||||||
|
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x012, /* Power Control 3: VCI: External, VCI*1.80 */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x00d, /* ITDB02 none D verion: 0x000, 0x01f */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x013, /* Power Control 4: VDV[4:0] for VCOM amplitude */
|
||||||
|
U8G_ESC_ADR(1), 0x012, 0x000, /* ITDB02 none D verion: 0x015, 0x000 */
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x029, /* Power Control 7 */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x00a, /* ITDB02 none D verion: 0x000, 0x027 */
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x02b, /* Frame Rate: 83 */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x00d,
|
||||||
|
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x020, /* Horizontal GRAM Address Set */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x021, /* Vertical GRAM Address Set */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
|
||||||
|
/* gamma control */
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x030,
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x031,
|
||||||
|
U8G_ESC_ADR(1), 0x004, 0x004,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x032,
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x003,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x035,
|
||||||
|
U8G_ESC_ADR(1), 0x004, 0x005,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x036,
|
||||||
|
U8G_ESC_ADR(1), 0x008, 0x008,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x037,
|
||||||
|
U8G_ESC_ADR(1), 0x004, 0x007,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x038,
|
||||||
|
U8G_ESC_ADR(1), 0x003, 0x003,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x039,
|
||||||
|
U8G_ESC_ADR(1), 0x007, 0x007,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x03c,
|
||||||
|
U8G_ESC_ADR(1), 0x005, 0x004,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x03d,
|
||||||
|
U8G_ESC_ADR(1), 0x008, 0x008,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x050, /* Horizontal GRAM Start Address */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x051, /* Horizontal GRAM End Address: 239 */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x0EF,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x052, /* Vertical GRAM Start Address */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x053, /* Vertical GRAM End Address: 319 */
|
||||||
|
U8G_ESC_ADR(1), 0x001, 0x03F,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x060, /* Driver Output Control 2 */
|
||||||
|
U8G_ESC_ADR(1), 0x0a7, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x061, /* Base Image Display Control: NDL,VLE, REV */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x001,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x06a, /* Vertical Scroll Control */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x080, /* Partial Image 1 Display Position */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x081, /* Partial Image 1 RAM Start Address */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x082, /* Partial Image 1 RAM End Address */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x083, /* Partial Image 2 Display Position */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x084, /* Partial Image 2 RAM Start Address */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x085, /* Partial Image 2 RAM End Address */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x090, /* Panel Interface Control 1 */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x010,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x092, /* Panel Interface Control 2 */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000, /* 0x006, 0x000 */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x007, /* Display Control 1: Operate, display ON */
|
||||||
|
U8G_ESC_ADR(1), 0x001, 0x033,
|
||||||
|
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
|
||||||
|
/* write test pattern */
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x020, /* Horizontal GRAM Address Set */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x021, /* Vertical GRAM Address Set */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x010,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x022, /* Write Data to GRAM */
|
||||||
|
U8G_ESC_ADR(1), 0x0fe, 0x0fe,
|
||||||
|
0x000, 0x000,
|
||||||
|
0x0fe, 0x0fe,
|
||||||
|
0x000, 0x000,
|
||||||
|
0x0fe, 0x0fe,
|
||||||
|
0x000, 0x000,
|
||||||
|
0x0fe, 0x0fe,
|
||||||
|
0x000, 0x000,
|
||||||
|
0x0fe, 0x0fe,
|
||||||
|
0x000, 0x000,
|
||||||
|
0x0fe, 0x0fe,
|
||||||
|
0x000, 0x000,
|
||||||
|
0x0fe, 0x0fe,
|
||||||
|
0x000, 0x000,
|
||||||
|
0x0fe, 0x0fe,
|
||||||
|
0x000, 0x000,
|
||||||
|
0x0fe, 0x0fe,
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ili9325d_320x240_page_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x020, /* Horizontal GRAM Address Set */
|
||||||
|
U8G_ESC_ADR(1), 0x000, 0x000,
|
||||||
|
U8G_ESC_ADR(0), 0x000, 0x021, /* Vertical GRAM Address Set */
|
||||||
|
U8G_ESC_ADR(1),
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* convert the internal RGB 332 to 65K high byte */
|
||||||
|
static uint8_t u8g_dev_ili9325d_get_65K_high_byte(uint8_t color)
|
||||||
|
{
|
||||||
|
uint8_t h;
|
||||||
|
h = color;
|
||||||
|
h &= 0x0e0;
|
||||||
|
h |= h>>3;
|
||||||
|
h &= 0x0f8;
|
||||||
|
color>>=2;
|
||||||
|
color &= 7;
|
||||||
|
h |= color;
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* convert the internal RGB 332 to 65K high byte */
|
||||||
|
static uint8_t u8g_dev_ili9325d_get_65K_low_byte(uint8_t color)
|
||||||
|
{
|
||||||
|
uint8_t l;
|
||||||
|
l = color;
|
||||||
|
l <<= 3;
|
||||||
|
color &= 3;
|
||||||
|
color <<= 1;
|
||||||
|
l |= color;
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ili9325d_320x240_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
//for(;;)
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ili9325d_320x240_init_seq);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
uint16_t y, j;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
for( i = 0; i < pb->p.page_height; i ++ )
|
||||||
|
{
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ili9325d_320x240_page_seq);
|
||||||
|
u8g_WriteByte(u8g, dev, y >> 8 ); /* display ram (cursor) address high byte */
|
||||||
|
u8g_WriteByte(u8g, dev, y & 255 ); /* display ram (cursor) address low byte */
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0 );
|
||||||
|
u8g_WriteByte(u8g, dev, 0x022 ); /* start gram data */
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
|
||||||
|
for( j = 0; j < pb->width; j++ )
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, u8g_dev_ili9325d_get_65K_high_byte(*ptr) );
|
||||||
|
u8g_WriteByte(u8g, dev, u8g_dev_ili9325d_get_65K_low_byte(*ptr) );
|
||||||
|
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h8_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_ili9325d_320x240_8h8_buf[WIDTH*PAGE_HEIGHT] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_ili9325d_320x240_8h8_pb U8G_NOCOMMON = { {PAGE_HEIGHT, HEIGHT, 0, 0, 0}, WIDTH, u8g_ili9325d_320x240_8h8_buf};
|
||||||
|
u8g_dev_t u8g_dev_ili9325d_320x240_8bit U8G_NOCOMMON = { u8g_dev_ili9325d_320x240_fn, &u8g_ili9325d_320x240_8h8_pb, u8g_com_arduino_port_d_wr_fn };
|
||||||
|
//u8g_dev_t u8g_dev_ili9325d_320x240_8bit = { u8g_dev_ili9325d_320x240_fn, &u8g_ili9325d_320x240_8h8_pb, u8g_com_arduino_parallel_fn };
|
||||||
|
|
||||||
|
//U8G_PB_DEV(u8g_dev_ili9325d_320x240_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ili9325d_320x240_fn, U8G_COM_PARALLEL);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ks0108_128x64.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
ADDRESS = 0 (Command Mode)
|
||||||
|
0x03f Display On
|
||||||
|
0x0c0 Start Display at line 0
|
||||||
|
0x040 | y write to y address (y:0..63)
|
||||||
|
0x0b8 | x write to page [0..7]
|
||||||
|
|
||||||
|
|
||||||
|
u8g_Init8Bit(u8g, dev, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, cs2, di, rw, reset)
|
||||||
|
u8g_Init8Bit(u8g, dev, 8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16, U8G_PIN_NONE)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ks0108_128x64_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip 1 */
|
||||||
|
0x03f, /* display on */
|
||||||
|
0x0c0, /* start at line 0 */
|
||||||
|
U8G_ESC_DLY(20), /* delay 20 ms */
|
||||||
|
U8G_ESC_CS(2), /* enable chip 2 */
|
||||||
|
0x03f, /* display on */
|
||||||
|
0x0c0, /* start at line 0 */
|
||||||
|
U8G_ESC_DLY(20), /* delay 20 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable all chips */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ks0108_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ks0108_128x64_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* command mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 2);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b8 | pb->p.page); /* select current page (KS0108b) */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x040 ); /* set address 0 */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, 64, pb->buf);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* command mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b8 | pb->p.page); /* select current page (KS0108b) */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x040 ); /* set address 0 */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, 64, 64+(uint8_t *)pb->buf);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_ks0108_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ks0108_128x64_fn, U8G_COM_PARALLEL);
|
||||||
|
U8G_PB_DEV(u8g_dev_ks0108_128x64_fast, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ks0108_128x64_fn, U8G_COM_FAST_PARALLEL);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,147 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_lc7981_160x80.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 160
|
||||||
|
#define HEIGHT 80
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
code ideas:
|
||||||
|
https://github.com/vsergeev/embedded-drivers/tree/master/avr-lc7981
|
||||||
|
data sheets:
|
||||||
|
http://www.lcd-module.de/eng/pdf/zubehoer/lc7981.pdf
|
||||||
|
http://www.lcd-module.de/pdf/grafik/w160-6.pdf
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_lc7981_160x80_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x000, /* mode register */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x032, /* display on (bit 5), master mode on (bit 4), graphics mode on (bit 1)*/
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x001, /* character/bits per pixel pitch */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x007, /* 8 bits per pixel */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x002, /* number of chars/byte width of the screen */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
WIDTH/8-1, /* 8 bits per pixel */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x003, /* time division */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x07f, /* */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x008, /* display start low */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x009, /* display start high */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_lc7981_160x80_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_lc7981_160x80_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint16_t disp_ram_adr;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
disp_ram_adr = WIDTH/8;
|
||||||
|
disp_ram_adr *= y;
|
||||||
|
for( i = 0; i < 8; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00a ); /* display ram (cursor) address low byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr & 0x0ff );
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00b ); /* display ram (cursor) address hight byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr >> 8 );
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00c ); /* write data */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
disp_ram_adr += WIDTH/8;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h1f_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_lc7981_160x80_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_lc7981_160x80_fn, U8G_COM_FAST_PARALLEL);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_lc7981_240x128.c
|
||||||
|
|
||||||
|
Hitachi Display SP14N002
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 240
|
||||||
|
#define HEIGHT 128
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://www.mark-products.com/graphics.htm#240x128%20Pixel%20Format
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_lc7981_240x128_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x000, /* mode register */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x032, /* display on (bit 5), master mode on (bit 4), graphics mode on (bit 1)*/
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x001, /* character/bits per pixel pitch */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x007, /* 8 bits per pixel */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x002, /* number of chars/byte width of the screen */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
WIDTH/8-1, /* 8 bits per pixel */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x003, /* time division */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x07f, /* */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x008, /* display start low */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x009, /* display start high */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_lc7981_240x128_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_lc7981_240x128_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint16_t disp_ram_adr;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
disp_ram_adr = WIDTH/8;
|
||||||
|
disp_ram_adr *= y;
|
||||||
|
for( i = 0; i < 8; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00a ); /* display ram (cursor) address low byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr & 0x0ff );
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00b ); /* display ram (cursor) address hight byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr >> 8 );
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00c ); /* write data */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
disp_ram_adr += WIDTH/8;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h1f_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_lc7981_240x128_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_lc7981_240x128_fn, U8G_COM_FAST_PARALLEL);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_lc7981_240x64.c
|
||||||
|
|
||||||
|
Tested with Nan Ya LM_J6_003_
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 240
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://www.mark-products.com/graphics.htm#240x64%20Pixel%20Format
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_lc7981_240x64_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x000, /* mode register */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x032, /* display on (bit 5), master mode on (bit 4), graphics mode on (bit 1)*/
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x001, /* character/bits per pixel pitch */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x007, /* 8 bits per pixel */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x002, /* number of chars/byte width of the screen */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
WIDTH/8-1, /* 8 bits per pixel */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x003, /* time division */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x07f, /* */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x008, /* display start low */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x009, /* display start high */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_lc7981_240x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_lc7981_240x64_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint16_t disp_ram_adr;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
disp_ram_adr = WIDTH/8;
|
||||||
|
disp_ram_adr *= y;
|
||||||
|
for( i = 0; i < 8; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00a ); /* display ram (cursor) address low byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr & 0x0ff );
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00b ); /* display ram (cursor) address hight byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr >> 8 );
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00c ); /* write data */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
disp_ram_adr += WIDTH/8;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h1f_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_lc7981_240x64_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_lc7981_240x64_fn, U8G_COM_FAST_PARALLEL);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_lc7981_320x64.c
|
||||||
|
|
||||||
|
Note: Requires 16 bit mode (Must be enabled in u8g.h)
|
||||||
|
|
||||||
|
Tested with Varitronix MGLS32064-03.pdf
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 320
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://www.gaw.ru/pdf/lcd/lcm/Varitronix/graf/MGLS32064-03.pdf
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_lc7981_320x64_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x000, /* mode register */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x032, /* display on (bit 5), master mode on (bit 4), graphics mode on (bit 1)*/
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x001, /* character/bits per pixel pitch */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x007, /* 8 bits per pixel */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x002, /* number of chars/byte width of the screen */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
WIDTH/8-1, /* 8 bits per pixel */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x003, /* time division */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x07f, /* */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x008, /* display start low */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x009, /* display start high */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_lc7981_320x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_lc7981_320x64_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint16_t disp_ram_adr;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
disp_ram_adr = WIDTH/8;
|
||||||
|
disp_ram_adr *= y;
|
||||||
|
for( i = 0; i < 8; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00a ); /* display ram (cursor) address low byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr & 0x0ff );
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00b ); /* display ram (cursor) address hight byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr >> 8 );
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00c ); /* write data */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
disp_ram_adr += WIDTH/8;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h1f_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_lc7981_320x64_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_lc7981_320x64_fn, U8G_COM_FAST_PARALLEL);
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_null.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
uint8_t u8g_dev_null(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_SET_8PIXEL: /* most often used command */
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SET_PIXEL:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_FIRST:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
break;
|
||||||
|
#ifdef U8G_DEV_MSG_IS_BBX_INTERSECTION
|
||||||
|
case U8G_DEV_MSG_IS_BBX_INTERSECTION:
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
case U8G_DEV_MSG_GET_PAGE_BOX:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SET_COLOR_INDEX:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SET_XY_CB:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_pcd8544_84x48.c
|
||||||
|
|
||||||
|
Display: Nokia 84x48
|
||||||
|
|
||||||
|
Status: Tested with PCF8812 Display
|
||||||
|
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 84
|
||||||
|
#define HEIGHT 48
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_pcd8544_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x021, /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=1) */
|
||||||
|
0x006, /* temp. control: b10 = 2 */
|
||||||
|
0x013, /* bias system 1:48 */
|
||||||
|
0x0c0, /* medium Vop */
|
||||||
|
0x020, /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
0x00c, /* display on, normal operation */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x020, /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
0x00d, /* display on, invert */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x020, /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
0x00c, /* display on, normal */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_pcd8544_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_pcd8544_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* command mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x020 ); /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 ); /* set X address */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x040 | pb->p.page); /* set Y address */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
/* the contrast adjustment does not work, needs to be analysed */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x021); /* command mode, extended function set */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | ( (*(uint8_t *)arg) >> 1 ) );
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_pcd8544_84x48_sw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_pcd8544_fn, U8G_COM_SW_SPI);
|
||||||
|
|
|
@ -0,0 +1,123 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_pcf8812_96x65.c
|
||||||
|
|
||||||
|
Display: Nokia 96x65
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
om6206 comaptible to pcf8812 ?
|
||||||
|
|
||||||
|
Status: Tested
|
||||||
|
|
||||||
|
|
||||||
|
Display Controller Seen in
|
||||||
|
LPH7366 (9 pins, 84x48) PCD8544 Nokia 5110 / 5120 / 5130 / 5160 / 6110 / 6150
|
||||||
|
LPH7677 (8 pins, 84x48) PCD8544 Nokia 3210
|
||||||
|
LPH7779 (8 pins, 84x48) PCD8544 Nokia 3310 / 3315 / 3330 / 3110, also 3410?
|
||||||
|
??? PCD8544 Nokia 5110 / 6110
|
||||||
|
LPH7690 ? (96x65) PCF8455/OM6202 Nokia 3410
|
||||||
|
LPH7690 ? (96x65?) SED1565/S1D15605 Nokia 7110 / 3510?
|
||||||
|
LPH7690 ??? Nokia 6210
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 96
|
||||||
|
#define HEIGHT 65
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_pcf8812_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x021, /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=1) */
|
||||||
|
0x006, /* temp. control: b10 = 2 */
|
||||||
|
0x013, /* bias system 1:48 */
|
||||||
|
0x080 | 0x040, /* medium Vop */
|
||||||
|
0x020, /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
0x00c, /* display on, normal operation */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x020, /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
0x00d, /* display on, invert */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x020, /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
0x00c, /* display on, normal */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_pcf8812_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_pcf8812_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* command mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x020 ); /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 ); /* set X address */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x040 | pb->p.page); /* set Y address */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
/* the contrast adjustment does not work, needs to be analysed */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x021); /* command mode, extended function set */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | ( (*(uint8_t *)arg) >> 1 ) );
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* u8g_com_arduino_sw_spi_fn does not work, too fast??? */
|
||||||
|
U8G_PB_DEV(u8g_dev_pcf8812_96x65_sw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_pcf8812_fn, U8G_COM_SW_SPI);
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_sbn1661_122x32.c
|
||||||
|
|
||||||
|
WG12232 display with 2xSBN1661 / SED1520 controller (122x32 display)
|
||||||
|
At the moment only available in the Arduino Environment
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 122
|
||||||
|
#define HEIGHT 32
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_sbn1661_122x32_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip 1 */
|
||||||
|
0x0af, /* display on */
|
||||||
|
0x0c0, /* display start at line 0 */
|
||||||
|
0x0a0, /* a0: ADC forward, a1: ADC reverse */
|
||||||
|
0x0a9, /* a8: 1/16, a9: 1/32 duty */
|
||||||
|
U8G_ESC_CS(2), /* enable chip 2 */
|
||||||
|
0x0af, /* display on */
|
||||||
|
0x0c0, /* display start at line 0 */
|
||||||
|
0x0a0, /* a0: ADC forward, a1: ADC reverse */
|
||||||
|
0x0a9, /* a8: 1/16, a9: 1/32 duty */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_sbn1661_122x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_sbn1661_122x32_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* command mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b8 | pb->p.page); /* select current page (SBN1661/SED1520) */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x000 ); /* set X address */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/2, pb->buf);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* command mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 2);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b8 | pb->p.page); /* select current page (SBN1661/SED1520) */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x000 ); /* set X address */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/2, WIDTH/2+(uint8_t *)pb->buf);
|
||||||
|
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* u8g_com_arduino_sw_spi_fn does not work, too fast??? */
|
||||||
|
U8G_PB_DEV(u8g_dev_sbn1661_122x32 , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_sbn1661_122x32_fn, u8g_com_arduino_no_en_parallel_fn);
|
|
@ -0,0 +1,247 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ssd1306_128x32.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
23 Feb 2013: Fixed, Issue 147
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 32
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
/* init sequence adafruit 128x32 OLED (NOT TESTED) */
|
||||||
|
static const uint8_t u8g_dev_ssd1306_128x32_adafruit1_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0d5, 0x080, /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */
|
||||||
|
0x0a8, 0x03f, /* */
|
||||||
|
|
||||||
|
0x0d3, 0x000, /* */
|
||||||
|
|
||||||
|
0x040, /* start line */
|
||||||
|
|
||||||
|
0x08d, 0x010, /* [1] charge pump setting (p62): 0x014 enable, 0x010 disable */
|
||||||
|
|
||||||
|
0x020, 0x000, /* */
|
||||||
|
0x0a1, /* segment remap a0/a1*/
|
||||||
|
0x0c8, /* c0: scan dir normal, c8: reverse */
|
||||||
|
0x0da, 0x012, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */
|
||||||
|
0x081, 0x09f, /* [1] set contrast control */
|
||||||
|
0x0d9, 0x022, /* [1] pre-charge period 0x022/f1*/
|
||||||
|
0x0db, 0x040, /* vcomh deselect level */
|
||||||
|
|
||||||
|
0x02e, /* 2012-05-27: Deactivate scroll */
|
||||||
|
0x0a4, /* output ram to display */
|
||||||
|
0x0a6, /* none inverted normal display mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* init sequence adafruit 128x32 OLED (NOT TESTED) */
|
||||||
|
static const uint8_t u8g_dev_ssd1306_128x32_adafruit2_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0d5, 0x080, /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */
|
||||||
|
0x0a8, 0x03f, /* */
|
||||||
|
|
||||||
|
0x0d3, 0x000, /* */
|
||||||
|
|
||||||
|
0x040, /* start line */
|
||||||
|
|
||||||
|
0x08d, 0x014, /* [2] charge pump setting (p62): 0x014 enable, 0x010 disable */
|
||||||
|
|
||||||
|
0x020, 0x000, /* */
|
||||||
|
0x0a1, /* segment remap a0/a1*/
|
||||||
|
0x0c8, /* c0: scan dir normal, c8: reverse */
|
||||||
|
0x0da, 0x012, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */
|
||||||
|
0x081, 0x0cf, /* [2] set contrast control */
|
||||||
|
0x0d9, 0x0f1, /* [2] pre-charge period 0x022/f1*/
|
||||||
|
0x0db, 0x040, /* vcomh deselect level */
|
||||||
|
|
||||||
|
0x02e, /* 2012-05-27: Deactivate scroll */
|
||||||
|
0x0a4, /* output ram to display */
|
||||||
|
0x0a6, /* none inverted normal display mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* init sequence adafruit 128x32 OLED (TESTED - WORKING 23.02.13), like adafruit3, but with page addressing mode */
|
||||||
|
static const uint8_t u8g_dev_ssd1306_128x32_adafruit3_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0d5, 0x080, /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */
|
||||||
|
0x0a8, 0x01f, /* Feb 23, 2013: 128x32 OLED: 0x01f, 128x64 OLED 0x03f */
|
||||||
|
|
||||||
|
0x0d3, 0x000, /* */
|
||||||
|
|
||||||
|
0x040, /* start line */
|
||||||
|
|
||||||
|
0x08d, 0x014, /* [2] charge pump setting (p62): 0x014 enable, 0x010 disable */
|
||||||
|
|
||||||
|
0x020, 0x002, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5), Feb 23, 2013: 128x32 OLED: 0x002, 128x64 OLED 0x012 */
|
||||||
|
0x0a1, /* segment remap a0/a1*/
|
||||||
|
0x0c8, /* c0: scan dir normal, c8: reverse */
|
||||||
|
0x0da, 0x002, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */
|
||||||
|
0x081, 0x0cf, /* [2] set contrast control */
|
||||||
|
0x0d9, 0x0f1, /* [2] pre-charge period 0x022/f1*/
|
||||||
|
0x0db, 0x040, /* vcomh deselect level */
|
||||||
|
|
||||||
|
0x02e, /* 2012-05-27: Deactivate scroll */
|
||||||
|
0x0a4, /* output ram to display */
|
||||||
|
0x0a6, /* none inverted normal display mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* init sequence Univision datasheet (NOT TESTED) */
|
||||||
|
static const uint8_t u8g_dev_ssd1306_128x32_univision_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0d5, 0x080, /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */
|
||||||
|
0x0a8, 0x03f, /* multiplex ratio */
|
||||||
|
0x0d3, 0x000, /* display offset */
|
||||||
|
0x040, /* start line */
|
||||||
|
0x08d, 0x010, /* charge pump setting (p62): 0x014 enable, 0x010 disable */
|
||||||
|
0x0a1, /* segment remap a0/a1*/
|
||||||
|
0x0c8, /* c0: scan dir normal, c8: reverse */
|
||||||
|
0x0da, 0x012, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */
|
||||||
|
0x081, 0x09f, /* set contrast control */
|
||||||
|
0x0d9, 0x022, /* pre-charge period */
|
||||||
|
0x0db, 0x040, /* vcomh deselect level */
|
||||||
|
0x022, 0x000, /* page addressing mode WRONG: 3 byte cmd! */
|
||||||
|
0x0a4, /* output ram to display */
|
||||||
|
0x0a6, /* none inverted normal display mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* select one init sequence here */
|
||||||
|
//define u8g_dev_ssd1306_128x32_init_seq u8g_dev_ssd1306_128x32_univision_init_seq
|
||||||
|
//define u8g_dev_ssd1306_128x32_init_seq u8g_dev_ssd1306_128x32_adafruit1_init_seq
|
||||||
|
//define u8g_dev_ssd1306_128x32_init_seq u8g_dev_ssd1306_128x32_adafruit2_init_seq
|
||||||
|
#define u8g_dev_ssd1306_128x32_init_seq u8g_dev_ssd1306_128x32_adafruit3_init_seq
|
||||||
|
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1306_128x32_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr. to 0 */
|
||||||
|
0x000, /* set lower 4 bit of the col adr. to 4 */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1306_128x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_128x32_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_128x32_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (SSD1306) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1306_128x32_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1306_128x32_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1306_128x32_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1306_128x32_fn, U8G_COM_HW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1306_128x32_i2c, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1306_128x32_fn, U8G_COM_SSD_I2C);
|
||||||
|
|
|
@ -0,0 +1,237 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ssd1306_128x64.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
/* init sequence adafruit 128x64 OLED (NOT TESTED) */
|
||||||
|
static const uint8_t u8g_dev_ssd1306_128x64_adafruit1_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0d5, 0x080, /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */
|
||||||
|
0x0a8, 0x03f, /* */
|
||||||
|
|
||||||
|
0x0d3, 0x000, /* */
|
||||||
|
|
||||||
|
0x040, /* start line */
|
||||||
|
|
||||||
|
0x08d, 0x010, /* [1] charge pump setting (p62): 0x014 enable, 0x010 disable */
|
||||||
|
|
||||||
|
0x020, 0x000, /* */
|
||||||
|
0x0a1, /* segment remap a0/a1*/
|
||||||
|
0x0c8, /* c0: scan dir normal, c8: reverse */
|
||||||
|
0x0da, 0x012, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */
|
||||||
|
0x081, 0x09f, /* [1] set contrast control */
|
||||||
|
0x0d9, 0x022, /* [1] pre-charge period 0x022/f1*/
|
||||||
|
0x0db, 0x040, /* vcomh deselect level */
|
||||||
|
|
||||||
|
0x02e, /* 2012-05-27: Deactivate scroll */
|
||||||
|
0x0a4, /* output ram to display */
|
||||||
|
0x0a6, /* none inverted normal display mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* init sequence adafruit 128x64 OLED (NOT TESTED) */
|
||||||
|
static const uint8_t u8g_dev_ssd1306_128x64_adafruit2_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0d5, 0x080, /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */
|
||||||
|
0x0a8, 0x03f, /* */
|
||||||
|
|
||||||
|
0x0d3, 0x000, /* */
|
||||||
|
|
||||||
|
0x040, /* start line */
|
||||||
|
|
||||||
|
0x08d, 0x014, /* [2] charge pump setting (p62): 0x014 enable, 0x010 disable */
|
||||||
|
|
||||||
|
0x020, 0x000, /* */
|
||||||
|
0x0a1, /* segment remap a0/a1*/
|
||||||
|
0x0c8, /* c0: scan dir normal, c8: reverse */
|
||||||
|
0x0da, 0x012, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */
|
||||||
|
0x081, 0x0cf, /* [2] set contrast control */
|
||||||
|
0x0d9, 0x0f1, /* [2] pre-charge period 0x022/f1*/
|
||||||
|
0x0db, 0x040, /* vcomh deselect level */
|
||||||
|
|
||||||
|
0x02e, /* 2012-05-27: Deactivate scroll */
|
||||||
|
0x0a4, /* output ram to display */
|
||||||
|
0x0a6, /* none inverted normal display mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* init sequence adafruit 128x64 OLED (NOT TESTED), like adafruit3, but with page addressing mode */
|
||||||
|
static const uint8_t u8g_dev_ssd1306_128x64_adafruit3_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0d5, 0x080, /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */
|
||||||
|
0x0a8, 0x03f, /* */
|
||||||
|
|
||||||
|
0x0d3, 0x000, /* */
|
||||||
|
|
||||||
|
0x040, /* start line */
|
||||||
|
|
||||||
|
0x08d, 0x014, /* [2] charge pump setting (p62): 0x014 enable, 0x010 disable */
|
||||||
|
|
||||||
|
0x020, 0x002, /* 2012-05-27: page addressing mode */
|
||||||
|
0x0a1, /* segment remap a0/a1*/
|
||||||
|
0x0c8, /* c0: scan dir normal, c8: reverse */
|
||||||
|
0x0da, 0x012, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */
|
||||||
|
0x081, 0x0cf, /* [2] set contrast control */
|
||||||
|
0x0d9, 0x0f1, /* [2] pre-charge period 0x022/f1*/
|
||||||
|
0x0db, 0x040, /* vcomh deselect level */
|
||||||
|
|
||||||
|
0x02e, /* 2012-05-27: Deactivate scroll */
|
||||||
|
0x0a4, /* output ram to display */
|
||||||
|
0x0a6, /* none inverted normal display mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* init sequence Univision datasheet (NOT TESTED) */
|
||||||
|
static const uint8_t u8g_dev_ssd1306_128x64_univision_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0d5, 0x080, /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */
|
||||||
|
0x0a8, 0x03f, /* multiplex ratio */
|
||||||
|
0x0d3, 0x000, /* display offset */
|
||||||
|
0x040, /* start line */
|
||||||
|
0x08d, 0x010, /* charge pump setting (p62): 0x014 enable, 0x010 disable */
|
||||||
|
0x0a1, /* segment remap a0/a1*/
|
||||||
|
0x0c8, /* c0: scan dir normal, c8: reverse */
|
||||||
|
0x0da, 0x012, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */
|
||||||
|
0x081, 0x09f, /* set contrast control */
|
||||||
|
0x0d9, 0x022, /* pre-charge period */
|
||||||
|
0x0db, 0x040, /* vcomh deselect level */
|
||||||
|
0x022, 0x000, /* page addressing mode WRONG: 3 byte cmd! */
|
||||||
|
0x0a4, /* output ram to display */
|
||||||
|
0x0a6, /* none inverted normal display mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* select one init sequence here */
|
||||||
|
//#define u8g_dev_ssd1306_128x64_init_seq u8g_dev_ssd1306_128x64_univision_init_seq
|
||||||
|
//#define u8g_dev_ssd1306_128x64_init_seq u8g_dev_ssd1306_128x64_adafruit1_init_seq
|
||||||
|
//#define u8g_dev_ssd1306_128x64_init_seq u8g_dev_ssd1306_128x64_adafruit2_init_seq
|
||||||
|
#define u8g_dev_ssd1306_128x64_init_seq u8g_dev_ssd1306_128x64_adafruit3_init_seq
|
||||||
|
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1306_128x64_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0 */
|
||||||
|
0x000, /* set lower 4 bit of the col adr to 4 */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1306_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_128x64_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_128x64_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (SSD1306) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1306_128x64_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1306_128x64_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1306_128x64_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1306_128x64_fn, U8G_COM_HW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1306_128x64_i2c, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1306_128x64_fn, U8G_COM_SSD_I2C);
|
|
@ -0,0 +1,144 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ssd1309_128x64.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
/* ssd1309 ini sequence*/
|
||||||
|
static const uint8_t u8g_dev_ssd1309_128x64_init_seq[] PROGMEM={
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0xfd,0x12, /*Command Lock */
|
||||||
|
0xae, /*Set Display Off */
|
||||||
|
0xd5,0xa0, /*set Display Clock Divide Ratio/Oscillator Frequency */
|
||||||
|
0xa8,0x3f, /*Set Multiplex Ratio */
|
||||||
|
0x3d,0x00, /*Set Display Offset*/
|
||||||
|
0x40, /*Set Display Start Line*/
|
||||||
|
0xa1, /*Set Segment Re-Map*/
|
||||||
|
0xc8, /*Set COM Output Scan Direction*/
|
||||||
|
0xda,0x12, /*Set COM Pins Hardware Configuration*/
|
||||||
|
0x81,0xdf, /*Set Current Control */
|
||||||
|
0xd9,0x82, /*Set Pre-Charge Period */
|
||||||
|
0xdb,0x34, /*Set VCOMH Deselect Level */
|
||||||
|
0xa4, /*Set Entire Display On/Off */
|
||||||
|
0xa6, /*Set Normal/Inverse Display*/
|
||||||
|
U8G_ESC_VCC(1), /*Power up VCC & Stabilized */
|
||||||
|
U8G_ESC_DLY(50),
|
||||||
|
0xaf, /*Set Display On */
|
||||||
|
U8G_ESC_DLY(50),
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* select one init sequence here */
|
||||||
|
#define u8g_dev_ssd1309_128x64_init_seq u8g_dev_ssd1309_128x64_init_seq
|
||||||
|
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1309_128x64_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0 */
|
||||||
|
0x000, /* set lower 4 bit of the col adr to 4 */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1309_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1309_128x64_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1309_128x64_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (SSD1306) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1309_128x64_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1309_128x64_fn, U8G_COM_HW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1309_128x64_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1309_128x64_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1309_128x64_i2c, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1309_128x64_fn, U8G_COM_SSD_I2C);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,334 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ssd1322_nhd31oled_bw.c
|
||||||
|
|
||||||
|
1-Bit (BW) Driver for SSD1322 Controller (OLED Display)
|
||||||
|
Tested with NHD-3.12-25664
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
SSD130x Monochrom OLED Controller
|
||||||
|
SSD131x Character OLED Controller
|
||||||
|
SSD132x Graylevel OLED Controller
|
||||||
|
SSD1331 Color OLED Controller
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
/* width must be multiple of 8, largest value is 248 unless u8g 16 bit mode is enabled */
|
||||||
|
#if defined(U8G_16BIT)
|
||||||
|
#define WIDTH 256
|
||||||
|
#else
|
||||||
|
#define WIDTH 248
|
||||||
|
#endif
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://www.newhavendisplay.com/app_notes/OLED_25664.txt
|
||||||
|
http://www.newhavendisplay.com/forum/viewtopic.php?f=15&t=3758
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1322_1bit_nhd_312_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0fd, /* lock command */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x012, /* unlock */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0b3,
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x091, /* set display clock divide ratio/oscillator frequency (set clock as 80 frames/sec) */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0ca, /* multiplex ratio */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x03f, /* 1/64 Duty (0x0F~0x3F) */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0a2,
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000, /* display offset, shift mapping ram counter */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0a1,
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000, /* display start line */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0a0, /* Set Re-Map / Dual COM Line Mode */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x014, /* was 0x014 */
|
||||||
|
0x011, /* was 0x011 */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0ab,
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x001, /* Enable Internal VDD Regulator */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0b4, /* Display Enhancement A */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x0a0,
|
||||||
|
0x005|0x0fd,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0c1, /* contrast */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x09f,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0c7, /* Set Scale Factor of Segment Output Current Control */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x00f,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0b9, /* linear gray scale */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0b1, /* Phase 1 (Reset) & Phase 2 (Pre-Charge) Period Adjustment */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x0e2,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0d1, /* Display Enhancement B */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x082|0x020,
|
||||||
|
0x020,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0bb, /* precharge voltage */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x01f,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0b6, /* precharge period */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x008,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0be, /* vcomh */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x007,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0a6, /* normal display */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0a9, /* exit partial display */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1322_1bit_nhd_312_prepare_page_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x015, /* column address... */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x01c, /* start at column 0 */
|
||||||
|
0x05b, /* end column */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x075, /* row address... */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1322_1bit_prepare_row(u8g_t *u8g, u8g_dev_t *dev, uint8_t delta_row)
|
||||||
|
{
|
||||||
|
uint8_t row = ((u8g_pb_t *)(dev->dev_mem))->p.page;
|
||||||
|
|
||||||
|
row *= ((u8g_pb_t *)(dev->dev_mem))->p.page_height;
|
||||||
|
row += delta_row;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1322_1bit_nhd_312_prepare_page_seq);
|
||||||
|
|
||||||
|
u8g_WriteByte(u8g, dev, row); /* start at the selected row */
|
||||||
|
u8g_WriteByte(u8g, dev, row+1); /* end within the selected row */
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x05c); /* write to ram */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1322_nhd31oled_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1322_1bit_nhd_312_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
uint8_t *p = pb->buf;
|
||||||
|
u8g_uint_t cnt;
|
||||||
|
cnt = pb->width;
|
||||||
|
cnt >>= 3;
|
||||||
|
|
||||||
|
for( i = 0; i < pb->p.page_height; i++ )
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1322_1bit_prepare_row(u8g, dev, i); /* this will also enable chip select */
|
||||||
|
#if !defined(U8G_16BIT)
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0ff);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0ff);
|
||||||
|
#endif
|
||||||
|
u8g_WriteSequenceBWTo16GrDevice(u8g, dev, cnt, p);
|
||||||
|
#if !defined(U8G_16BIT)
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0ff);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0ff);
|
||||||
|
#endif
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
p+=cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1322_nhd31oled_2x_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1322_1bit_nhd_312_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
uint8_t *p = pb->buf;
|
||||||
|
u8g_uint_t cnt;
|
||||||
|
cnt = pb->width;
|
||||||
|
cnt >>= 3;
|
||||||
|
|
||||||
|
for( i = 0; i < pb->p.page_height; i++ )
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1322_1bit_prepare_row(u8g, dev, i); /* this will also enable chip select */
|
||||||
|
#if !defined(U8G_16BIT)
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0ff);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0ff);
|
||||||
|
#endif
|
||||||
|
u8g_WriteSequenceBWTo16GrDevice(u8g, dev, cnt, p);
|
||||||
|
#if !defined(U8G_16BIT)
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0ff);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0ff);
|
||||||
|
#endif
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
p+=cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1322_nhd31oled_bw_sw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1322_nhd31oled_bw_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1322_nhd31oled_bw_hw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1322_nhd31oled_bw_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
#define DWIDTH (WIDTH*2)
|
||||||
|
uint8_t u8g_dev_ssd1322_nhd31oled_2x_bw_buf[DWIDTH] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_ssd1322_nhd31oled_2x_bw_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1322_nhd31oled_2x_bw_buf};
|
||||||
|
u8g_dev_t u8g_dev_ssd1322_nhd31oled_2x_bw_sw_spi = { u8g_dev_ssd1322_nhd31oled_2x_bw_fn, &u8g_dev_ssd1322_nhd31oled_2x_bw_pb, U8G_COM_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_ssd1322_nhd31oled_2x_bw_hw_spi = { u8g_dev_ssd1322_nhd31oled_2x_bw_fn, &u8g_dev_ssd1322_nhd31oled_2x_bw_pb, U8G_COM_HW_SPI };
|
||||||
|
|
|
@ -0,0 +1,333 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ssd1322_nhd31oled_gr.c
|
||||||
|
|
||||||
|
2-Bit (4L) Driver for SSD1322 Controller (OLED Display)
|
||||||
|
Tested with NHD-3.12-25664
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
SSD130x Monochrom OLED Controller
|
||||||
|
SSD131x Character OLED Controller
|
||||||
|
SSD132x Graylevel OLED Controller
|
||||||
|
SSD1331 Color OLED Controller
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
/* width must be multiple of 8, largest value is 248 unless u8g 16 bit mode is enabled */
|
||||||
|
#if defined(U8G_16BIT)
|
||||||
|
#define WIDTH 256
|
||||||
|
#else
|
||||||
|
#define WIDTH 248
|
||||||
|
#endif
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://www.newhavendisplay.com/app_notes/OLED_25664.txt
|
||||||
|
http://www.newhavendisplay.com/forum/viewtopic.php?f=15&t=3758
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1322_2bit_nhd_312_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0fd, /* lock command */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x012, /* unlock */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0b3,
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x091, /* set display clock divide ratio/oscillator frequency (set clock as 80 frames/sec) */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0ca, /* multiplex ratio */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x03f, /* 1/64 Duty (0x0F~0x3F) */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0a2,
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000, /* display offset, shift mapping ram counter */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0a1,
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000, /* display start line */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0a0, /* Set Re-Map / Dual COM Line Mode */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x014, /* was 0x014 */
|
||||||
|
0x011, /* was 0x011 */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0ab,
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x001, /* Enable Internal VDD Regulator */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0b4, /* Display Enhancement A */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x0a0,
|
||||||
|
0x005|0x0fd,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0c1, /* contrast */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x09f,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0c7, /* Set Scale Factor of Segment Output Current Control */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x00f,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0b9, /* linear gray scale */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0b1, /* Phase 1 (Reset) & Phase 2 (Pre-Charge) Period Adjustment */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x0e2,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0d1, /* Display Enhancement B */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x082|0x020,
|
||||||
|
0x020,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0bb, /* precharge voltage */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x01f,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0b6, /* precharge period */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x008,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0be, /* vcomh */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x007,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0a6, /* normal display */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0a9, /* exit partial display */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1322_2bit_nhd_312_prepare_page_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x015, /* column address... */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x01c, /* start at column 0 */
|
||||||
|
0x05b, /* end column */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
0x075, /* row address... */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1322_2bit_prepare_row(u8g_t *u8g, u8g_dev_t *dev, uint8_t delta_row)
|
||||||
|
{
|
||||||
|
uint8_t row = ((u8g_pb_t *)(dev->dev_mem))->p.page;
|
||||||
|
|
||||||
|
row *= ((u8g_pb_t *)(dev->dev_mem))->p.page_height;
|
||||||
|
row += delta_row;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1322_2bit_nhd_312_prepare_page_seq);
|
||||||
|
|
||||||
|
u8g_WriteByte(u8g, dev, row); /* start at the selected row */
|
||||||
|
u8g_WriteByte(u8g, dev, row+1); /* end within the selected row */
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x05c); /* write to ram */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1322_nhd31oled_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1322_2bit_nhd_312_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
uint8_t *p = pb->buf;
|
||||||
|
u8g_uint_t cnt;
|
||||||
|
cnt = pb->width;
|
||||||
|
cnt >>= 2;
|
||||||
|
|
||||||
|
for( i = 0; i < pb->p.page_height; i++ )
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1322_2bit_prepare_row(u8g, dev, i); /* this will also enable chip select */
|
||||||
|
#if !defined(U8G_16BIT)
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00);
|
||||||
|
#endif
|
||||||
|
u8g_WriteSequence4LTo16GrDevice(u8g, dev, cnt, p);
|
||||||
|
#if !defined(U8G_16BIT)
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00);
|
||||||
|
#endif
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
p+=cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h2_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1322_nhd31oled_2x_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1322_2bit_nhd_312_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
uint8_t *p = pb->buf;
|
||||||
|
u8g_uint_t cnt;
|
||||||
|
cnt = pb->width;
|
||||||
|
cnt >>= 3;
|
||||||
|
|
||||||
|
for( i = 0; i < pb->p.page_height; i++ )
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1322_2bit_prepare_row(u8g, dev, i); /* this will also enable chip select */
|
||||||
|
#if !defined(U8G_16BIT)
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00);
|
||||||
|
#endif
|
||||||
|
u8g_WriteSequence4LTo16GrDevice(u8g, dev, cnt, p);
|
||||||
|
#if !defined(U8G_16BIT)
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x00);
|
||||||
|
#endif
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
p+=cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16h2_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1322_nhd31oled_gr_sw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1322_nhd31oled_gr_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1322_nhd31oled_gr_hw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1322_nhd31oled_gr_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
#define DWIDTH (WIDTH*2)
|
||||||
|
uint8_t u8g_dev_ssd1322_nhd31oled_2x_gr_buf[DWIDTH] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_ssd1322_nhd31oled_2x_gr_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1322_nhd31oled_2x_gr_buf};
|
||||||
|
u8g_dev_t u8g_dev_ssd1322_nhd31oled_2x_gr_sw_spi = { u8g_dev_ssd1322_nhd31oled_2x_gr_fn, &u8g_dev_ssd1322_nhd31oled_2x_gr_pb, U8G_COM_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_ssd1322_nhd31oled_2x_gr_hw_spi = { u8g_dev_ssd1322_nhd31oled_2x_gr_fn, &u8g_dev_ssd1322_nhd31oled_2x_gr_pb, U8G_COM_HW_SPI };
|
||||||
|
|
|
@ -0,0 +1,263 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ssd1325_nhd27oled_bw.c
|
||||||
|
|
||||||
|
1-Bit (BW) Driver for SSD1325 Controller (OLED Display)
|
||||||
|
Tested with NHD-2.7-12864UCY3
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
SSD130x Monochrom OLED Controller
|
||||||
|
SSD131x Character OLED Controller
|
||||||
|
SSD132x Graylevel OLED Controller
|
||||||
|
SSD1331 Color OLED Controller
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef OBSOLETE_CODE
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
/* http://www.newhavendisplay.com/app_notes/OLED_2_7_12864.txt */
|
||||||
|
static const uint8_t u8g_dev_ssd1325_1bit_nhd_27_12864ucy3_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0b3, 0x091, /* set display clock divide ratio/oscillator frequency (set clock as 135 frames/sec) */
|
||||||
|
0x0a8, 0x03f, /* multiplex ratio: 0x03f * 1/64 duty */
|
||||||
|
0x0a2, 0x04c, /* display offset, shift mapping ram counter */
|
||||||
|
0x0a1, 0x000, /* display start line */
|
||||||
|
0x0ad, 0x002, /* master configuration: disable embedded DC-DC, enable internal VCOMH */
|
||||||
|
0x0a0, 0x056, /* remap configuration, vertical address increment, enable nibble remap (upper nibble is left) */
|
||||||
|
0x086, /* full current range (0x084, 0x085, 0x086) */
|
||||||
|
0x0b8, /* set gray scale table */
|
||||||
|
0x01, 0x011, 0x022, 0x032, 0x043, 0x054, 0x065, 0x076,
|
||||||
|
0x081, 0x070, /* contrast, brightness, 0..128, Newhaven: 0x040 */
|
||||||
|
0x0b2, 0x051, /* frame frequency (row period) */
|
||||||
|
0x0b1, 0x055, /* phase length */
|
||||||
|
0x0bc, 0x010, /* pre-charge voltage level */
|
||||||
|
0x0b4, 0x002, /* set pre-charge compensation level (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0b0, 0x028, /* enable pre-charge compensation (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0be, 0x01c, /* VCOMH voltage */
|
||||||
|
0x0bf, 0x002|0x00d, /* VSL voltage level (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0a5, /* all pixel on */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display mode */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1325_1bit_nhd_27_12864ucy3_prepare_page_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x015, /* column address... */
|
||||||
|
0x000, /* start at column 0 */
|
||||||
|
0x03f, /* end at column 63 (which is y == 127), because there are two pixel in one column */
|
||||||
|
0x075, /* row address... */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1325_1bit_prepare_page(u8g_t *u8g, u8g_dev_t *dev)
|
||||||
|
{
|
||||||
|
uint8_t page = ((u8g_pb_t *)(dev->dev_mem))->p.page;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_1bit_nhd_27_12864ucy3_prepare_page_seq);
|
||||||
|
|
||||||
|
page <<= 3;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* start at the selected page */
|
||||||
|
page += 7;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* end within the selected page */
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1325_1bit_2x_prepare_page(u8g_t *u8g, u8g_dev_t *dev, uint8_t is_odd)
|
||||||
|
{
|
||||||
|
uint8_t page = ((u8g_pb_t *)(dev->dev_mem))->p.page;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_1bit_nhd_27_12864ucy3_prepare_page_seq);
|
||||||
|
|
||||||
|
page <<= 1;
|
||||||
|
page += is_odd;
|
||||||
|
|
||||||
|
page <<= 3;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* start at the selected page */
|
||||||
|
page += 7;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* end within the selected page */
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* assumes row autoincrement and activated nibble remap */
|
||||||
|
#ifdef OLD
|
||||||
|
static void _OLD_u8g_dev_ssd1325_1bit_write_16_pixel(u8g_t *u8g, u8g_dev_t *dev, uint8_t left, uint8_t right)
|
||||||
|
{
|
||||||
|
uint8_t d, cnt;
|
||||||
|
cnt = 8;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
d = 0;
|
||||||
|
if ( left & 1 )
|
||||||
|
d |= 0x0f0;
|
||||||
|
if ( right & 1 )
|
||||||
|
d |= 0x00f;
|
||||||
|
u8g_WriteByte(u8g, dev, d);
|
||||||
|
left >>= 1;
|
||||||
|
right >>= 1;
|
||||||
|
cnt--;
|
||||||
|
}while ( cnt > 0 );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1325_1bit_write_16_pixel(u8g_t *u8g, u8g_dev_t *dev, uint8_t left, uint8_t right)
|
||||||
|
{
|
||||||
|
uint8_t d, cnt;
|
||||||
|
static uint8_t buf[8];
|
||||||
|
cnt = 8;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
d = 0;
|
||||||
|
if ( left & 128 )
|
||||||
|
d |= 0x0f0;
|
||||||
|
if ( right & 128 )
|
||||||
|
d |= 0x00f;
|
||||||
|
cnt--;
|
||||||
|
buf[cnt] = d;
|
||||||
|
left <<= 1;
|
||||||
|
right <<= 1;
|
||||||
|
}while ( cnt > 0 );
|
||||||
|
u8g_WriteSequence(u8g, dev, 8, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1325_1bit_write_buffer(u8g_t *u8g, u8g_dev_t *dev, uint8_t is_odd)
|
||||||
|
{
|
||||||
|
uint8_t cnt, left, right;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
ptr = pb->buf;
|
||||||
|
cnt = pb->width;
|
||||||
|
if ( is_odd )
|
||||||
|
ptr += cnt;
|
||||||
|
cnt >>= 1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
left = *ptr++;
|
||||||
|
right = *ptr++;
|
||||||
|
u8g_dev_ssd1325_1bit_write_16_pixel(u8g, dev, left, right);
|
||||||
|
cnt--;
|
||||||
|
} while( cnt > 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1325_nhd27oled_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_1bit_nhd_27_12864ucy3_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1325_1bit_prepare_page(u8g, dev);
|
||||||
|
u8g_dev_ssd1325_1bit_write_buffer(u8g, dev, 0);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1325_nhd27oled_2x_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_1bit_nhd_27_12864ucy3_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1325_1bit_2x_prepare_page(u8g, dev, 0);
|
||||||
|
u8g_dev_ssd1325_1bit_write_buffer(u8g, dev, 0);
|
||||||
|
u8g_dev_ssd1325_1bit_2x_prepare_page(u8g, dev, 1);
|
||||||
|
u8g_dev_ssd1325_1bit_write_buffer(u8g, dev, 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disabled, see bw_new.c */
|
||||||
|
/*
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_bw_sw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1325_nhd27oled_bw_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_bw_hw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1325_nhd27oled_bw_fn, U8G_COM_HW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_bw_parallel , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1325_nhd27oled_bw_fn, U8G_COM_FAST_PARALLEL);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
uint8_t u8g_dev_ssd1325_nhd27oled_2x_bw_buf[WIDTH*2] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_ssd1325_nhd27oled_2x_bw_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1325_nhd27oled_2x_bw_buf};
|
||||||
|
u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_sw_spi = { u8g_dev_ssd1325_nhd27oled_2x_bw_fn, &u8g_dev_ssd1325_nhd27oled_2x_bw_pb, U8G_COM_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_hw_spi = { u8g_dev_ssd1325_nhd27oled_2x_bw_fn, &u8g_dev_ssd1325_nhd27oled_2x_bw_pb, U8G_COM_HW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_parallel = { u8g_dev_ssd1325_nhd27oled_2x_bw_fn, &u8g_dev_ssd1325_nhd27oled_2x_bw_pb, U8G_COM_FAST_PARALLEL };
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,232 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ssd1325_nhd27oled_bw.c
|
||||||
|
|
||||||
|
1-Bit (BW) Driver for SSD1325 Controller (OLED Display)
|
||||||
|
Horizontal architecture, completly rewritten
|
||||||
|
Tested with NHD-2.7-12864UCY3
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
SSD130x Monochrom OLED Controller
|
||||||
|
SSD131x Character OLED Controller
|
||||||
|
SSD132x Graylevel OLED Controller
|
||||||
|
SSD1331 Color OLED Controller
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
/* width must be multiple of 8, largest value is 248 unless u8g 16 bit mode is enabled */
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
|
||||||
|
/* http://www.newhavendisplay.com/app_notes/OLED_2_7_12864.txt */
|
||||||
|
static const uint8_t u8g_dev_ssd1325_nhd_27_12864_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0b3, 0x091, /* set display clock divide ratio/oscillator frequency (set clock as 135 frames/sec) */
|
||||||
|
0x0a8, 0x03f, /* multiplex ratio: 0x03f * 1/64 duty */
|
||||||
|
0x0a2, 0x04c, /* display offset, shift mapping ram counter */
|
||||||
|
0x0a1, 0x000, /* display start line */
|
||||||
|
0x0ad, 0x002, /* master configuration: disable embedded DC-DC, enable internal VCOMH */
|
||||||
|
0x0a0, 0x052, /* remap configuration, horizontal address increment (bit 2 = 0), enable nibble remap (upper nibble is left, bit 1 = 1) */
|
||||||
|
0x086, /* full current range (0x084, 0x085, 0x086) */
|
||||||
|
0x0b8, /* set gray scale table */
|
||||||
|
0x01, 0x011, 0x022, 0x032, 0x043, 0x054, 0x065, 0x076,
|
||||||
|
|
||||||
|
0x081, 0x070, /* contrast, brightness, 0..128, Newhaven: 0x040 */
|
||||||
|
0x0b2, 0x051, /* frame frequency (row period) */
|
||||||
|
0x0b1, 0x055, /* phase length */
|
||||||
|
0x0bc, 0x010, /* pre-charge voltage level */
|
||||||
|
0x0b4, 0x002, /* set pre-charge compensation level (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0b0, 0x028, /* enable pre-charge compensation (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0be, 0x01c, /* VCOMH voltage */
|
||||||
|
0x0bf, 0x002|0x00d, /* VSL voltage level (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0a4, /* normal display mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1325_prepare_row_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x015, /* column address... */
|
||||||
|
0x000, /* start at column 0 */
|
||||||
|
0x03f, /* end at column 63 (which is y == 127), because there are two pixel in one column */
|
||||||
|
0x075, /* row address... */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1325_prepare_row(u8g_t *u8g, u8g_dev_t *dev, uint8_t delta_row)
|
||||||
|
{
|
||||||
|
uint8_t row = ((u8g_pb_t *)(dev->dev_mem))->p.page;
|
||||||
|
|
||||||
|
row *= ((u8g_pb_t *)(dev->dev_mem))->p.page_height;
|
||||||
|
row += delta_row;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_prepare_row_seq);
|
||||||
|
|
||||||
|
u8g_WriteByte(u8g, dev, row); /* start at the selected row */
|
||||||
|
u8g_WriteByte(u8g, dev, row+1); /* end within the selected row */
|
||||||
|
|
||||||
|
//u8g_SetAddress(u8g, dev, 0); /* instruction mode mode */
|
||||||
|
//u8g_WriteByte(u8g, dev, 0x05c); /* write to ram */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static uint8_t u8g_dev_ssd1325_nhd27oled_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
//case U8G_DEV_MSG_IS_BBX_INTERSECTION:
|
||||||
|
// return u8g_pb_IsIntersection((u8g_pb_t *)(dev->dev_mem), (u8g_dev_arg_bbx_t *)arg);
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_nhd_27_12864_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
uint8_t *p = pb->buf;
|
||||||
|
u8g_uint_t cnt;
|
||||||
|
cnt = pb->width;
|
||||||
|
cnt >>= 3;
|
||||||
|
|
||||||
|
for( i = 0; i < pb->p.page_height; i++ )
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1325_prepare_row(u8g, dev, i); /* this will also enable chip select */
|
||||||
|
u8g_WriteSequenceBWTo16GrDevice(u8g, dev, cnt, p);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
p+=cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t u8g_dev_ssd1325_nhd27oled_2x_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_nhd_27_12864_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
uint8_t *p = pb->buf;
|
||||||
|
u8g_uint_t cnt;
|
||||||
|
cnt = pb->width;
|
||||||
|
cnt >>= 3;
|
||||||
|
|
||||||
|
for( i = 0; i < pb->p.page_height; i++ )
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1325_prepare_row(u8g, dev, i); /* this will also enable chip select */
|
||||||
|
u8g_WriteSequenceBWTo16GrDevice(u8g, dev, cnt, p);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
p+=cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_bw_sw_spi , WIDTH, HEIGHT, 8, u8g_dev_ssd1325_nhd27oled_bw_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_bw_hw_spi , WIDTH, HEIGHT, 8, u8g_dev_ssd1325_nhd27oled_bw_fn, U8G_COM_HW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_bw_parallel , WIDTH, HEIGHT, 8, u8g_dev_ssd1325_nhd27oled_bw_fn, U8G_COM_FAST_PARALLEL);
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1325_nhd27oled_2x_bw_buf[WIDTH*2] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_ssd1325_nhd27oled_2x_bw_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1325_nhd27oled_2x_bw_buf};
|
||||||
|
u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_sw_spi = { u8g_dev_ssd1325_nhd27oled_2x_bw_fn, &u8g_dev_ssd1325_nhd27oled_2x_bw_pb, U8G_COM_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_hw_spi = { u8g_dev_ssd1325_nhd27oled_2x_bw_fn, &u8g_dev_ssd1325_nhd27oled_2x_bw_pb, U8G_COM_HW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_parallel = { u8g_dev_ssd1325_nhd27oled_2x_bw_fn, &u8g_dev_ssd1325_nhd27oled_2x_bw_pb, U8G_COM_FAST_PARALLEL };
|
||||||
|
|
|
@ -0,0 +1,255 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ssd1325_nhd27oled_gr.c
|
||||||
|
|
||||||
|
2-Bit (gray level) Driver for SSD1325 Controller (OLED Display)
|
||||||
|
Tested with NHD-2.7-12864UCY3
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
SSD130x Monochrom OLED Controller
|
||||||
|
SSD131x Character OLED Controller
|
||||||
|
SSD132x Graylevel OLED Controller
|
||||||
|
SSD1331 Color OLED Controller
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef OBSOLETE_CODE
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
|
||||||
|
/* http://www.newhavendisplay.com/app_notes/OLED_2_7_12864.txt */
|
||||||
|
static const uint8_t u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0b3, 0x091, /* set display clock divide ratio/oscillator frequency (set clock as 135 frames/sec) */
|
||||||
|
0x0a8, 0x03f, /* multiplex ratio: 0x03f * 1/64 duty */
|
||||||
|
0x0a2, 0x04c, /* display offset, shift mapping ram counter */
|
||||||
|
0x0a1, 0x000, /* display start line */
|
||||||
|
0x0ad, 0x002, /* master configuration: disable embedded DC-DC, enable internal VCOMH */
|
||||||
|
0x0a0, 0x056, /* remap configuration, vertical address increment, enable nibble remap (upper nibble is left) */
|
||||||
|
0x086, /* full current range (0x084, 0x085, 0x086) */
|
||||||
|
0x0b8, /* set gray scale table */
|
||||||
|
//0x01, 0x011, 0x022, 0x032, 0x043, 0x054, 0x065, 0x076,
|
||||||
|
0x01, 0x011, 0x022, 0x032, 0x043, 0x054, 0x077, 0x077, // 4L mode uses 0, 2, 4, 7
|
||||||
|
0x081, 0x070, /* contrast, brightness, 0..128, Newhaven: 0x040 */
|
||||||
|
0x0b2, 0x051, /* frame frequency (row period) */
|
||||||
|
0x0b1, 0x055, /* phase length */
|
||||||
|
0x0bc, 0x010, /* pre-charge voltage level */
|
||||||
|
0x0b4, 0x002, /* set pre-charge compensation level (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0b0, 0x028, /* enable pre-charge compensation (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0be, 0x01c, /* VCOMH voltage */
|
||||||
|
0x0bf, 0x002|0x00d, /* VSL voltage level (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0a5, /* all pixel on */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display mode */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_prepare_page_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x015, /* column address... */
|
||||||
|
0x000, /* start at column 0 */
|
||||||
|
0x03f, /* end at column 63 (which is y == 127), because there are two pixel in one column */
|
||||||
|
0x075, /* row address... */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1325_2bit_prepare_page(u8g_t *u8g, u8g_dev_t *dev)
|
||||||
|
{
|
||||||
|
uint8_t page = ((u8g_pb_t *)(dev->dev_mem))->p.page;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_prepare_page_seq);
|
||||||
|
|
||||||
|
page <<= 2;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* start at the selected page */
|
||||||
|
page += 3;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* end within the selected page */
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1325_2bit_2x_prepare_page(u8g_t *u8g, u8g_dev_t *dev, uint8_t is_odd)
|
||||||
|
{
|
||||||
|
uint8_t page = ((u8g_pb_t *)(dev->dev_mem))->p.page;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_prepare_page_seq);
|
||||||
|
|
||||||
|
page <<= 1;
|
||||||
|
page += is_odd;
|
||||||
|
|
||||||
|
|
||||||
|
page <<= 2;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* start at the selected page */
|
||||||
|
page += 3;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* end within the selected page */
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* assumes row autoincrement and activated nibble remap */
|
||||||
|
static void u8g_dev_ssd1325_2bit_write_4_pixel(u8g_t *u8g, u8g_dev_t *dev, uint8_t left, uint8_t right)
|
||||||
|
{
|
||||||
|
uint8_t d, tmp, cnt;
|
||||||
|
cnt = 4;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
d = left;
|
||||||
|
d &= 3;
|
||||||
|
d <<= 4;
|
||||||
|
tmp = right;
|
||||||
|
tmp &= 3;
|
||||||
|
d |= tmp;
|
||||||
|
d <<= 2;
|
||||||
|
u8g_WriteByte(u8g, dev, d);
|
||||||
|
left >>= 2;
|
||||||
|
right >>= 2;
|
||||||
|
cnt--;
|
||||||
|
}while ( cnt > 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1325_2bit_write_buffer(u8g_t *u8g, u8g_dev_t *dev)
|
||||||
|
{
|
||||||
|
uint8_t cnt, left, right;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
cnt = pb->width;
|
||||||
|
cnt >>= 1;
|
||||||
|
ptr = pb->buf;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
left = *ptr++;
|
||||||
|
right = *ptr++;
|
||||||
|
u8g_dev_ssd1325_2bit_write_4_pixel(u8g, dev, left, right);
|
||||||
|
cnt--;
|
||||||
|
} while( cnt > 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1325_2bit_2x_write_buffer(u8g_t *u8g, u8g_dev_t *dev, uint8_t is_odd)
|
||||||
|
{
|
||||||
|
uint8_t cnt, left, right;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
ptr = pb->buf;
|
||||||
|
cnt = pb->width;
|
||||||
|
if ( is_odd )
|
||||||
|
ptr += cnt;
|
||||||
|
cnt >>= 1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
left = *ptr++;
|
||||||
|
right = *ptr++;
|
||||||
|
u8g_dev_ssd1325_2bit_write_4_pixel(u8g, dev, left, right);
|
||||||
|
cnt--;
|
||||||
|
} while( cnt > 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t u8g_dev_ssd1325_nhd27oled_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1325_2bit_prepare_page(u8g, dev);
|
||||||
|
u8g_dev_ssd1325_2bit_write_buffer(u8g, dev);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v2_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t u8g_dev_ssd1325_nhd27oled_2x_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1325_2bit_2x_prepare_page(u8g, dev, 0);
|
||||||
|
u8g_dev_ssd1325_2bit_2x_write_buffer(u8g, dev, 0);
|
||||||
|
u8g_dev_ssd1325_2bit_2x_prepare_page(u8g, dev, 1);
|
||||||
|
u8g_dev_ssd1325_2bit_2x_write_buffer(u8g, dev, 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16v2_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
//U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_sw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_SW_SPI);
|
||||||
|
//U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_hw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
//uint8_t u8g_dev_ssd1325_nhd27oled_2x_buf[WIDTH*2] U8G_NOCOMMON ;
|
||||||
|
//u8g_pb_t u8g_dev_ssd1325_nhd27oled_2x_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1325_nhd27oled_2x_buf};
|
||||||
|
//u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_gr_sw_spi = { u8g_dev_ssd1325_nhd27oled_2x_gr_fn, &u8g_dev_ssd1325_nhd27oled_2x_pb, U8G_COM_SW_SPI };
|
||||||
|
//u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_gr_hw_spi = { u8g_dev_ssd1325_nhd27oled_2x_gr_fn, &u8g_dev_ssd1325_nhd27oled_2x_pb, U8G_COM_HW_SPI };
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* OBSOLETE_CODE */
|
|
@ -0,0 +1,227 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ssd1325_nhd27oled_gr.c
|
||||||
|
|
||||||
|
2-Bit (gray level) Driver for SSD1325 Controller (OLED Display)
|
||||||
|
Rewritten with new architecture
|
||||||
|
Tested with NHD-2.7-12864UCY3
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
SSD130x Monochrom OLED Controller
|
||||||
|
SSD131x Character OLED Controller
|
||||||
|
SSD132x Graylevel OLED Controller
|
||||||
|
SSD1331 Color OLED Controller
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
|
||||||
|
/* http://www.newhavendisplay.com/app_notes/OLED_2_7_12864.txt */
|
||||||
|
static const uint8_t u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0b3, 0x091, /* set display clock divide ratio/oscillator frequency (set clock as 135 frames/sec) */
|
||||||
|
0x0a8, 0x03f, /* multiplex ratio: 0x03f * 1/64 duty */
|
||||||
|
0x0a2, 0x04c, /* display offset, shift mapping ram counter */
|
||||||
|
0x0a1, 0x000, /* display start line */
|
||||||
|
0x0ad, 0x002, /* master configuration: disable embedded DC-DC, enable internal VCOMH */
|
||||||
|
0x0a0, 0x052, /* remap configuration, horizontal address increment (bit 2 = 0), enable nibble remap (upper nibble is left, bit 1 = 1), old values: 0x0a0 0x0a6 */
|
||||||
|
0x086, /* full current range (0x084, 0x085, 0x086) */
|
||||||
|
0x0b8, /* set gray scale table */
|
||||||
|
//0x01, 0x011, 0x022, 0x032, 0x043, 0x054, 0x065, 0x076,
|
||||||
|
0x01, 0x011, 0x022, 0x032, 0x043, 0x054, 0x077, 0x077, // 4L mode uses 0, 2, 4, 7
|
||||||
|
0x081, 0x070, /* contrast, brightness, 0..128, Newhaven: 0x040 */
|
||||||
|
0x0b2, 0x051, /* frame frequency (row period) */
|
||||||
|
0x0b1, 0x055, /* phase length */
|
||||||
|
0x0bc, 0x010, /* pre-charge voltage level */
|
||||||
|
0x0b4, 0x002, /* set pre-charge compensation level (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0b0, 0x028, /* enable pre-charge compensation (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0be, 0x01c, /* VCOMH voltage */
|
||||||
|
0x0bf, 0x002|0x00d, /* VSL voltage level (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0a4, /* normal display mode */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_prepare_page_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x015, /* column address... */
|
||||||
|
0x000, /* start at column 0 */
|
||||||
|
0x03f, /* end at column 63 (which is y == 127), because there are two pixel in one column */
|
||||||
|
0x075, /* row address... */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1325_gr_prepare_row(u8g_t *u8g, u8g_dev_t *dev, uint8_t delta_row)
|
||||||
|
{
|
||||||
|
uint8_t row = ((u8g_pb_t *)(dev->dev_mem))->p.page;
|
||||||
|
|
||||||
|
row *= ((u8g_pb_t *)(dev->dev_mem))->p.page_height;
|
||||||
|
row += delta_row;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_prepare_page_seq);
|
||||||
|
|
||||||
|
u8g_WriteByte(u8g, dev, row); /* start at the selected row */
|
||||||
|
u8g_WriteByte(u8g, dev, row+1); /* end within the selected row */
|
||||||
|
|
||||||
|
//u8g_SetAddress(u8g, dev, 0); /* instruction mode mode */
|
||||||
|
//u8g_WriteByte(u8g, dev, 0x05c); /* write to ram */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static uint8_t u8g_dev_ssd1325_nhd27oled_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
uint8_t *p = pb->buf;
|
||||||
|
u8g_uint_t cnt;
|
||||||
|
cnt = pb->width;
|
||||||
|
cnt >>= 2;
|
||||||
|
|
||||||
|
for( i = 0; i < pb->p.page_height; i++ )
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1325_gr_prepare_row(u8g, dev, i); /* this will also enable chip select */
|
||||||
|
u8g_WriteSequence4LTo16GrDevice(u8g, dev, cnt, p);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
p+=cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h2_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static uint8_t u8g_dev_ssd1325_nhd27oled_2x_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1325_2bit_nhd_27_12864ucy3_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
uint8_t *p = pb->buf;
|
||||||
|
u8g_uint_t cnt;
|
||||||
|
cnt = pb->width;
|
||||||
|
cnt >>= 2;
|
||||||
|
|
||||||
|
for( i = 0; i < pb->p.page_height; i++ )
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1325_gr_prepare_row(u8g, dev, i); /* this will also enable chip select */
|
||||||
|
u8g_WriteSequence4LTo16GrDevice(u8g, dev, cnt, p);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
p+=cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16h2_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_sw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_hw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1325_nhd27oled_2x_buf[WIDTH*2] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_ssd1325_nhd27oled_2x_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1325_nhd27oled_2x_buf};
|
||||||
|
u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_gr_sw_spi = { u8g_dev_ssd1325_nhd27oled_2x_gr_fn, &u8g_dev_ssd1325_nhd27oled_2x_pb, U8G_COM_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_gr_hw_spi = { u8g_dev_ssd1325_nhd27oled_2x_gr_fn, &u8g_dev_ssd1325_nhd27oled_2x_pb, U8G_COM_HW_SPI };
|
|
@ -0,0 +1,299 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_ssd1327_96x96_gr.c
|
||||||
|
|
||||||
|
2-Bit (graylevel) Driver for SSD1327 Controller (OLED Display)
|
||||||
|
Tested with Seedstudio 96x96 Oled (LY120)
|
||||||
|
http://www.seeedstudio.com/wiki/index.php?title=Twig_-_OLED_96x96
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
SSD130x Monochrom OLED Controller
|
||||||
|
SSD131x Character OLED Controller
|
||||||
|
SSD132x Graylevel OLED Controller
|
||||||
|
SSD1331 Color OLED Controller
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 96
|
||||||
|
#define HEIGHT 96
|
||||||
|
#define XOFFSET 8
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://www.seeedstudio.com/wiki/index.php?title=Twig_-_OLED_96x96
|
||||||
|
*/
|
||||||
|
static const uint8_t u8g_dev_ssd1327_2bit_96x96_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_DLY(10), /* delay 10 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0fd, 0x012, /* unlock display, usually not required because the display is unlocked after reset */
|
||||||
|
0x0ae, /* display off, sleep mode */
|
||||||
|
0x0a8, 0x05f, /* multiplex ratio: 0x05f * 1/64 duty */
|
||||||
|
0x0a1, 0x000, /* display start line */
|
||||||
|
0x0a2, 0x060, /* display offset, shift mapping ram counter */
|
||||||
|
//0x0a2, 0x04c, /* NHD: display offset, shift mapping ram counter */
|
||||||
|
0x0a0, 0x046, /* remap configuration, vertical address increment, enable nibble remap (upper nibble is left) */
|
||||||
|
//0x0a0, 0x056, /* NHD: remap configuration, vertical address increment, enable nibble remap (upper nibble is left) */
|
||||||
|
0x0ab, 0x001, /* Enable internal VDD regulator (RESET) */
|
||||||
|
0x081, 0x053, /* contrast, brightness, 0..128, Newhaven: 0x040, LY120 0x053, 0x070 seems also ok */
|
||||||
|
0x0b1, 0x051, /* phase length */
|
||||||
|
0x0b3, 0x001, /* set display clock divide ratio/oscillator frequency */
|
||||||
|
0x0b9, /* use linear lookup table */
|
||||||
|
#if 0
|
||||||
|
0x0b8, /* set gray scale table */
|
||||||
|
//0x01, 0x011, 0x022, 0x032, 0x043, 0x054, 0x065, 0x076,
|
||||||
|
0x01, 0x011, 0x022, 0x032, 0x043, 0x054, 0x077, 0x077, // 4L mode uses 0, 2, 4, 7
|
||||||
|
#endif
|
||||||
|
0x0bc, 0x008, /* pre-charge voltage level */
|
||||||
|
0x0be, 0x007, /* VCOMH voltage */
|
||||||
|
0x0b6, 0x001, /* second precharge */
|
||||||
|
0x0d5, 0x062, /* enable second precharge, internal vsl (bit0 = 0) */
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// the following commands are not used by the SeeedGrayOLED sequence */
|
||||||
|
0x0ad, 0x002, /* master configuration: disable embedded DC-DC, enable internal VCOMH */
|
||||||
|
0x086, /* full current range (0x084, 0x085, 0x086) */
|
||||||
|
0x0b2, 0x051, /* frame frequency (row period) */
|
||||||
|
0x0b4, 0x002, /* set pre-charge compensation level (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0b0, 0x028, /* enable pre-charge compensation (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
0x0bf, 0x002|0x00d, /* VSL voltage level (not documented in the SDD1325 datasheet, but used in the NHD init seq.) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
0x0a5, /* all pixel on */
|
||||||
|
//0x02e, /* no scroll (according to SeeedGrayOLED sequence) */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display mode */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a5, /* all pixel on */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display mode */
|
||||||
|
|
||||||
|
0x015, /* column address... */
|
||||||
|
0x008, /* start at column 8, special for the LY120 ??? */
|
||||||
|
0x037, /* end at column 55, note: there are two pixel in one column */
|
||||||
|
|
||||||
|
0x075, /* row address... */
|
||||||
|
0x008,
|
||||||
|
0x05f,
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000f, 0x000f, 0x0000, 0x0000, 0x000f,0x000f,0x0000,0x0000,
|
||||||
|
0x000f, 0x000f, 0x0000, 0x0000, 0x000f,0x000f,0x0000,0x0000,
|
||||||
|
0x000f, 0x000f, 0x0000, 0x0000, 0x000f,0x000f,0x0000,0x0000,
|
||||||
|
0x000f, 0x000f, 0x0000, 0x0000, 0x000f,0x000f,0x0000,0x0000,
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_ssd1327_2bit_96x96_prepare_page_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x015, /* column address... */
|
||||||
|
XOFFSET, /* start at column 8, special for the LY120 ??? */
|
||||||
|
0x037, /* end at column 55, note: there are two pixel in one column */
|
||||||
|
0x075, /* row address... */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1327_2bit_prepare_page(u8g_t *u8g, u8g_dev_t *dev)
|
||||||
|
{
|
||||||
|
uint8_t page = ((u8g_pb_t *)(dev->dev_mem))->p.page;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1327_2bit_96x96_prepare_page_seq);
|
||||||
|
|
||||||
|
page <<= 2;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* start at the selected page */
|
||||||
|
page += 3;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* end within the selected page */
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1327_2bit_2x_prepare_page(u8g_t *u8g, u8g_dev_t *dev, uint8_t is_odd)
|
||||||
|
{
|
||||||
|
uint8_t page = ((u8g_pb_t *)(dev->dev_mem))->p.page;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1327_2bit_96x96_prepare_page_seq);
|
||||||
|
|
||||||
|
page <<= 1;
|
||||||
|
page += is_odd;
|
||||||
|
|
||||||
|
page <<= 2;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* start at the selected page */
|
||||||
|
page += 3;
|
||||||
|
u8g_WriteByte(u8g, dev, page); /* end within the selected page */
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* assumes row autoincrement and activated nibble remap */
|
||||||
|
static void u8g_dev_ssd1327_2bit_write_4_pixel(u8g_t *u8g, u8g_dev_t *dev, uint8_t left, uint8_t right)
|
||||||
|
{
|
||||||
|
uint8_t d, tmp, cnt;
|
||||||
|
static uint8_t buf[4];
|
||||||
|
buf[0] = 0;
|
||||||
|
buf[1] = 0;
|
||||||
|
buf[2] = 0;
|
||||||
|
buf[3] = 0;
|
||||||
|
cnt = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( left == 0 && right == 0 )
|
||||||
|
break;
|
||||||
|
d = left;
|
||||||
|
d &= 3;
|
||||||
|
d <<= 4;
|
||||||
|
tmp = right;
|
||||||
|
tmp &= 3;
|
||||||
|
d |= tmp;
|
||||||
|
d <<= 2;
|
||||||
|
buf[cnt] = d;
|
||||||
|
left >>= 2;
|
||||||
|
right >>= 2;
|
||||||
|
cnt++;
|
||||||
|
}while ( cnt < 4 );
|
||||||
|
u8g_WriteSequence(u8g, dev, 4, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1327_2bit_write_buffer(u8g_t *u8g, u8g_dev_t *dev)
|
||||||
|
{
|
||||||
|
uint8_t cnt, left, right;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
cnt = pb->width;
|
||||||
|
cnt >>= 1;
|
||||||
|
ptr = pb->buf;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
left = *ptr++;
|
||||||
|
right = *ptr++;
|
||||||
|
u8g_dev_ssd1327_2bit_write_4_pixel(u8g, dev, left, right);
|
||||||
|
cnt--;
|
||||||
|
} while( cnt > 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void u8g_dev_ssd1327_2bit_2x_write_buffer(u8g_t *u8g, u8g_dev_t *dev, uint8_t is_odd)
|
||||||
|
{
|
||||||
|
uint8_t cnt, left, right;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
ptr = pb->buf;
|
||||||
|
cnt = pb->width;
|
||||||
|
if ( is_odd )
|
||||||
|
ptr += cnt;
|
||||||
|
cnt >>= 1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
left = *ptr++;
|
||||||
|
right = *ptr++;
|
||||||
|
u8g_dev_ssd1327_2bit_write_4_pixel(u8g, dev, left, right);
|
||||||
|
cnt--;
|
||||||
|
} while( cnt > 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1327_96x96_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1327_2bit_96x96_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1327_2bit_prepare_page(u8g, dev);
|
||||||
|
u8g_dev_ssd1327_2bit_write_buffer(u8g, dev);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v2_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_ssd1327_96x96_2x_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1327_2bit_96x96_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_dev_ssd1327_2bit_2x_prepare_page(u8g, dev, 0);
|
||||||
|
u8g_dev_ssd1327_2bit_2x_write_buffer(u8g, dev, 0);
|
||||||
|
u8g_dev_ssd1327_2bit_2x_prepare_page(u8g, dev, 1);
|
||||||
|
u8g_dev_ssd1327_2bit_2x_write_buffer(u8g, dev, 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16v2_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1327_96x96_gr_sw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1327_96x96_gr_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1327_96x96_gr_hw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1327_96x96_gr_fn, U8G_COM_HW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_ssd1327_96x96_gr_i2c , WIDTH, HEIGHT, 4, u8g_dev_ssd1327_96x96_gr_fn, U8G_COM_SSD_I2C);
|
||||||
|
|
||||||
|
#define DWIDTH (2*WIDTH)
|
||||||
|
uint8_t u8g_dev_ssd1327_96x96_2x_buf[DWIDTH] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_ssd1327_96x96_2x_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1327_96x96_2x_buf};
|
||||||
|
u8g_dev_t u8g_dev_ssd1327_96x96_2x_gr_sw_spi = { u8g_dev_ssd1327_96x96_2x_gr_fn, &u8g_dev_ssd1327_96x96_2x_pb, U8G_COM_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_ssd1327_96x96_2x_gr_hw_spi = { u8g_dev_ssd1327_96x96_2x_gr_fn, &u8g_dev_ssd1327_96x96_2x_pb, U8G_COM_HW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_ssd1327_96x96_2x_gr_i2c = { u8g_dev_ssd1327_96x96_2x_gr_fn, &u8g_dev_ssd1327_96x96_2x_pb, U8G_COM_SSD_I2C };
|
||||||
|
|
|
@ -0,0 +1,153 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7565_64128n.c (Displaytech)
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
/* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */
|
||||||
|
static const uint8_t u8g_dev_st7565_64128n_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
|
||||||
|
0x0A2, /* 0x0a2: LCD bias 1/9 (according to Displaytech 64128N datasheet) */
|
||||||
|
0x0A0, /* Normal ADC Select (according to Displaytech 64128N datasheet) */
|
||||||
|
|
||||||
|
0x0c8, /* common output mode: set scan direction normal operation/SHL Select, 0x0c0 --> SHL = 0, normal, 0x0c8 --> SHL = 1 */
|
||||||
|
0x040, /* Display start line for Displaytech 64128N */
|
||||||
|
|
||||||
|
0x028 | 0x04, /* power control: turn on voltage converter */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x028 | 0x06, /* power control: turn on voltage regulator */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x028 | 0x07, /* power control: turn on voltage follower */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x010, /* Set V0 voltage resistor ratio. Setting for controlling brightness of Displaytech 64128N */
|
||||||
|
|
||||||
|
0x0a6, /* display normal, bit val 0: LCD pixel off. */
|
||||||
|
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x01e, /* Contrast value. Setting for controlling brightness of Displaytech 64128N */
|
||||||
|
|
||||||
|
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a5, /* display all points, ST7565 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_64128n_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0x10 */
|
||||||
|
0x000, /* set lower 4 bit of the col adr to 0x00. Changed for DisplayTech 64128N */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_64128n_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ac, /* static indicator off */
|
||||||
|
0x000, /* indicator register set (not sure if this is required) */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
0x0a5, /* all points on */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_64128n_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0a4, /* all points off */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7565_64128n_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (ST7565R) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_64128n_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_64128n_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_fn, U8G_COM_HW_SPI);
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7565_dogm128.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
const uint8_t u8g_dev_st7565_dogm128_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x040, /* set display start line */
|
||||||
|
0x0a1, /* ADC set to reverse */
|
||||||
|
0x0c0, /* common output mode: set scan direction normal operation */
|
||||||
|
0x0a6, /* display normal (none reverse) */
|
||||||
|
0x0a2, /* LCD bias 1/9 */
|
||||||
|
0x02f, /* all power control circuits on */
|
||||||
|
0x0f8, /* set booster ratio to */
|
||||||
|
0x000, /* 4x */
|
||||||
|
0x027, /* set V0 voltage resistor ratio to large */
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x018, /* contrast value, EA default: 0x016 */
|
||||||
|
0x0ac, /* indicator */
|
||||||
|
0x000, /* disable */
|
||||||
|
0x0a4, /* normal display (not all on) */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_dogm128_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0 */
|
||||||
|
0x000, /* set lower 4 bit of the col adr to 0 */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_dogm128_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ac, /* static indicator off */
|
||||||
|
0x000, /* indicator register set (not sure if this is required) */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
0x0a5, /* all points on */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_dogm128_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0a4, /* all points off */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7565_dogm128_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_dogm128_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_dogm128_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (ST7565R) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_dogm128_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_dogm128_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_dogm128_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_dogm128_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_dogm128_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_dogm128_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,157 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7565_dogm132.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 132
|
||||||
|
#define HEIGHT 32
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_dogm132_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x040, /* set display start line to 0 */
|
||||||
|
0x0a1, /* ADC set to reverse */
|
||||||
|
0x0c0, /* common output mode */
|
||||||
|
0x0a6, /* display normal, bit val 0: LCD pixel off. */
|
||||||
|
0x0a2, /* LCD bias 1/9 */
|
||||||
|
0x02f, /* all power control circuits on */
|
||||||
|
0x0f8, /* set booster ratio to */
|
||||||
|
0x000, /* 4x */
|
||||||
|
0x023, /* set V0 voltage resistor ratio to large */
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x01f, /* contrast value, EA default: 0x01f */
|
||||||
|
0x0ac, /* indicator */
|
||||||
|
0x000, /* disable */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
#ifdef OBSOLETE_DOGM128
|
||||||
|
0x040, /* set display start line */
|
||||||
|
0x0c8, /* set scan direction inverse operation */
|
||||||
|
0x0a2, /* LCD bias 1/9 */
|
||||||
|
0x02f, /* all power control circuits on */
|
||||||
|
0x0f8, /* set booster ratio to */
|
||||||
|
0x000, /* 4x */
|
||||||
|
0x027, /* set V0 voltage resistor ratio to large */
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x018, /* contrast value, EA default: 0x016 */
|
||||||
|
0x0ac, /* indicator */
|
||||||
|
0x000, /* disable */
|
||||||
|
0x0af, /* display on */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a5, /* display all points, ST7565 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_dogm132_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0 */
|
||||||
|
0x000, /* set lower 4 bit of the col adr to 0 */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_dogm132_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ac, /* static indicator off */
|
||||||
|
0x000, /* indicator register set (not sure if this is required) */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
0x0a5, /* all points on */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_dogm132_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0a4, /* all points off */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7565_dogm132_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_dogm132_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_dogm132_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (ST7565R) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_dogm132_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_dogm132_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_dogm132_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_dogm132_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_dogm132_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_dogm132_fn, U8G_COM_HW_SPI);
|
|
@ -0,0 +1,157 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7565_lm6059.c (Adafruit display)
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
/* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */
|
||||||
|
static const uint8_t u8g_dev_st7565_lm6059_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
|
||||||
|
0x0a3, /* 0x0a2: LCD bias 1/9 (suggested for the LM6063), 0x0a3: Used by Adafruit, 0x0a2 does not work */
|
||||||
|
/* the LM6059 vs LM6063, ADC and SHL have inverted settings */
|
||||||
|
0x0a0, /* 0x0a1: ADC set to normal (suggested for the LM6059), 0x0a0: Used by Adafruit -> normal mode */
|
||||||
|
0x0c8, /* common output mode: set scan direction normal operation/SHL Select, 0x0c0 --> SHL = 0, normal, 0x0c8 --> SHL = 1 */
|
||||||
|
0x060, /* set display start line */
|
||||||
|
|
||||||
|
0x028 | 0x04, /* power control: turn on voltage converter */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x028 | 0x06, /* power control: turn on voltage regulator */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x028 | 0x07, /* power control: turn on voltage follower */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x026, /* set V0 voltage resistor ratio to 6 (Adafruit Value, no info from LM6063 Manual) */
|
||||||
|
|
||||||
|
0x0a6, /* display normal, bit val 0: LCD pixel off. */
|
||||||
|
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x018, /* contrast value*/
|
||||||
|
|
||||||
|
/*0x0ac,*/ /* indicator */
|
||||||
|
/*0x000,*/ /* disable */
|
||||||
|
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a5, /* display all points, ST7565 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_lm6059_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0 */
|
||||||
|
0x001, /* set lower 4 bit of the col adr */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_lm6059_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ac, /* static indicator off */
|
||||||
|
0x000, /* indicator register set (not sure if this is required) */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
0x0a5, /* all points on */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_lm6059_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0a4, /* all points off */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7565_lm6059_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (ST7565R) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6059_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_lm6059_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_lm6059_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_lm6059_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_lm6059_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,188 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7565_lm6063.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
#ifdef OLD_ADAFRUIT_CODE
|
||||||
|
static const uint8_t OLD_u8g_dev_st7565_lm6063_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x040, /* set display start line */
|
||||||
|
0x0a1, /* ADC set to reverse */
|
||||||
|
0x0c8, /* common output mode: set scan direction normal operation/SHL Select / 17 Jan: seems to be a bug, must be 0x0c0 */
|
||||||
|
0x0a6, /* display normal, bit val 0: LCD pixel off. */
|
||||||
|
0x0a2, /* LCD bias 1/9 */
|
||||||
|
0x02f, /* all power control circuits on */
|
||||||
|
/*0x0f8,*/ /* set booster ratio to */
|
||||||
|
/*0x000, */ /* 4x */
|
||||||
|
/*0x027,*/ /* set V0 voltage resistor ratio to large */
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x018, /* contrast value*/
|
||||||
|
0x0ac, /* indicator */
|
||||||
|
0x000, /* disable */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a5, /* display all points, ST7565 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */
|
||||||
|
static const uint8_t u8g_dev_st7565_lm6063_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
|
||||||
|
0x0a3, /* 0x0a2: LCD bias 1/9 (suggested for the LM6063), 0x0a3: Used by Adafruit */
|
||||||
|
0x0a1, /* 0x0a1: ADC set to reverse (suggested for the LM6063), 0x0a0: Used by Adafruit -> normal mode */
|
||||||
|
0x0c0, /* common output mode: set scan direction normal operation/SHL Select, 0x0c0 --> SHL = 0, normal, 0x0c8 --> SHL = 1 */
|
||||||
|
0x040, /* set display start line */
|
||||||
|
|
||||||
|
0x028 | 0x04, /* power control: turn on voltage converter */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x028 | 0x06, /* power control: turn on voltage regulator */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x028 | 0x07, /* power control: turn on voltage follower */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x026, /* set V0 voltage resistor ratio to 6 (Adafruit Value, no info from LM6063 Manual) */
|
||||||
|
|
||||||
|
0x0a6, /* display normal, bit val 0: LCD pixel off. */
|
||||||
|
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x018, /* contrast value*/
|
||||||
|
|
||||||
|
/*0x0ac,*/ /* indicator */
|
||||||
|
/*0x000,*/ /* disable */
|
||||||
|
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a5, /* display all points, ST7565 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_lm6063_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0 */
|
||||||
|
0x000, /* set lower 4 bit of the col adr to 0 */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_st7565_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ac, /* static indicator off */
|
||||||
|
0x000, /* indicator register set (not sure if this is required) */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
0x0a5, /* all points on */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_st7565_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0a4, /* all points off */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7565_lm6063_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6063_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_lm6063_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (ST7565R) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_st7565_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_st7565_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_lm6063_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_lm6063_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_lm6063_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_lm6063_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,143 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7565_nhd_c12832.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 32
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_c12832_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x040, /* set display start line to 0 */
|
||||||
|
0x0a0, /* ADC set, values: a0=normal, a1=reverse */
|
||||||
|
0x0c8, /* common output mode: c0=normal, c8=reverse */
|
||||||
|
0x0a6, /* display normal, bit val 0: LCD pixel off. */
|
||||||
|
0x0a2, /* LCD bias 1/9 */
|
||||||
|
0x02f, /* all power control circuits on */
|
||||||
|
0x0f8, /* set booster ratio to */
|
||||||
|
0x000, /* 4x */
|
||||||
|
0x023, /* set V0 voltage resistor ratio to large */
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x00a, /* contrast value */
|
||||||
|
0x0ac, /* indicator */
|
||||||
|
0x000, /* disable */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a5, /* display all points, ST7565 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_c12832_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0 */
|
||||||
|
0x000, /* set lower 4 bit of the col adr to 0 */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_c12832_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ac, /* static indicator off */
|
||||||
|
0x000, /* indicator register set (not sure if this is required) */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
0x0a5, /* all points on */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_c12832_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0a4, /* all points off */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7565_c12832_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_c12832_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_c12832_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (ST7565R) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_c12832_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_c12832_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_nhd_c12832_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_c12832_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_nhd_c12832_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_c12832_fn, U8G_COM_HW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_nhd_c12832_parallel, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_c12832_fn, U8G_COM_PARALLEL);
|
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7565_nhd_c12864.c
|
||||||
|
|
||||||
|
Support for the NHD-C12864A1Z-FSB-FBW (Newhaven Display)
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
const uint8_t u8g_dev_st7565_nhd_c12864_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(10), /* do reset low pulse with (10*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
|
||||||
|
0x040, /* set display start line */
|
||||||
|
0x0a1, /* ADC set to reverse */
|
||||||
|
0x0c0, /* common output mode: set scan direction normal operation */
|
||||||
|
0x0a6, /* display normal, bit val 0: LCD pixel off. */
|
||||||
|
0x0a2, /* LCD bias 1/9 */
|
||||||
|
0x02f, /* all power control circuits on */
|
||||||
|
0x0f8, /* set booster ratio to */
|
||||||
|
0x000, /* 4x */
|
||||||
|
0x027, /* set V0 voltage resistor ratio to large */
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x008, /* contrast: 0x008 is a good value for NHD C12864, Nov 2012: User reports that 0x1a is much better */
|
||||||
|
0x0ac, /* indicator */
|
||||||
|
0x000, /* disable */
|
||||||
|
0x0af, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a5, /* display all points, ST7565 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_nhd_c12864_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0 */
|
||||||
|
0x004, /* set lower 4 bit of the col adr to 4 (NHD C12864) */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_c12864_sleep_on[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0ac, /* static indicator off */
|
||||||
|
0x000, /* indicator register set (not sure if this is required) */
|
||||||
|
0x0ae, /* display off */
|
||||||
|
0x0a5, /* all points on */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7565_c12864_sleep_off[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0a4, /* all points off */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
U8G_ESC_CS(1), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7565_nhd_c12864_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_nhd_c12864_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_nhd_c12864_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (ST7565R) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_ON:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_c12864_sleep_on);
|
||||||
|
return 1;
|
||||||
|
case U8G_DEV_MSG_SLEEP_OFF:
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_c12864_sleep_off);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_nhd_c12864_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_nhd_c12864_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7565_nhd_c12864_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_nhd_c12864_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,420 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7687_c144mvgd.c (1.44" TFT)
|
||||||
|
|
||||||
|
Status: Started, but not finished
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2012, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 128
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef FIRST_VERSION
|
||||||
|
/*
|
||||||
|
see also: read.pudn.com/downloads115/sourcecode/app/484503/LCM_Display.c__.htm
|
||||||
|
http://en.pudn.com/downloads115/sourcecode/app/detail484503_en.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7687_c144mvgd_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
|
||||||
|
0x001, /* A0=0, SW reset */
|
||||||
|
U8G_ESC_DLY(200), /* delay 200 ms */
|
||||||
|
|
||||||
|
0x0d7, /* EEPROM data auto re-load control */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x09f, /* ARD = 1 */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
0x0e0, /* EEPROM control in */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
#ifdef NOT_REQUIRED
|
||||||
|
0x0fa, /* EEPROM function selection 8.1.66 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
0x0e3, /* Read from EEPROM, 8.1.55 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
0x0e1, /* EEPROM control out, 8.1.53 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
//0x028, /* display off */
|
||||||
|
0x011, /* Sleep out & booster on */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
0x0c0, /* Vop setting, 8.1.42 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
0x001, /* 3.6 + 256*0.04 = 13.84 Volt */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
0x0c3, /* Bias selection, 8.1.45 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x003,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0c4, /* Booster setting 8.1.46 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x007,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0c5, /* ??? */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x001,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0cb, /* FV3 with Booster x2 control, 8.1.47 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x001,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x036, /* Memory data access control, 8.1.28 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x080,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0b5, /* N-line control, 8.1.37 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x089,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
|
||||||
|
0x0d0, /* Analog circuit setting, 8.1.49 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x01d,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0b7, /* Com/Seg Scan Direction, 8.1.38 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x040,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x025, /* Write contrast, 8.1.17 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x03f,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x03a, /* Interface pixel format, 8.1.32 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x004, /* 3: 12 bit per pixel Type A, 4: 12 bit Type B, 5: 16bit per pixel */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0b0, /* Display Duty setting, 8.1.34 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x07f,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0f0, /* Frame Freq. in Temp range A,B,C and D, 8.1.59 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x007,
|
||||||
|
0x00c,
|
||||||
|
0x00c,
|
||||||
|
0x015,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0f9, /* Frame RGB Value, 8.1.65 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000,
|
||||||
|
0x005,
|
||||||
|
0x008,
|
||||||
|
0x00a,
|
||||||
|
0x00c,
|
||||||
|
0x00e,
|
||||||
|
0x010,
|
||||||
|
0x011,
|
||||||
|
0x012,
|
||||||
|
0x013,
|
||||||
|
0x014,
|
||||||
|
0x015,
|
||||||
|
0x016,
|
||||||
|
0x018,
|
||||||
|
0x01a,
|
||||||
|
0x01b,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0f9, /* Frame RGB Value, 8.1.65 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000,
|
||||||
|
0x000,
|
||||||
|
0x000,
|
||||||
|
0x000,
|
||||||
|
0x033,
|
||||||
|
0x055,
|
||||||
|
0x055,
|
||||||
|
0x055,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x029, /* display on */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://www.waitingforfriday.com/images/e/e3/FTM144D01N_test.zip
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_st7687_c144mvgd_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
|
||||||
|
0x011, /* Sleep out & booster on */
|
||||||
|
U8G_ESC_DLY(5), /* delay 5 ms */
|
||||||
|
|
||||||
|
0x03a, /* Interface pixel format, 8.1.32 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x004, /* 3: 12 bit per pixel Type A, 4: 12 bit Type B, 5: 16bit per pixel */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
|
||||||
|
0x026, /* SET_GAMMA_CURVE */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x004,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0f2, /* GAM_R_SEL */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x001, /* enable gamma adj */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
|
||||||
|
0x0e0, /* POSITIVE_GAMMA_CORRECT */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x3f,
|
||||||
|
0x25,
|
||||||
|
0x1c,
|
||||||
|
0x1e,
|
||||||
|
0x20,
|
||||||
|
0x12,
|
||||||
|
0x2a,
|
||||||
|
0x90,
|
||||||
|
0x24,
|
||||||
|
0x11,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0e1, /* NEGATIVE_GAMMA_CORRECT */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x20,
|
||||||
|
0x20,
|
||||||
|
0x20,
|
||||||
|
0x20,
|
||||||
|
0x05,
|
||||||
|
0x00,
|
||||||
|
0x15,
|
||||||
|
0xa7,
|
||||||
|
0x3d,
|
||||||
|
0x18,
|
||||||
|
0x25,
|
||||||
|
0x2a,
|
||||||
|
0x2b,
|
||||||
|
0x2b,
|
||||||
|
0x3a,
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0b1, /* FRAME_RATE_CONTROL1 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x008, /* DIVA = 8 */
|
||||||
|
0x008, /* VPA = 8 */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
|
||||||
|
0x0b4, /* DISPLAY_INVERSION */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x007, /* NLA = 1, NLB = 1, NLC = 1 (all on Frame Inversion) */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0c0, /* POWER_CONTROL1 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x00a, /* VRH = 10: GVDD = 4.30 */
|
||||||
|
0x002, /* VC = 2: VCI1 = 2.65 */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0c1, /* POWER_CONTROL2 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x002, /* BT = 2: AVDD = 2xVCI1, VCL = -1xVCI1, VGH = 5xVCI1, VGL = -2xVCI1 */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0c5, /* VCOM_CONTROL1 */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x050, /* VMH = 80: VCOMH voltage = 4.5 */
|
||||||
|
0x05b, /* VML = 91: VCOML voltage = -0.225 */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x0c7, /* VCOM_OFFSET_CONTROL */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x040, /* nVM = 0, VMF = 64: VCOMH output = VMH, VCOML output = VML */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x02a, /* SET_COLUMN_ADDRESS */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
0x000, /* */
|
||||||
|
0x000, /* */
|
||||||
|
0x07f, /* */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x02b, /* SET_PAGE_ADDRESS */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000, /* */
|
||||||
|
0x000, /* */
|
||||||
|
0x000, /* */
|
||||||
|
0x07f, /* */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
0x036, /* SET_ADDRESS_MODE */
|
||||||
|
U8G_ESC_ADR(1), /* data mode */
|
||||||
|
0x000, /* Select display orientation */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
|
||||||
|
|
||||||
|
0x029, /* display on */
|
||||||
|
|
||||||
|
0x02c, /* write start */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* calculate bytes for Type B 4096 color display */
|
||||||
|
static uint8_t get_byte_1(uint8_t v)
|
||||||
|
{
|
||||||
|
v >>= 4;
|
||||||
|
v &= 0x0e;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t get_byte_2(uint8_t v)
|
||||||
|
{
|
||||||
|
uint8_t w;
|
||||||
|
w = v;
|
||||||
|
w &= 3;
|
||||||
|
w = (w<<2) | w;
|
||||||
|
v <<= 3;
|
||||||
|
v &= 0x0e0;
|
||||||
|
w |= v;
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7687_c144mvgd_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7687_c144mvgd_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i, j;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x02a ); /* Column address set 8.1.20 */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x000 ); /* x0 */
|
||||||
|
u8g_WriteByte(u8g, dev, WIDTH-1 ); /* x1 */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x02b ); /* Row address set 8.1.21 */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, y ); /* y0 */
|
||||||
|
u8g_WriteByte(u8g, dev, y+PAGE_HEIGHT-1 ); /* y1 */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x02c ); /* Memory write 8.1.22 */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
|
||||||
|
for( i = 0; i < PAGE_HEIGHT; i ++ )
|
||||||
|
{
|
||||||
|
|
||||||
|
for( j = 0; j < WIDTH; j ++ )
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, get_byte_1(*ptr) );
|
||||||
|
u8g_WriteByte(u8g, dev, get_byte_2(*ptr) );
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h8_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_st7687_c144mvgd_8h8_buf[WIDTH*8] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_st7687_c144mvgd_8h8_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_st7687_c144mvgd_8h8_buf};
|
||||||
|
|
||||||
|
u8g_dev_t u8g_dev_st7687_c144mvgd_sw_spi = { u8g_dev_st7687_c144mvgd_fn, &u8g_st7687_c144mvgd_8h8_pb, u8g_com_arduino_sw_spi_fn };
|
||||||
|
|
||||||
|
u8g_dev_t u8g_dev_st7687_c144mvgd_8bit = { u8g_dev_st7687_c144mvgd_fn, &u8g_st7687_c144mvgd_8h8_pb, U8G_COM_PARALLEL };
|
|
@ -0,0 +1,171 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7565_128x64.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
/* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */
|
||||||
|
static const uint8_t u8g_dev_st7920_128x64_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
U8G_ESC_DLY(100), /* 8 Dez 2012: additional delay 100 ms because of reset*/
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x038, /* 8 Bit interface (DL=1), basic instruction set (RE=0) */
|
||||||
|
0x00c, /* display on, cursor & blink off; 0x08: all off */
|
||||||
|
0x006, /* Entry mode: Cursor move to right ,DDRAM address counter (AC) plus 1, no shift */
|
||||||
|
0x002, /* disable scroll, enable CGRAM adress */
|
||||||
|
0x001, /* clear RAM, needs 1.6 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
for( i = 0; i < 8; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x03e ); /* enable extended mode */
|
||||||
|
|
||||||
|
if ( y < 32 )
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7920_128x64_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
for( i = 0; i < 32; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x03e ); /* enable extended mode */
|
||||||
|
|
||||||
|
if ( y < 32 )
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_st7920_128x64_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_fn, U8G_COM_ST7920_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7920_128x64_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_fn, U8G_COM_ST7920_HW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7920_128x64_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_fn, U8G_COM_FAST_PARALLEL);
|
||||||
|
|
||||||
|
#define QWIDTH (WIDTH*4)
|
||||||
|
uint8_t u8g_dev_st7920_128x64_4x_buf[QWIDTH] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_st7920_128x64_4x_pb = { {32, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_st7920_128x64_4x_buf};
|
||||||
|
u8g_dev_t u8g_dev_st7920_128x64_4x_sw_spi = { u8g_dev_st7920_128x64_4x_fn, &u8g_dev_st7920_128x64_4x_pb, U8G_COM_ST7920_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_st7920_128x64_4x_hw_spi = { u8g_dev_st7920_128x64_4x_fn, &u8g_dev_st7920_128x64_4x_pb, U8G_COM_ST7920_HW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_st7920_128x64_4x_8bit = { u8g_dev_st7920_128x64_4x_fn, &u8g_dev_st7920_128x64_4x_pb, U8G_COM_FAST_PARALLEL };
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,151 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7920_192x32.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 192
|
||||||
|
#define HEIGHT 32
|
||||||
|
|
||||||
|
|
||||||
|
/* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */
|
||||||
|
static const uint8_t u8g_dev_st7920_192x32_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
U8G_ESC_DLY(100), /* 8 Dez 2012: additional delay 100 ms because of reset*/
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x038, /* 8 Bit interface (DL=1), basic instruction set (RE=0) */
|
||||||
|
0x00c, /* display on, cursor & blink off; 0x08: all off */
|
||||||
|
0x006, /* Entry mode: Cursor move to right ,DDRAM address counter (AC) plus 1, no shift */
|
||||||
|
0x002, /* disable scroll, enable CGRAM adress */
|
||||||
|
0x001, /* clear RAM, needs 1.6 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 10 ms */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7920_192x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_192x32_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
for( i = 0; i < 8; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x03e ); /* enable extended mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7920_192x32_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_192x32_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
for( i = 0; i < 32; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x03e ); /* enable extended mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_st7920_192x32_sw_spi, WIDTH, HEIGHT, 8, u8g_dev_st7920_192x32_fn, U8G_COM_ST7920_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7920_192x32_hw_spi, WIDTH, HEIGHT, 8, u8g_dev_st7920_192x32_fn, U8G_COM_ST7920_HW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7920_192x32_8bit, WIDTH, HEIGHT, 8, u8g_dev_st7920_192x32_fn, U8G_COM_FAST_PARALLEL);
|
||||||
|
|
||||||
|
|
||||||
|
#define QWIDTH (WIDTH*4)
|
||||||
|
uint8_t u8g_dev_st7920_192x32_4x_buf[QWIDTH] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_st7920_192x32_4x_pb = { {32, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_st7920_192x32_4x_buf};
|
||||||
|
u8g_dev_t u8g_dev_st7920_192x32_4x_sw_spi = { u8g_dev_st7920_192x32_4x_fn, &u8g_dev_st7920_192x32_4x_pb, U8G_COM_ST7920_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_st7920_192x32_4x_hw_spi = { u8g_dev_st7920_192x32_4x_fn, &u8g_dev_st7920_192x32_4x_pb, U8G_COM_ST7920_HW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_st7920_192x32_4x_8bit = { u8g_dev_st7920_192x32_4x_fn, &u8g_dev_st7920_192x32_4x_pb, U8G_COM_FAST_PARALLEL };
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_st7920_202x32.c
|
||||||
|
tested with CFAG20232
|
||||||
|
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 202
|
||||||
|
#define HEIGHT 32
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
/* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */
|
||||||
|
static const uint8_t u8g_dev_st7920_202x32_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
U8G_ESC_DLY(100), /* 8 Dez 2012: additional delay 100 ms because of reset*/
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
0x038, /* 8 Bit interface (DL=1), basic instruction set (RE=0) */
|
||||||
|
0x00c, /* display on, cursor & blink off; 0x08: all off */
|
||||||
|
0x006, /* Entry mode: Cursor move to right ,DDRAM address counter (AC) plus 1, no shift */
|
||||||
|
0x002, /* disable scroll, enable CGRAM adress */
|
||||||
|
0x001, /* clear RAM, needs 1.6 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 10 ms */
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7920_202x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_202x32_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
for( i = 0; i < 8; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x03e ); /* enable extended mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_st7920_202x32_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_202x32_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
for( i = 0; i < 32; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x03e ); /* enable extended mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_st7920_202x32_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_202x32_fn, U8G_COM_ST7920_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7920_202x32_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_202x32_fn, U8G_COM_ST7920_HW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_st7920_202x32_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_202x32_fn, U8G_COM_FAST_PARALLEL);
|
||||||
|
|
||||||
|
#define QWIDTH (WIDTH*4)
|
||||||
|
uint8_t u8g_dev_st7920_202x32_4x_buf[QWIDTH] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_st7920_202x32_4x_pb = { {32, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_st7920_202x32_4x_buf};
|
||||||
|
u8g_dev_t u8g_dev_st7920_202x32_4x_sw_spi = { u8g_dev_st7920_202x32_4x_fn, &u8g_dev_st7920_202x32_4x_pb, U8G_COM_ST7920_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_st7920_202x32_4x_hw_spi = { u8g_dev_st7920_202x32_4x_fn, &u8g_dev_st7920_202x32_4x_pb, U8G_COM_ST7920_HW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_st7920_202x32_4x_8bit = { u8g_dev_st7920_202x32_4x_fn, &u8g_dev_st7920_202x32_4x_pb, U8G_COM_FAST_PARALLEL };
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,191 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_t6963_128x64.c
|
||||||
|
|
||||||
|
Tested with Varitronix MGLS240128TZ
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2013, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
Application Notes for the MGLS 240x128
|
||||||
|
www.baso.no/content/pdf/T6963C_Application.pdf
|
||||||
|
|
||||||
|
Hitachi App Notes:
|
||||||
|
https://www.sparkfun.com/datasheets/LCD/Monochrome/AN-029-Toshiba_T6963C.pdf
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
The font selection pins should generate the 8x8 font.
|
||||||
|
For the MGLS240128TZ only FS1 is available on pin 18.
|
||||||
|
FS1 must be low to generate the 8x8 font.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 128
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 16
|
||||||
|
|
||||||
|
|
||||||
|
/* text is not used, so settings are not relevant */
|
||||||
|
static const uint8_t u8g_dev_t6963_128x64_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x021, /* set cursor position */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x022, /* set offset */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x040, /* text home */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
WIDTH/8, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x041, /* text columns */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x042, /* graphics home */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
WIDTH/8, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x043, /* graphics columns */
|
||||||
|
|
||||||
|
// mode set
|
||||||
|
// 0x080: Internal CG, OR Mode
|
||||||
|
// 0x081: Internal CG, EXOR Mode
|
||||||
|
// 0x083: Internal CG, AND Mode
|
||||||
|
// 0x088: External CG, OR Mode
|
||||||
|
// 0x089: External CG, EXOR Mode
|
||||||
|
// 0x08B: External CG, AND Mode
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x080, /* mode register: OR Mode, Internal Character Mode */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
// display mode
|
||||||
|
// 0x090: Display off
|
||||||
|
// 0x094: Graphic off, text on, cursor off, blink off
|
||||||
|
// 0x096: Graphic off, text on, cursor on, blink off
|
||||||
|
// 0x097: Graphic off, text on, cursor on, blink on
|
||||||
|
// 0x098: Graphic on, text off, cursor off, blink off
|
||||||
|
// 0x09a: Graphic on, text off, cursor on, blink off
|
||||||
|
// ...
|
||||||
|
// 0x09c: Graphic on, text on, cursor off, blink off
|
||||||
|
// 0x09f: Graphic on, text on, cursor on, blink on
|
||||||
|
0x098, /* mode register: Display Mode, Graphics on, Text off, Cursor off */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x024, /* set adr pointer */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_t6963_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_t6963_128x64_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint16_t disp_ram_adr;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
disp_ram_adr = WIDTH/8;
|
||||||
|
disp_ram_adr *= y;
|
||||||
|
for( i = 0; i < PAGE_HEIGHT; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr&255 ); /* address low byte */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr>>8 ); /* address hight byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x024 ); /* set adr ptr */
|
||||||
|
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
disp_ram_adr += WIDTH/8;
|
||||||
|
}
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// U8G_PB_DEV(u8g_dev_t6963_128x64_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_t6963_128x64_fn, U8G_COM_T6963);
|
||||||
|
|
||||||
|
uint8_t u8g_dev_t6963_128x64_2x_bw_buf[WIDTH/8*PAGE_HEIGHT] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_t6963_128x64_2x_bw_pb = { {PAGE_HEIGHT, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_t6963_128x64_2x_bw_buf};
|
||||||
|
u8g_dev_t u8g_dev_t6963_128x64_8bit = { u8g_dev_t6963_128x64_fn, &u8g_dev_t6963_128x64_2x_bw_pb, U8G_COM_T6963 };
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,195 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_t6963_240x128.c
|
||||||
|
|
||||||
|
Tested with Varitronix MGLS240128TZ
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2013, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
Application Notes for the MGLS 240x128
|
||||||
|
www.baso.no/content/pdf/T6963C_Application.pdf
|
||||||
|
|
||||||
|
Hitachi App Notes:
|
||||||
|
https://www.sparkfun.com/datasheets/LCD/Monochrome/AN-029-Toshiba_T6963C.pdf
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
The font selection pins should generate the 8x8 font.
|
||||||
|
For the MGLS240128TZ only FS1 is available on pin 18.
|
||||||
|
FS1 must be low to generate the 8x8 font.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 240
|
||||||
|
#define HEIGHT 128
|
||||||
|
#define PAGE_HEIGHT 16
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://www.mark-products.com/graphics.htm#240x64%20Pixel%20Format
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* text is not used, so settings are not relevant */
|
||||||
|
static const uint8_t u8g_dev_t6963_240x128_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x021, /* set cursor position */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x022, /* set offset */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x040, /* text home */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
WIDTH/8, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x041, /* text columns */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x042, /* graphics home */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
WIDTH/8, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x043, /* graphics columns */
|
||||||
|
|
||||||
|
// mode set
|
||||||
|
// 0x080: Internal CG, OR Mode
|
||||||
|
// 0x081: Internal CG, EXOR Mode
|
||||||
|
// 0x083: Internal CG, AND Mode
|
||||||
|
// 0x088: External CG, OR Mode
|
||||||
|
// 0x089: External CG, EXOR Mode
|
||||||
|
// 0x08B: External CG, AND Mode
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x080, /* mode register: OR Mode, Internal Character Mode */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
// display mode
|
||||||
|
// 0x090: Display off
|
||||||
|
// 0x094: Graphic off, text on, cursor off, blink off
|
||||||
|
// 0x096: Graphic off, text on, cursor on, blink off
|
||||||
|
// 0x097: Graphic off, text on, cursor on, blink on
|
||||||
|
// 0x098: Graphic on, text off, cursor off, blink off
|
||||||
|
// 0x09a: Graphic on, text off, cursor on, blink off
|
||||||
|
// ...
|
||||||
|
// 0x09c: Graphic on, text on, cursor off, blink off
|
||||||
|
// 0x09f: Graphic on, text on, cursor on, blink on
|
||||||
|
0x098, /* mode register: Display Mode, Graphics on, Text off, Cursor off */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x024, /* set adr pointer */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_t6963_240x128_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_t6963_240x128_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint16_t disp_ram_adr;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
disp_ram_adr = WIDTH/8;
|
||||||
|
disp_ram_adr *= y;
|
||||||
|
for( i = 0; i < PAGE_HEIGHT; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr&255 ); /* address low byte */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr>>8 ); /* address hight byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x024 ); /* set adr ptr */
|
||||||
|
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
disp_ram_adr += WIDTH/8;
|
||||||
|
}
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// U8G_PB_DEV(u8g_dev_t6963_240x128_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_t6963_240x128_fn, U8G_COM_T6963);
|
||||||
|
|
||||||
|
uint8_t u8g_dev_t6963_240x128_2x_bw_buf[WIDTH/8*PAGE_HEIGHT] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_t6963_240x128_2x_bw_pb = { {PAGE_HEIGHT, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_t6963_240x128_2x_bw_buf};
|
||||||
|
u8g_dev_t u8g_dev_t6963_240x128_8bit = { u8g_dev_t6963_240x128_fn, &u8g_dev_t6963_240x128_2x_bw_pb, U8G_COM_T6963 };
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,195 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_t6963_240x64.c
|
||||||
|
|
||||||
|
Tested with Varitronix MGLS240128TZ
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2013, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
Application Notes for the MGLS 240x128
|
||||||
|
www.baso.no/content/pdf/T6963C_Application.pdf
|
||||||
|
|
||||||
|
Hitachi App Notes:
|
||||||
|
https://www.sparkfun.com/datasheets/LCD/Monochrome/AN-029-Toshiba_T6963C.pdf
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
The font selection pins should generate the 8x8 font.
|
||||||
|
For the MGLS240128TZ only FS1 is available on pin 18.
|
||||||
|
FS1 must be low to generate the 8x8 font.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 240
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 16
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://www.mark-products.com/graphics.htm#240x64%20Pixel%20Format
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* text is not used, so settings are not relevant */
|
||||||
|
static const uint8_t u8g_dev_t6963_240x64_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
U8G_ESC_RST(15), /* do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/
|
||||||
|
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
U8G_ESC_DLY(50), /* delay 50 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x021, /* set cursor position */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x022, /* set offset */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x040, /* text home */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
WIDTH/8, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x041, /* text columns */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x042, /* graphics home */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
WIDTH/8, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x043, /* graphics columns */
|
||||||
|
|
||||||
|
// mode set
|
||||||
|
// 0x080: Internal CG, OR Mode
|
||||||
|
// 0x081: Internal CG, EXOR Mode
|
||||||
|
// 0x083: Internal CG, AND Mode
|
||||||
|
// 0x088: External CG, OR Mode
|
||||||
|
// 0x089: External CG, EXOR Mode
|
||||||
|
// 0x08B: External CG, AND Mode
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x080, /* mode register: OR Mode, Internal Character Mode */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
// display mode
|
||||||
|
// 0x090: Display off
|
||||||
|
// 0x094: Graphic off, text on, cursor off, blink off
|
||||||
|
// 0x096: Graphic off, text on, cursor on, blink off
|
||||||
|
// 0x097: Graphic off, text on, cursor on, blink on
|
||||||
|
// 0x098: Graphic on, text off, cursor off, blink off
|
||||||
|
// 0x09a: Graphic on, text off, cursor on, blink off
|
||||||
|
// ...
|
||||||
|
// 0x09c: Graphic on, text on, cursor off, blink off
|
||||||
|
// 0x09f: Graphic on, text on, cursor on, blink on
|
||||||
|
0x098, /* mode register: Display Mode, Graphics on, Text off, Cursor off */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
0x000, /* low byte */
|
||||||
|
0x000, /* height byte */
|
||||||
|
U8G_ESC_ADR(1), /* instruction mode */
|
||||||
|
0x024, /* set adr pointer */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
|
||||||
|
U8G_ESC_ADR(0), /* data mode */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_t6963_240x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_t6963_240x64_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
uint8_t y, i;
|
||||||
|
uint16_t disp_ram_adr;
|
||||||
|
uint8_t *ptr;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
y = pb->p.page_y0;
|
||||||
|
ptr = pb->buf;
|
||||||
|
disp_ram_adr = WIDTH/8;
|
||||||
|
disp_ram_adr *= y;
|
||||||
|
for( i = 0; i < PAGE_HEIGHT; i ++ )
|
||||||
|
{
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr&255 ); /* address low byte */
|
||||||
|
u8g_WriteByte(u8g, dev, disp_ram_adr>>8 ); /* address hight byte */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* cmd mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x024 ); /* set adr ptr */
|
||||||
|
|
||||||
|
u8g_WriteSequence(u8g, dev, WIDTH/8, ptr);
|
||||||
|
|
||||||
|
ptr += WIDTH/8;
|
||||||
|
disp_ram_adr += WIDTH/8;
|
||||||
|
}
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* data mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16h1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// U8G_PB_DEV(u8g_dev_t6963_240x64_8bit, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_t6963_240x64_fn, U8G_COM_T6963);
|
||||||
|
|
||||||
|
uint8_t u8g_dev_t6963_240x64_2x_bw_buf[WIDTH/8*PAGE_HEIGHT] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_t6963_240x64_2x_bw_pb = { {PAGE_HEIGHT, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_t6963_240x64_2x_bw_buf};
|
||||||
|
u8g_dev_t u8g_dev_t6963_240x64_8bit = { u8g_dev_t6963_240x64_fn, &u8g_dev_t6963_240x64_2x_bw_pb, U8G_COM_T6963 };
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_tls8204_84x48.c
|
||||||
|
|
||||||
|
Display: Nokia 84x48
|
||||||
|
|
||||||
|
Status: Tested with TLS8204V12 Display by Olimex MOD-LCD3310
|
||||||
|
|
||||||
|
Contributed: http://code.google.com/p/u8glib/issues/detail?id=126
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 84
|
||||||
|
#define HEIGHT 48
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_tls8204_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x021, /* activate chip (PD=0), horizontal increment (V=0), enter extended command set (H=1) */
|
||||||
|
0x006, /* temp. control: b10 = 2 */
|
||||||
|
0x04 | !!((66-1)&(1u<<6)),
|
||||||
|
0x40 | ((66-2) & ((1u<<6)-1)),
|
||||||
|
0x013, /* bias system 1:48 */
|
||||||
|
0x0c0, /* medium Vop */
|
||||||
|
0x020, /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
0x00c, /* display on, normal operation */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x020, /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
0x00d, /* display on, invert */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x020, /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
0x00c, /* display on, normal */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t u8g_dev_tls8204_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_tls8204_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* command mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x020 ); /* activate chip (PD=0), horizontal increment (V=0), enter normal command set (H=0) */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 ); /* set X address */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x040 | pb->p.page); /* set Y address */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
/* the contrast adjustment does not work, needs to be analysed */
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x021); /* command mode, extended function set */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x080 | ( (*(uint8_t *)arg) >> 1 ) );
|
||||||
|
u8g_WriteByte(u8g, dev, 0x020); /* command mode, extended function set */
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_tls8204_84x48_sw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tls8204_fn, U8G_COM_SW_SPI);
|
||||||
|
|
|
@ -0,0 +1,290 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_uc1610_dogxl160.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 160
|
||||||
|
#define HEIGHT 104
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_uc1610_dogxl160_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x0f1, /* set display height-1 */
|
||||||
|
0x067, /* */
|
||||||
|
0x0c0, /* SEG & COM normal */
|
||||||
|
0x040, /* set display start line */
|
||||||
|
0x050, /* */
|
||||||
|
0x02b, /* set panelloading */
|
||||||
|
0x0eb, /* set bias 1/2 */
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x05f, /* */
|
||||||
|
0x089, /* set auto increment */
|
||||||
|
0x0a6, /* normal pixel mode */
|
||||||
|
0x0d3, /* 0xd3=40% RMS separation for gray levels */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a5, /* display all points, ST7565, UC1610 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display */
|
||||||
|
|
||||||
|
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_uc1610_dogxl160_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0 */
|
||||||
|
0x000, /* set lower 4 bit of the col adr to 0 */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint8_t u8g_dev_1to2(uint8_t n)
|
||||||
|
{
|
||||||
|
register uint8_t a,b,c;
|
||||||
|
a = n;
|
||||||
|
a &= 1;
|
||||||
|
n <<= 1;
|
||||||
|
b = n;
|
||||||
|
b &= 4;
|
||||||
|
n <<= 1;
|
||||||
|
c = n;
|
||||||
|
c &= 16;
|
||||||
|
n <<= 1;
|
||||||
|
n &= 64;
|
||||||
|
n |= a;
|
||||||
|
n |= b;
|
||||||
|
n |= c;
|
||||||
|
n |= n << 1;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_uc1610_dogxl160_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*2) ); /* select current page 1/2 (UC1610) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
for( i = 0; i < WIDTH; i++ )
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf))[i] ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*2+1) ); /* select current page 2/2 (UC1610) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
for( i = 0; i < WIDTH; i++ )
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf))[i] >> 4 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_uc1610_dogxl160_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page) ); /* select current page (UC1610) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v2_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_uc1610_dogxl160_2x_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*4) ); /* select current page 1/2 (UC1610) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
for( i = 0; i < WIDTH; i++ )
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf))[i] ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*4+1) ); /* select current page 2/2 (UC1610) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
for( i = 0; i < WIDTH; i++ )
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf))[i] >> 4 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*4+2) ); /* select current page 1/2 (UC1610) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
for( i = 0; i < WIDTH; i++ )
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf+WIDTH))[i] ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*4+3) ); /* select current page 2/2 (UC1610) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
for( i = 0; i < WIDTH; i++ )
|
||||||
|
{
|
||||||
|
u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf+WIDTH))[i] >> 4 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t u8g_dev_uc1610_dogxl160_2x_gr_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*2) ); /* select current page (UC1610) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_WriteSequence(u8g, dev, WIDTH, pb->buf) == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1610_dogxl160_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x060 | (pb->p.page*2+1) ); /* select current page (UC1610) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_WriteSequence(u8g, dev, WIDTH, pb->buf+WIDTH) == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 1);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb16v2_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_uc1610_dogxl160_bw_sw_spi, WIDTH, HEIGHT, 8, u8g_dev_uc1610_dogxl160_bw_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_uc1610_dogxl160_bw_hw_spi, WIDTH, HEIGHT, 8, u8g_dev_uc1610_dogxl160_bw_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_uc1610_dogxl160_gr_sw_spi, WIDTH, HEIGHT, 4, u8g_dev_uc1610_dogxl160_gr_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_uc1610_dogxl160_gr_hw_spi, WIDTH, HEIGHT, 4, u8g_dev_uc1610_dogxl160_gr_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
uint8_t u8g_dev_uc1610_dogxl160_2x_bw_buf[WIDTH*2] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_uc1610_dogxl160_2x_bw_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_uc1610_dogxl160_2x_bw_buf};
|
||||||
|
u8g_dev_t u8g_dev_uc1610_dogxl160_2x_bw_sw_spi = { u8g_dev_uc1610_dogxl160_2x_bw_fn, &u8g_dev_uc1610_dogxl160_2x_bw_pb, U8G_COM_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_uc1610_dogxl160_2x_bw_hw_spi = { u8g_dev_uc1610_dogxl160_2x_bw_fn, &u8g_dev_uc1610_dogxl160_2x_bw_pb, U8G_COM_HW_SPI };
|
||||||
|
|
||||||
|
uint8_t u8g_dev_uc1610_dogxl160_2x_gr_buf[WIDTH*2] U8G_NOCOMMON ;
|
||||||
|
u8g_pb_t u8g_dev_uc1610_dogxl160_2x_gr_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_uc1610_dogxl160_2x_gr_buf};
|
||||||
|
u8g_dev_t u8g_dev_uc1610_dogxl160_2x_gr_sw_spi = { u8g_dev_uc1610_dogxl160_2x_gr_fn, &u8g_dev_uc1610_dogxl160_2x_gr_pb, U8G_COM_SW_SPI };
|
||||||
|
u8g_dev_t u8g_dev_uc1610_dogxl160_2x_gr_hw_spi = { u8g_dev_uc1610_dogxl160_2x_gr_fn, &u8g_dev_uc1610_dogxl160_2x_gr_pb, U8G_COM_HW_SPI };
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
u8g_dev_uc1701_dogs102.c
|
||||||
|
|
||||||
|
Universal 8bit Graphics Library
|
||||||
|
|
||||||
|
Copyright (c) 2011, olikraus@gmail.com
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u8g.h"
|
||||||
|
|
||||||
|
#define WIDTH 102
|
||||||
|
#define HEIGHT 64
|
||||||
|
#define PAGE_HEIGHT 8
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_dogs102_init_seq[] PROGMEM = {
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x040, /* set display start line to 0 */
|
||||||
|
0x0a1, /* ADC set to reverse */
|
||||||
|
0x0c0, /* common output mode */
|
||||||
|
0x0a6, /* display normal, bit val 0: LCD pixel off. */
|
||||||
|
0x0a2, /* LCD bias 1/9 */
|
||||||
|
0x02f, /* all power control circuits on */
|
||||||
|
0x027, /* regulator, booster and follower */
|
||||||
|
0x081, /* set contrast */
|
||||||
|
0x00e, /* contrast value, EA default: 0x010, previous value for S102: 0x0e */
|
||||||
|
0x0fa, /* Set Temp compensation */
|
||||||
|
0x090, /* 0.11 deg/c WP Off WC Off*/
|
||||||
|
0x0a4, /* normal display */
|
||||||
|
0x0af, /* display on */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a5, /* display all points, ST7565, UC1610 */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
U8G_ESC_DLY(100), /* delay 100 ms */
|
||||||
|
0x0a4, /* normal display */
|
||||||
|
U8G_ESC_CS(0), /* disable chip */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8_t u8g_dev_dogs102_data_start[] PROGMEM = {
|
||||||
|
U8G_ESC_ADR(0), /* instruction mode */
|
||||||
|
U8G_ESC_CS(1), /* enable chip */
|
||||||
|
0x010, /* set upper 4 bit of the col adr to 0 */
|
||||||
|
0x000, /* set lower 4 bit of the col adr to 0 */
|
||||||
|
U8G_ESC_END /* end of sequence */
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t u8g_dev_dogs102_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case U8G_DEV_MSG_INIT:
|
||||||
|
u8g_InitCom(u8g, dev);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_dogs102_init_seq);
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_STOP:
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_PAGE_NEXT:
|
||||||
|
{
|
||||||
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
||||||
|
u8g_WriteEscSeqP(u8g, dev, u8g_dev_dogs102_data_start);
|
||||||
|
u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (ST7565R) */
|
||||||
|
u8g_SetAddress(u8g, dev, 1); /* data mode */
|
||||||
|
if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 )
|
||||||
|
return 0;
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U8G_DEV_MSG_CONTRAST:
|
||||||
|
u8g_SetChipSelect(u8g, dev, 1);
|
||||||
|
u8g_SetAddress(u8g, dev, 0); /* instruction mode */
|
||||||
|
u8g_WriteByte(u8g, dev, 0x081);
|
||||||
|
u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
|
||||||
|
u8g_SetChipSelect(u8g, dev, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
U8G_PB_DEV(u8g_dev_uc1701_dogs102_sw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_dogs102_fn, U8G_COM_SW_SPI);
|
||||||
|
U8G_PB_DEV(u8g_dev_uc1701_dogs102_hw_spi , WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_dogs102_fn, U8G_COM_HW_SPI);
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue