Merge remote-tracking branch 'upstream/Marlin_v1' into Marlin_v1
This commit is contained in:
		| @@ -14,3 +14,86 @@ sanguino.bootloader.lock_bits=0x0F | ||||
| sanguino.build.mcu=atmega644p | ||||
| sanguino.build.f_cpu=16000000L | ||||
| 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 | ||||
| // location to which to write the next incoming character and rx_buffer_tail | ||||
| // 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 | ||||
| { | ||||
| @@ -46,11 +50,22 @@ struct ring_buffer | ||||
|   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) | ||||
| { | ||||
|   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 | ||||
|   // 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 | ||||
| //SIGNAL(SIG_USART_RECV) | ||||
| SIGNAL(USART0_RX_vect) | ||||
| { | ||||
| #if defined(USART_RX_vect) | ||||
|   SIGNAL(USART_RX_vect) | ||||
|   { | ||||
|   #if defined(UDR0) | ||||
|     unsigned char c  =  UDR0; | ||||
|   #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 //////////////////////////////////////////////////////////////// | ||||
| @@ -134,7 +231,7 @@ void HardwareSerial::end() | ||||
|  | ||||
| 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) | ||||
| @@ -153,7 +250,7 @@ int HardwareSerial::read(void) | ||||
|     return -1; | ||||
|   } else { | ||||
|     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; | ||||
|   } | ||||
| } | ||||
| @@ -181,7 +278,26 @@ void HardwareSerial::write(uint8_t c) | ||||
| } | ||||
|  | ||||
| // 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 | ||||
|  | ||||
|   | ||||
| @@ -46,7 +46,6 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { | ||||
|     // the mode into place. | ||||
|        | ||||
|     // Enable the interrupt. | ||||
|        | ||||
|     switch (interruptNum) { | ||||
| #if defined(EICRA) && defined(EICRB) && defined(EIMSK) | ||||
|     case 2: | ||||
| @@ -81,6 +80,19 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { | ||||
|       EICRB = (EICRB & ~((1 << ISC70) | (1 << ISC71))) | (mode << ISC70); | ||||
|       EIMSK |= (1 << INT7); | ||||
|       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 | ||||
|     case 0: | ||||
|     #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.) | ||||
|     switch (interruptNum) { | ||||
| #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: | ||||
|       EIMSK &= ~(1 << INT3); | ||||
|       break; | ||||
| @@ -147,6 +150,17 @@ void detachInterrupt(uint8_t interruptNum) { | ||||
|     case 7: | ||||
|       EIMSK &= ~(1 << INT7); | ||||
|       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 | ||||
|     case 0: | ||||
|     #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) { | ||||
|   if(intFunc[EXTERNAL_INT_2]) | ||||
|     intFunc[EXTERNAL_INT_2](); | ||||
| @@ -226,6 +240,23 @@ SIGNAL(INT7_vect) { | ||||
|     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 | ||||
|  | ||||
| SIGNAL(INT0_vect) { | ||||
|   | ||||
| @@ -19,17 +19,54 @@ | ||||
|   Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||||
|   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 "wiring_private.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 | ||||
| // 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 | ||||
| // | ||||
| //                   +---\/---+ | ||||
| @@ -55,42 +92,321 @@ | ||||
| //  PWM (D 14) PD6 20|        |21  PD7 (D 15) PWM | ||||
| //                   +--------+ | ||||
| // | ||||
|  | ||||
| #define PA 1 | ||||
| #define PB 2 | ||||
| #define PC 3 | ||||
| #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 | ||||
| // appropriate addresses for various functions (e.g. reading | ||||
| // and writing) | ||||
| const uint8_t PROGMEM port_to_mode_PGM[] = | ||||
| const uint16_t PROGMEM port_to_mode_PGM[] = | ||||
| { | ||||
|         NOT_A_PORT, | ||||
| 	(uint8_t) (uint16_t) &DDRA, | ||||
| 	(uint8_t) (uint16_t) &DDRB, | ||||
| 	(uint8_t) (uint16_t) &DDRC, | ||||
| 	(uint8_t) (uint16_t) &DDRD, | ||||
|     &DDRA, | ||||
|         &DDRB, | ||||
|         &DDRC, | ||||
|         &DDRD, | ||||
| }; | ||||
|  | ||||
| const uint8_t PROGMEM port_to_output_PGM[] = | ||||
| const uint16_t PROGMEM port_to_output_PGM[] = | ||||
| { | ||||
|         NOT_A_PORT, | ||||
| 	(uint8_t) (uint16_t) &PORTA, | ||||
| 	(uint8_t) (uint16_t) &PORTB, | ||||
| 	(uint8_t) (uint16_t) &PORTC, | ||||
| 	(uint8_t) (uint16_t) &PORTD, | ||||
|         &PORTA, | ||||
|         &PORTB, | ||||
|         &PORTC, | ||||
|         &PORTD, | ||||
| }; | ||||
|  | ||||
| const uint8_t PROGMEM port_to_input_PGM[] = | ||||
| const uint16_t PROGMEM port_to_input_PGM[] = | ||||
| { | ||||
|         NOT_A_PORT, | ||||
| 	(uint8_t) (uint16_t) &PINA, | ||||
| 	(uint8_t) (uint16_t) &PINB, | ||||
| 	(uint8_t) (uint16_t) &PINC, | ||||
| 	(uint8_t) (uint16_t) &PIND, | ||||
|         &PINA, | ||||
|         &PINB, | ||||
|         &PINC, | ||||
|         &PIND, | ||||
| }; | ||||
|  | ||||
| const uint8_t PROGMEM digital_pin_to_port_PGM[] = | ||||
| { | ||||
|         PB, /* 0 */ | ||||
| @@ -126,7 +442,6 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = | ||||
|         PA, | ||||
|         PA  /* 31 */ | ||||
| }; | ||||
|  | ||||
| const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = | ||||
| { | ||||
|         _BV(0), /* 0, port B */ | ||||
| @@ -162,7 +477,6 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = | ||||
|         _BV(1), | ||||
|         _BV(0) | ||||
| }; | ||||
|  | ||||
| const uint8_t PROGMEM digital_pin_to_timer_PGM[] = | ||||
| { | ||||
|         NOT_ON_TIMER,   /* 0  - PB0 */ | ||||
| @@ -198,3 +512,116 @@ const uint8_t PROGMEM digital_pin_to_timer_PGM[] = | ||||
|         NOT_ON_TIMER,   /* 30 - PA6 */ | ||||
|         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 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 MOSI = 5; | ||||
| const static uint8_t MISO = 6; | ||||
| const static uint8_t SCK  = 7; | ||||
|  | ||||
| extern const uint8_t PROGMEM port_to_mode_PGM[]; | ||||
| extern const uint8_t PROGMEM port_to_input_PGM[]; | ||||
| extern const uint8_t PROGMEM port_to_output_PGM[]; | ||||
| #else | ||||
| const static uint8_t SS   = 10; | ||||
| 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_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_timer_PGM[]; | ||||
|  | ||||
| // 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 digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) ) | ||||
| #define analogInPinToBit(P) (P) | ||||
| #define portOutputRegister(P) ( (volatile uint8_t *)( (uint16_t) pgm_read_byte( port_to_output_PGM + (P))) ) | ||||
| #define portInputRegister(P) ( (volatile uint8_t *)( (uint16_t) pgm_read_byte( port_to_input_PGM + (P))) ) | ||||
| #define portModeRegister(P) ( (volatile uint8_t *)( (uint16_t) pgm_read_byte( port_to_mode_PGM + (P))) ) | ||||
| #define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) ) | ||||
| #define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) ) | ||||
| #define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) ) | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -25,7 +25,6 @@ | ||||
| #ifndef Wiring_h | ||||
| #define Wiring_h | ||||
|  | ||||
| #include <math.h> | ||||
| #include <avr/io.h> | ||||
| #include <stdlib.h> | ||||
| #include "binary.h" | ||||
| @@ -77,7 +76,10 @@ extern "C"{ | ||||
| #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)) | ||||
|  | ||||
| // 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 degrees(rad) ((rad)*RAD_TO_DEG) | ||||
| #define sq(x) ((x)*(x)) | ||||
|   | ||||
| @@ -24,10 +24,10 @@ | ||||
|  | ||||
| #ifndef WiringPrivate_h | ||||
| #define WiringPrivate_h | ||||
| #include <math.h> | ||||
|  | ||||
| #include <avr/io.h> | ||||
| #include <avr/interrupt.h> | ||||
| #include <util/delay.h> | ||||
| #include <avr/delay.h> | ||||
| #include <stdio.h> | ||||
| #include <stdarg.h> | ||||
|  | ||||
| @@ -55,6 +55,8 @@ extern "C"{ | ||||
|  | ||||
| #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) | ||||
| #define EXTERNAL_NUM_INTERRUPTS 8 | ||||
| #elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) | ||||
| #define EXTERNAL_NUM_INTERRUPTS 3 | ||||
| #else | ||||
| #define EXTERNAL_NUM_INTERRUPTS 2 | ||||
| #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
		Reference in New Issue
	
	Block a user