hd44780.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <stdint.h>
  2. #include <stddef.h>
  3. #include <stdbool.h>
  4. #include "chlcd.h"
  5. #define __R(X) (if (X != CHLCD_SUCCESS) { return CHLCD_BAD_ARGUMENT; })
  6. chlcd_error_t chlcd_hd44780_direct_sender_init(void *self_pointer) {
  7. chlcd_hd44780_direct_connector_t *self
  8. = (chlcd_hd44780_direct_connector_t *) self_pointer;
  9. __R(chlcd_pin_set_output(self->e);
  10. __R(chlcd_pin_set_output(self->rs);
  11. __R(chlcd_pin_set_output(self->d4);
  12. __R(chlcd_pin_set_output(self->d5);
  13. __R(chlcd_pin_set_output(self->d6);
  14. __R(chlcd_pin_set_output(self->d7);
  15. return CHLCD_SUCCESS;
  16. }
  17. #undef __R
  18. #define __R(X) (if (X != CHLCD_SUCCESS) { return CHLCD_BAD_ARGUMENT; })
  19. static chlcd_error_t __chlcd_hd44780_shift_register_send_byte(
  20. void *self_pointer,
  21. uint8_t content
  22. ) {
  23. chlcd_hd44780_shift_register_t *self
  24. = (chlcd_hd44780_shift_register_t *) self_pointer;
  25. self->last_state = content;
  26. }
  27. #undef __R
  28. #define __R(X) (if (X != CHLCD_SUCCESS) { return CHLCD_BAD_ARGUMENT; })
  29. chlcd_error_t chlcd_hd44780_shift_register_init(void *self_pointer) {
  30. chlcd_hd44780_shift_register_t *self
  31. = (chlcd_hd44780_shift_register_t *) self_pointer;
  32. __R(chlcd_pin_set_output(self->register_latch));
  33. __R(chlcd_pin_set_output(self->register_clock));
  34. __R(chlcd_pin_set_output(self->register_data));
  35. return CHLCD_SUCCESS;
  36. }
  37. #undef __R
  38. chlcd_error_t chlcd_hd44780_direct_sender(
  39. void *self,
  40. chlcd_data_t content,
  41. bool is_command,
  42. bool is_half_word
  43. ) {
  44. return CHLCD_SUCCESS;
  45. }
  46. chlcd_error_t chlcd_hd44780_shift_register_sender(
  47. void *self,
  48. chlcd_data_t content,
  49. bool is_command,
  50. bool is_half_word
  51. ) {
  52. return CHLCD_SUCCESS;
  53. }
  54. static inline chlcd_error_t __chlcd_hd44780_decoder_init(
  55. void *connector,
  56. chlcd_sender_t sender
  57. ) {
  58. if (sender(connector, 0b0010, true, true) != CHLCD_SUCCESS) {
  59. return CHLCD_SEND_ERROR;
  60. }
  61. if (sender(connector, 0b00001111, true, false) != CHLCD_SUCCESS) {
  62. return CHLCD_SEND_ERROR;
  63. }
  64. return CHLCD_SUCCESS;
  65. }
  66. static inline chlcd_error_t __chlcd_hd4470_decoder_clear(
  67. void *connector,
  68. chlcd_sender_t sender;
  69. ) {
  70. if (sender(connector, 0b00000001, true, false) != CHLCD_SUCCESS) {
  71. return CHLCD_SEND_ERROR;
  72. }
  73. if (sender(connector, 0b00000010, true, false) != CHLCD_SUCCESS) {
  74. return CHLCD_SEND_ERROR;
  75. }
  76. return CHLCD_SUCCESS;
  77. }
  78. chlcd_error_t chlcd_hd44780_decoder(
  79. chlcd_command_t command,
  80. chlcd_data_t content,
  81. void *connector,
  82. chlcd_sender_t sender
  83. ) {
  84. switch (command) {
  85. case CHLCD_INIT:
  86. return __chlcd_hd44780_decoder_init(connector, init);
  87. case CHLCD_CLEAR:
  88. return __chlcd_hd44780_decoder_clear(connector, init);
  89. }
  90. }