Guest User

Untitled

a guest
May 1st, 2021
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. #ifndef _mcu_8bit_magic_
  2. #define _mcu_8bit_magic_
  3.  
  4. #include "lcd_mode.h"
  5.  
  6. #define DELAY7 \
  7. asm volatile( \
  8. "rjmp .+0" "\n\t" \
  9. "rjmp .+0" "\n\t" \
  10. "rjmp .+0" "\n\t" \
  11. "nop" "\n" \
  12. ::);
  13.  
  14. #if defined(__SAM3X8E__)
  15.  
  16. // Arduino Due
  17.  
  18. #ifdef USE_ADAFRUIT_SHIELD_PIN
  19. //************ Control Signals ***************//
  20. #define RD_PORT PIOC //pin D39
  21. #define WR_PORT PIOC //pin D41
  22. #define CD_PORT PIOC //pin D40
  23. #define CS_PORT PIOA //pin D43
  24. #define RD_MASK 0x00000080
  25. #define WR_MASK 0x00000200
  26. #define CD_MASK 0x00000100
  27. #define CS_MASK 0x00100000
  28.  
  29.  
  30.  
  31. //PIO_Clear(PIOC, 0x000FF000);
  32. #define write8(d) { \
  33. PIO_Set(PIOC, (((d) & 0x01)<<(13-0))| \
  34. (((d) & 0x02)<<(12-1))| \
  35. (((d) & 0x04)<<(19-2))| \
  36. (((d) & 0x08)<<(18-3))| \
  37. (((d) & 0x10)<<(17-4))| \
  38. (((d) & 0x20)<<(16-5))| \
  39. (((d) & 0x40)<<(15-6))| \
  40. (((d) & 0x80)<<(14-7))); \
  41. PIO_Clear(PIOC, (((~d) & 0x01)<<(13-0))| \
  42. (((~d) & 0x02)<<(12-1))| \
  43. (((~d) & 0x04)<<(19-2))| \
  44. (((~d) & 0x08)<<(18-3))| \
  45. (((~d) & 0x10)<<(17-4))| \
  46. (((~d) & 0x20)<<(16-5))| \
  47. (((~d) & 0x40)<<(15-6))| \
  48. (((~d) & 0x80)<<(14-7))); \
  49. WR_STROBE; }
  50.  
  51. #define read8(result) { \
  52. RD_ACTIVE; \
  53. delayMicroseconds(1); \
  54. result = (((PIOC->PIO_PDSR & (1<<14)) >> (14-7)) | ((PIOC->PIO_PDSR & (1<<15)) >> (15-6)) | \
  55. ((PIOC->PIO_PDSR & (1<<16)) >> (16-5)) | ((PIOC->PIO_PDSR & (1<<17)) >> (17-4)) | \
  56. ((PIOC->PIO_PDSR & (1<<18)) >> (18-3)) | ((PIOC->PIO_PDSR & (1<<19)) >> (19-2)) | \
  57. ((PIOC->PIO_PDSR & (1<<12)) >> (12-1)) | ((PIOC->PIO_PDSR & (1<<13)) >> (13-0))); \
  58. RD_IDLE;}
  59.  
  60. //TestBench
  61. #define setWriteDir() { \
  62. PIOC->PIO_MDDR |= 0x000FF000; PIOC->PIO_OER |= 0x000FF000; PIOC->PIO_PER |= 0x000FF000; }
  63.  
  64. //TestBench
  65. #define setReadDir() { \
  66. pmc_enable_periph_clk( ID_PIOC ) ; pmc_enable_periph_clk( ID_PIOB ) ; \
  67. PIOC->PIO_PUDR |= 0x000FF000; PIOC->PIO_IFDR |= 0x000FF000; PIOC->PIO_ODR |= 0x000FF000; PIOC->PIO_PER |= 0x000FF000; }
  68.  
  69.  
  70. // Control signals are ACTIVE LOW (idle is HIGH)
  71. // Command/Data: LOW = command, HIGH = data
  72. // These are single-instruction operations and always inline
  73. #define RD_ACTIVE RD_PORT->PIO_CODR = RD_MASK
  74. #define RD_IDLE RD_PORT->PIO_SODR = RD_MASK
  75. #define WR_ACTIVE WR_PORT->PIO_CODR = WR_MASK
  76. #define WR_IDLE WR_PORT->PIO_SODR = WR_MASK
  77. #define CD_COMMAND CD_PORT->PIO_CODR = CD_MASK
  78. #define CD_DATA CD_PORT->PIO_SODR = CD_MASK
  79. #define CS_ACTIVE CS_PORT->PIO_CODR = CS_MASK
  80. #define CS_IDLE CS_PORT->PIO_SODR = CS_MASK
  81.  
  82. #endif
  83.  
  84. #endif
  85.  
  86. // Data write strobe, ~2 instructions and always inline
  87. #define WR_STROBE { WR_ACTIVE; WR_IDLE; }
  88. #define RD_STROBE {RD_IDLE; RD_ACTIVE;RD_ACTIVE;RD_ACTIVE;}
  89. #define write16(d) { uint8_t h = (d)>>8, l = d; write8(h); write8(l); }
  90. #define read16(dst) { uint8_t hi; read8(hi); read8(dst); dst |= (hi << 8); }
  91. #define writeCmd8(x){ CD_COMMAND; write8(x); CD_DATA; }
  92. #define writeData8(x){ write8(x) }
  93. #define writeCmd16(x){ CD_COMMAND; write16(x); CD_DATA; }
  94. #define writeData16(x){ write16(x) }
  95.  
  96. // These higher-level operations are usually functionalized,
  97. // except on Mega where's there's gobs and gobs of program space.
  98.  
  99. // Set value of TFT register: 8-bit address, 8-bit value
  100. #define writeCmdData8(a, d) { CD_COMMAND; write8(a); CD_DATA; write8(d); }
  101.  
  102. // Set value of TFT register: 16-bit address, 16-bit value
  103. // See notes at top about macro expansion, hence hi & lo temp vars
  104. #define writeCmdData16(a, d) { \
  105. uint8_t hi, lo; \
  106. hi = (a) >> 8; lo = (a); CD_COMMAND; write8(hi); write8(lo); \
  107. hi = (d) >> 8; lo = (d); CD_DATA ; write8(hi); write8(lo); }
  108.  
  109. #endif // _mcu_8bit_magic_
  110.  
Add Comment
Please, Sign In to add comment