display.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. }
  41. void display_text(int row, const char *text)
  42. {
  43. int k;
  44. uint8_t zeros[8] = {0, 0, 0, 0, 0, 0, 0, 0 };
  45. int len = strlen(text);
  46. if (len > 15)
  47. len = 15;
  48. display_send_cmd(NULL, 0x00);
  49. display_send_cmd(NULL, 0x10);
  50. WFI();
  51. display_send_cmd2(NULL, SSD1306_PAGEADDR, 7 - row, 0x00);
  52. display_send_cmd2(NULL, SSD1306_COLUMNADDR, 0, WIDTH - 1);
  53. for(k = 0; k < len; k++)
  54. display_send_data(NULL, fb_font[text[k]], 8);
  55. for(; k < 16; k++)
  56. display_send_data(NULL, zeros, 8);
  57. }
  58. void display_text_inverse(int row, const char *text)
  59. {
  60. int k, j;
  61. uint8_t inv_buf[8];
  62. uint8_t ones[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
  63. int len = strlen(text);
  64. if (len > 15)
  65. len = 15;
  66. display_send_cmd(NULL, 0x00);
  67. display_send_cmd(NULL, 0x10);
  68. WFI();
  69. display_send_cmd2(NULL, SSD1306_PAGEADDR, 7 - row, 0x00);
  70. display_send_cmd2(NULL, SSD1306_COLUMNADDR, 0, WIDTH - 1);
  71. for(k = 0; k < len; k++) {
  72. for (j = 0; j < 8; j++)
  73. inv_buf[j] = ~fb_font[text[k]][j];
  74. display_send_data(NULL, inv_buf, 8);
  75. }
  76. for(; k < 16; k++)
  77. display_send_data(NULL, ones, 8);
  78. }
  79. int display_init(void *priv)
  80. {
  81. int i;
  82. int k = 0;
  83. int row = 0;
  84. volatile int j;
  85. uint8_t dbuf2[64] = {};
  86. int page = 0;
  87. int seg = 0;
  88. volatile uint32_t now;
  89. for (i = 1; i < 65; i++) {
  90. dbuf2[i] = 0;
  91. }
  92. display_send_cmd(priv, SSD1306_DISPLAYOFF);
  93. display_send_cmd1(priv, 0xD6, 0x01);
  94. display_send_cmd(priv, 0xA1);
  95. display_setcontrast(priv, contrast);
  96. display_send_cmd1(priv, SSD1306_CHARGEPUMP, 0x14);
  97. display_send_cmd1(priv, SSD1306_MEMORYMODE, 0x00);
  98. display_send_cmd1(priv, SSD1306_SETCOMPINS, 0x12);
  99. display_send_cmd1(priv, SSD1306_SETDISPLAYOFFSET, 0x00);
  100. display_send_cmd1(priv, SSD1306_SETVCOMDETECT, 0x00);
  101. display_send_cmd1(priv, SSD1306_SETMULTIPLEX, 63);
  102. display_send_cmd(priv, SSD1306_COMSCANINC);
  103. display_send_cmd(priv, SSD1306_DISPLAYALLON_RESUME);
  104. display_send_cmd(priv, SSD1306_DISPLAYON);
  105. display_send_cmd(priv, 0x2E);
  106. display_send_cmd2(priv, SSD1306_PAGEADDR, 0, 0xFF);
  107. display_send_cmd2(priv, SSD1306_COLUMNADDR, 0, WIDTH - 1);
  108. display_send_cmd1(priv, SSD1306_SETSTARTLINE, 0);
  109. display_send_cmd(priv, 0x00);
  110. display_send_cmd(priv, 0x10);
  111. for (page = 0; page < 8; page++) {
  112. display_send_cmd2(priv, SSD1306_PAGEADDR, page, 0xFF);
  113. for (seg= 0; seg < 32; seg++) {
  114. display_send_data(priv, dbuf2, 8);
  115. }
  116. display_send_cmd1(priv, SSD1306_SETSTARTLINE, row);
  117. }
  118. return 0;
  119. }