Taiga Develop hai 2 semanas
pai
achega
a7bad0dcb3
Modificáronse 5 ficheiros con 98 adicións e 2 borrados
  1. 2 0
      include/cx/chlcd/connector.h
  2. 2 1
      include/cx/chlcd/error.h
  3. 1 0
      include/cx/chlcd/types.h
  4. 0 1
      source/display.c
  5. 93 0
      source/hd44780.c

+ 2 - 0
include/cx/chlcd/connector.h

@@ -22,6 +22,8 @@ typedef struct chlcd_hd44780_shift_register_connector_s {
     chlcd_bitcount_t d4;
     chlcd_bitcount_t d5;
     chlcd_bitcount_t d6;
+
+    uint8_t last_state;
     chlcd_bitcount_t d7;
 } chlcd_hd44780_shift_register_connector_t;
 

+ 2 - 1
include/cx/chlcd/error.h

@@ -3,7 +3,8 @@
 
 typedef enum chlcd_error_e {
     CHLCD_SUCCESS,
-    CHLCD_BAD_ARGUMENT
+    CHLCD_BAD_ARGUMENT,
+    CHLCD_SEND_ERROR
 } chlcd_error_t;
 
 #endif

+ 1 - 0
include/cx/chlcd/types.h

@@ -30,6 +30,7 @@ typedef enum chlcd_error_e (*chlcd_sender_t)(
 typedef enum chlcd_error_r (*chlcd_decoder_t)(
     enum chlcd_command_e command,
     chlcd_data_t content,
+    void *connector,
     chlcd_sender_t sender
 );
 

+ 0 - 1
source/display.c

@@ -18,4 +18,3 @@ chlcd_error_t chlcd_display_init(chlcd_display_t *self) {
     return CHLCD_SUCCESS;
 }
 
-chlcd_error_t 

+ 93 - 0
source/hd44780.c

@@ -4,6 +4,55 @@
 
 #include "chlcd.h"
 
+#define __R(X) (if (X != CHLCD_SUCCESS) { return CHLCD_BAD_ARGUMENT; })
+
+chlcd_error_t chlcd_hd44780_direct_sender_init(void *self_pointer) {
+    chlcd_hd44780_direct_connector_t *self 
+    = (chlcd_hd44780_direct_connector_t *) self_pointer;
+
+    __R(chlcd_pin_set_output(self->e);
+    __R(chlcd_pin_set_output(self->rs);
+    __R(chlcd_pin_set_output(self->d4);
+    __R(chlcd_pin_set_output(self->d5);
+    __R(chlcd_pin_set_output(self->d6);
+    __R(chlcd_pin_set_output(self->d7);
+    
+    return CHLCD_SUCCESS;
+}
+
+#undef __R
+
+#define __R(X) (if (X != CHLCD_SUCCESS) { return CHLCD_BAD_ARGUMENT; })
+
+static chlcd_error_t __chlcd_hd44780_shift_register_send_byte(
+    void *self_pointer,
+    uint8_t content
+) {
+    chlcd_hd44780_shift_register_t *self
+    = (chlcd_hd44780_shift_register_t *) self_pointer;
+
+    
+
+    self->last_state = content; 
+}
+
+#undef __R
+
+#define __R(X) (if (X != CHLCD_SUCCESS) { return CHLCD_BAD_ARGUMENT; })
+
+chlcd_error_t chlcd_hd44780_shift_register_init(void *self_pointer) {
+    chlcd_hd44780_shift_register_t *self 
+    = (chlcd_hd44780_shift_register_t *) self_pointer;
+
+    __R(chlcd_pin_set_output(self->register_latch));
+    __R(chlcd_pin_set_output(self->register_clock));
+    __R(chlcd_pin_set_output(self->register_data));
+
+    return CHLCD_SUCCESS;
+}
+
+#undef __R
+
 chlcd_error_t chlcd_hd44780_direct_sender(
     void *self,
     chlcd_data_t content,
@@ -22,4 +71,48 @@ chlcd_error_t chlcd_hd44780_shift_register_sender(
     return CHLCD_SUCCESS;
 }
 
+static inline chlcd_error_t __chlcd_hd44780_decoder_init(
+    void *connector,
+    chlcd_sender_t sender
+) {
+    if (sender(connector, 0b0010, true, true) != CHLCD_SUCCESS) {
+        return CHLCD_SEND_ERROR;
+    }
+
+    if (sender(connector, 0b00001111, true, false) != CHLCD_SUCCESS) {
+        return CHLCD_SEND_ERROR;
+    }
+
+    return CHLCD_SUCCESS;
+}
+
+static inline chlcd_error_t __chlcd_hd4470_decoder_clear(
+    void *connector,
+    chlcd_sender_t sender;
+) {
+    if (sender(connector, 0b00000001, true, false) != CHLCD_SUCCESS) {
+        return CHLCD_SEND_ERROR;
+    }
+    
+    if (sender(connector, 0b00000010, true, false) != CHLCD_SUCCESS) {
+        return CHLCD_SEND_ERROR;
+    }
+
+    return CHLCD_SUCCESS;
+}
+
+chlcd_error_t chlcd_hd44780_decoder(
+    chlcd_command_t command,
+    chlcd_data_t content,
+    void *connector,
+    chlcd_sender_t sender
+) {
+    switch (command) {
+        case CHLCD_INIT:
+            return __chlcd_hd44780_decoder_init(connector, init);
+
+        case CHLCD_CLEAR:
+            return __chlcd_hd44780_decoder_clear(connector, init);
+    }
+}