hd44780_decoder.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <stdint.h>
  2. #include <stddef.h>
  3. #include <stdbool.h>
  4. #include <cx/chlcd.h>
  5. #include <cx/chlcd/__helper.h>
  6. static inline chlcd_error_t __chlcd_hd44780_decoder_init(
  7. void *connector,
  8. chlcd_sender_t sender
  9. ) {
  10. if (sender(connector, 0b0010, true, true) != CHLCD_SUCCESS) {
  11. return CHLCD_SEND_ERROR;
  12. }
  13. if (sender(connector, 0b00001111, true, false) != CHLCD_SUCCESS) {
  14. return CHLCD_SEND_ERROR;
  15. }
  16. return CHLCD_SUCCESS;
  17. }
  18. static inline chlcd_error_t __chlcd_hd44780_decoder_clear(
  19. void *connector,
  20. chlcd_sender_t sender
  21. ) {
  22. if (sender(connector, 0b00000001, true, false) != CHLCD_SUCCESS) {
  23. return CHLCD_SEND_ERROR;
  24. }
  25. if (sender(connector, 0b00000010, true, false) != CHLCD_SUCCESS) {
  26. return CHLCD_SEND_ERROR;
  27. }
  28. return CHLCD_SUCCESS;
  29. }
  30. static inline chlcd_error_t __chlcd_hd44780_decoder_send_char(
  31. void *connector,
  32. chlcd_sender_t sender,
  33. chlcd_data_t content
  34. ) {
  35. return sender(connector, content, false, false);
  36. }
  37. chlcd_error_t chlcd_hd44780_decoder(
  38. chlcd_command_t command,
  39. chlcd_data_t content,
  40. void *connector,
  41. chlcd_sender_t sender
  42. ) {
  43. switch (command) {
  44. case CHLCD_INIT:
  45. return __chlcd_hd44780_decoder_init(connector, sender);
  46. case CHLCD_CLEAR:
  47. return __chlcd_hd44780_decoder_clear(connector, sender);
  48. case CHLCD_SEND_CHAR:
  49. return __chlcd_hd44780_decoder_send_char(
  50. connector,
  51. sender,
  52. content
  53. );
  54. default:
  55. return CHLCD_BAD_ARGUMENT;
  56. }
  57. }