Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef _mcu_8bit_magic_
- #define _mcu_8bit_magic_
- #include "lcd_mode.h"
- #define DELAY7 \
- asm volatile( \
- "rjmp .+0" "\n\t" \
- "rjmp .+0" "\n\t" \
- "rjmp .+0" "\n\t" \
- "nop" "\n" \
- ::);
- #if defined(__SAM3X8E__)
- // Arduino Due
- #ifdef USE_ADAFRUIT_SHIELD_PIN
- //************ Control Signals ***************//
- #define RD_PORT PIOC //pin D39
- #define WR_PORT PIOC //pin D41
- #define CD_PORT PIOC //pin D40
- #define CS_PORT PIOA //pin D43
- #define RD_MASK 0x00000080
- #define WR_MASK 0x00000200
- #define CD_MASK 0x00000100
- #define CS_MASK 0x00100000
- //PIO_Clear(PIOC, 0x000FF000);
- #define write8(d) { \
- PIO_Set(PIOC, (((d) & 0x01)<<(13-0))| \
- (((d) & 0x02)<<(12-1))| \
- (((d) & 0x04)<<(19-2))| \
- (((d) & 0x08)<<(18-3))| \
- (((d) & 0x10)<<(17-4))| \
- (((d) & 0x20)<<(16-5))| \
- (((d) & 0x40)<<(15-6))| \
- (((d) & 0x80)<<(14-7))); \
- PIO_Clear(PIOC, (((~d) & 0x01)<<(13-0))| \
- (((~d) & 0x02)<<(12-1))| \
- (((~d) & 0x04)<<(19-2))| \
- (((~d) & 0x08)<<(18-3))| \
- (((~d) & 0x10)<<(17-4))| \
- (((~d) & 0x20)<<(16-5))| \
- (((~d) & 0x40)<<(15-6))| \
- (((~d) & 0x80)<<(14-7))); \
- WR_STROBE; }
- #define read8(result) { \
- RD_ACTIVE; \
- delayMicroseconds(1); \
- result = (((PIOC->PIO_PDSR & (1<<14)) >> (14-7)) | ((PIOC->PIO_PDSR & (1<<15)) >> (15-6)) | \
- ((PIOC->PIO_PDSR & (1<<16)) >> (16-5)) | ((PIOC->PIO_PDSR & (1<<17)) >> (17-4)) | \
- ((PIOC->PIO_PDSR & (1<<18)) >> (18-3)) | ((PIOC->PIO_PDSR & (1<<19)) >> (19-2)) | \
- ((PIOC->PIO_PDSR & (1<<12)) >> (12-1)) | ((PIOC->PIO_PDSR & (1<<13)) >> (13-0))); \
- RD_IDLE;}
- //TestBench
- #define setWriteDir() { \
- PIOC->PIO_MDDR |= 0x000FF000; PIOC->PIO_OER |= 0x000FF000; PIOC->PIO_PER |= 0x000FF000; }
- //TestBench
- #define setReadDir() { \
- pmc_enable_periph_clk( ID_PIOC ) ; pmc_enable_periph_clk( ID_PIOB ) ; \
- PIOC->PIO_PUDR |= 0x000FF000; PIOC->PIO_IFDR |= 0x000FF000; PIOC->PIO_ODR |= 0x000FF000; PIOC->PIO_PER |= 0x000FF000; }
- // Control signals are ACTIVE LOW (idle is HIGH)
- // Command/Data: LOW = command, HIGH = data
- // These are single-instruction operations and always inline
- #define RD_ACTIVE RD_PORT->PIO_CODR = RD_MASK
- #define RD_IDLE RD_PORT->PIO_SODR = RD_MASK
- #define WR_ACTIVE WR_PORT->PIO_CODR = WR_MASK
- #define WR_IDLE WR_PORT->PIO_SODR = WR_MASK
- #define CD_COMMAND CD_PORT->PIO_CODR = CD_MASK
- #define CD_DATA CD_PORT->PIO_SODR = CD_MASK
- #define CS_ACTIVE CS_PORT->PIO_CODR = CS_MASK
- #define CS_IDLE CS_PORT->PIO_SODR = CS_MASK
- #endif
- #endif
- // Data write strobe, ~2 instructions and always inline
- #define WR_STROBE { WR_ACTIVE; WR_IDLE; }
- #define RD_STROBE {RD_IDLE; RD_ACTIVE;RD_ACTIVE;RD_ACTIVE;}
- #define write16(d) { uint8_t h = (d)>>8, l = d; write8(h); write8(l); }
- #define read16(dst) { uint8_t hi; read8(hi); read8(dst); dst |= (hi << 8); }
- #define writeCmd8(x){ CD_COMMAND; write8(x); CD_DATA; }
- #define writeData8(x){ write8(x) }
- #define writeCmd16(x){ CD_COMMAND; write16(x); CD_DATA; }
- #define writeData16(x){ write16(x) }
- // These higher-level operations are usually functionalized,
- // except on Mega where's there's gobs and gobs of program space.
- // Set value of TFT register: 8-bit address, 8-bit value
- #define writeCmdData8(a, d) { CD_COMMAND; write8(a); CD_DATA; write8(d); }
- // Set value of TFT register: 16-bit address, 16-bit value
- // See notes at top about macro expansion, hence hi & lo temp vars
- #define writeCmdData16(a, d) { \
- uint8_t hi, lo; \
- hi = (a) >> 8; lo = (a); CD_COMMAND; write8(hi); write8(lo); \
- hi = (d) >> 8; lo = (d); CD_DATA ; write8(hi); write8(lo); }
- #endif // _mcu_8bit_magic_
Add Comment
Please, Sign In to add comment