Subversion Repositories libCharLCD

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #pragma once
  2. #include "main.h"
  3.  
  4. #if !defined LCD_DELAY_CNT
  5. #error need to define LCD delay counter ticking in microseconds
  6. #endif
  7.  
  8. enum lcdType_t
  9. {
  10.         LCD_8X1, ///< 8 chars, 1 column
  11.         LCD_10X1,
  12.         LCD_16X1,
  13.         LCD_20X1,
  14.         LCD_40X1,
  15.         LCD_8X2,
  16.         LCD_10X2,
  17.         LCD_16X2,
  18.         LCD_20X2,
  19.         LCD_40X2
  20.  
  21. };
  22.  
  23. class ioline_t
  24. {
  25. public:
  26.         ioline_t(GPIO_TypeDef *gpio, uint16_t pin) : gpio(gpio), pin(pin){};
  27.  
  28.         ioline_t() : gpio(nullptr), pin(0){};
  29.  
  30.         ioline_t &operator=(ioline_t const &data)
  31.         {
  32.                 this->gpio = data.gpio;
  33.                 this->pin = data.pin;
  34.                 return *this;
  35.         };
  36.  
  37.         GPIO_TypeDef *gpio; // GPIO pin port
  38.         uint16_t pin;       // GPIO pin number
  39. };
  40.  
  41.  
  42.  
  43. /// \brief Describe the bits of the databus for the LCD
  44. struct lcdDataLines_t
  45. {
  46.         lcdDataLines_t(ioline_t d0_, ioline_t d1_, ioline_t d2_, ioline_t d3_)
  47.         {
  48.                 m_bits[0] = d0_;
  49.                 m_bits[1] = d1_;
  50.                 m_bits[2] = d2_;
  51.                 m_bits[3] = d3_;
  52.         }
  53.         ioline_t &operator[](int i_) { return m_bits[i_]; };
  54.  
  55. private:
  56.         ioline_t m_bits[4];
  57. };
  58.  
  59. class lcdInterface_t
  60. {
  61. public:
  62.         lcdInterface_t(lcdType_t type_,      ///< LCD type code
  63.                        ioline_t rsBit_,      ///< LCD register select bit
  64.                        ioline_t wrBit_,      ///< LCD register write bit
  65.                        ioline_t eBit_,       ///< LCD enable bit
  66.                        lcdDataLines_t dBits_ ///< LCD data bits
  67.                        )
  68.             : m_lcdType(type_), m_rsBit(rsBit_), m_wrBit(wrBit_), m_eBit(eBit_), m_dBits(dBits_), m_timeouts(0){};
  69.  
  70.         uint8_t displayXsize() const;
  71.  
  72.         uint8_t displayYsize() const;
  73.  
  74.         void writeData(uint8_t data_);
  75.  
  76.         /// \brief write top 4 bits of the control register with the top 4 bits of data_
  77.         void writeCtrl4(uint8_t data_);
  78.  
  79.         void writeCtrl(uint8_t data_);
  80.  
  81.         /// \brief write a control value then wait for it to complete
  82.         void writeCtrlWait(uint8_t data_);
  83.  
  84.         uint8_t readData();
  85.  
  86.         uint8_t readCtrl();
  87.  
  88.         lcdType_t lcdType() { return m_lcdType; };
  89.  
  90.         /// \brief Set cursor position.
  91.         void gotoxy(uint8_t x_, uint8_t y_);
  92.  
  93.         // \brief Start the polled timer for high speed signals.
  94.         void init();
  95.  
  96.         // \brief maintaining data on the bus
  97.         void pulseE();
  98.  
  99. private:
  100.         /// \brief write low order 4 bits to data bus
  101.         void writeData4(uint8_t data_);
  102.         /// \brief read low order 4 bits from data bus
  103.         uint8_t readData4();
  104.  
  105.         /// \brief write full 8 bits to data bus
  106.         void writeData8(uint8_t data_);
  107.  
  108.         /// \brief read full 8 bits from data bus
  109.         uint8_t readData8();
  110.  
  111.         /// \brief poll/wait while hardware reports busy
  112.         void pollBusy();
  113.  
  114.         /// \brief Set the GPIO mode
  115.         void setLineMode(ioline_t line, unsigned mode);
  116.  
  117.         /// \brief delay for microseconds
  118.         void polledDelay(unsigned microsec);
  119.  
  120.         lcdType_t const m_lcdType;
  121.  
  122.         ioline_t const m_rsBit;
  123.  
  124.         ioline_t const m_wrBit;
  125.  
  126.         ioline_t const m_eBit;
  127.  
  128.         /// \brief gpio information
  129.         lcdDataLines_t m_dBits;
  130.  
  131.         /// \brief a count of the number of failures
  132.         uint32_t m_timeouts;
  133. };
  134.