display.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * (c) danielinux 2019
  3. * GPLv.2
  4. *
  5. * See LICENSE for details
  6. */
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include "display.h"
  10. #include "systick.h"
  11. #include "system.h"
  12. static uint8_t contrast = 0xcf;
  13. void display_scroll(void *priv, uint8_t line)
  14. {
  15. display_send_cmd1(priv, SSD1306_SETSTARTLINE, (line % 0x40) + 0x40);
  16. }
  17. void display_setcontrast(void *priv, uint8_t c)
  18. {
  19. contrast = c;
  20. display_send_cmd1(priv, SSD1306_SETCONTRAST, contrast);
  21. }
  22. uint8_t display_getcontrast(void *priv)
  23. {
  24. return contrast;
  25. }
  26. void display_clear(void *priv)
  27. {
  28. int i,j;
  29. uint8_t zeros[8] = {0, 0, 0, 0, 0, 0, 0, 0 };
  30. display_send_cmd(NULL, 0x00);
  31. display_send_cmd(NULL, 0x10);
  32. for (i = 0; i < 8; i++)
  33. {
  34. display_send_cmd2(NULL, SSD1306_PAGEADDR, i, 0x00);
  35. display_send_cmd2(NULL, SSD1306_COLUMNADDR, 0, WIDTH - 1);
  36. for (j = 0; j < 16; j++)
  37. display_send_data(NULL, zeros, 8);
  38. }
  39. WFI();
  40. WFI();
  41. WFI();
  42. }
  43. void display_text(int row, const char *text)
  44. {
  45. int k;
  46. uint8_t zeros[8] = {0, 0, 0, 0, 0, 0, 0, 0 };
  47. int len = strlen(text);
  48. if (len > 15)
  49. len = 15;
  50. display_send_cmd(NULL, 0x00);
  51. display_send_cmd(NULL, 0x10);
  52. WFI();
  53. display_send_cmd2(NULL, SSD1306_PAGEADDR, 7 - row, 0x00);
  54. display_send_cmd2(NULL, SSD1306_COLUMNADDR, 0, WIDTH - 1);
  55. for(k = 0; k < len; k++)
  56. display_send_data(NULL, fb_font[text[k]], 8);
  57. for(; k < 16; k++)
  58. display_send_data(NULL, zeros, 8);
  59. }
  60. void display_text_inverse(int row, const char *text)
  61. {
  62. int k, j;
  63. uint8_t inv_buf[8];
  64. uint8_t ones[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
  65. int len = strlen(text);
  66. if (len > 15)
  67. len = 15;
  68. display_send_cmd(NULL, 0x00);
  69. display_send_cmd(NULL, 0x10);
  70. WFI();
  71. display_send_cmd2(NULL, SSD1306_PAGEADDR, 7 - row, 0x00);
  72. display_send_cmd2(NULL, SSD1306_COLUMNADDR, 0, WIDTH - 1);
  73. for(k = 0; k < len; k++) {
  74. for (j = 0; j < 8; j++)
  75. inv_buf[j] = ~fb_font[text[k]][j];
  76. display_send_data(NULL, inv_buf, 8);
  77. }
  78. for(; k < 16; k++)
  79. display_send_data(NULL, ones, 8);
  80. }
  81. int display_init(void *priv)
  82. {
  83. int i;
  84. int k = 0;
  85. int row = 0;
  86. volatile int j;
  87. uint8_t dbuf2[64] = {};
  88. int page = 0;
  89. int seg = 0;
  90. volatile uint32_t now;
  91. for (i = 1; i < 65; i++) {
  92. dbuf2[i] = 0;
  93. }
  94. display_send_cmd(priv, SSD1306_DISPLAYOFF);
  95. display_send_cmd1(priv, 0xD6, 0x01);
  96. display_send_cmd(priv, 0xA1);
  97. display_setcontrast(priv, contrast);
  98. display_send_cmd1(priv, SSD1306_CHARGEPUMP, 0x14);
  99. display_send_cmd1(priv, SSD1306_MEMORYMODE, 0x00);
  100. display_send_cmd1(priv, SSD1306_SETCOMPINS, 0x12);
  101. display_send_cmd1(priv, SSD1306_SETDISPLAYOFFSET, 0x00);
  102. display_send_cmd1(priv, SSD1306_SETVCOMDETECT, 0x00);
  103. display_send_cmd1(priv, SSD1306_SETMULTIPLEX, 63);
  104. display_send_cmd(priv, SSD1306_COMSCANINC);
  105. display_send_cmd(priv, SSD1306_DISPLAYALLON_RESUME);
  106. display_send_cmd(priv, SSD1306_DISPLAYON);
  107. display_send_cmd(priv, 0x2E);
  108. display_send_cmd2(priv, SSD1306_PAGEADDR, 0, 0xFF);
  109. display_send_cmd2(priv, SSD1306_COLUMNADDR, 0, WIDTH - 1);
  110. display_send_cmd1(priv, SSD1306_SETSTARTLINE, 0);
  111. display_send_cmd(priv, 0x00);
  112. display_send_cmd(priv, 0x10);
  113. for (page = 0; page < 8; page++) {
  114. display_send_cmd2(priv, SSD1306_PAGEADDR, page, 0xFF);
  115. for (seg= 0; seg < 32; seg++) {
  116. display_send_data(priv, dbuf2, 8);
  117. }
  118. display_send_cmd1(priv, SSD1306_SETSTARTLINE, row);
  119. }
  120. return 0;
  121. }