fork of original freetronics library

Dependents:   AwsomeStation

Fork of Freetronics_16x2_LCD by Components

Committer:
rba90
Date:
Thu Sep 02 08:00:12 2021 +0000
Revision:
5:7b216d7781f8
Parent:
4:b4b2435f4a7f
Add support to MbedOS 6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
KKempeneers 1:ddcefddda4a7 1 /* mbed freetronicsLCDShield Library, written by Koen J.F. Kempeneers
KKempeneers 1:ddcefddda4a7 2 * koen.kempeneers@damiaaninstituut.be
KKempeneers 1:ddcefddda4a7 3 *
KKempeneers 1:ddcefddda4a7 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
KKempeneers 1:ddcefddda4a7 5 * of this software and associated documentation files (the "Software"), to deal
KKempeneers 1:ddcefddda4a7 6 * in the Software without restriction, including without limitation the rights
KKempeneers 1:ddcefddda4a7 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
KKempeneers 1:ddcefddda4a7 8 * copies of the Software, and to permit persons to whom the Software is
KKempeneers 1:ddcefddda4a7 9 * furnished to do so, subject to the following conditions:
KKempeneers 1:ddcefddda4a7 10 *
KKempeneers 1:ddcefddda4a7 11 * The above copyright notice and this permission notice shall be included in
KKempeneers 1:ddcefddda4a7 12 * all copies or substantial portions of the Software.
KKempeneers 1:ddcefddda4a7 13 *
KKempeneers 1:ddcefddda4a7 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
KKempeneers 1:ddcefddda4a7 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
KKempeneers 1:ddcefddda4a7 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
KKempeneers 1:ddcefddda4a7 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
KKempeneers 1:ddcefddda4a7 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
KKempeneers 1:ddcefddda4a7 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
KKempeneers 1:ddcefddda4a7 20 * THE SOFTWARE.
KKempeneers 1:ddcefddda4a7 21 */
rba90 5:7b216d7781f8 22
rba90 5:7b216d7781f8 23 #include "Stream.h"
KKempeneers 1:ddcefddda4a7 24
KKempeneers 1:ddcefddda4a7 25 #ifndef FREETRONICSLCDSHIELD_H
KKempeneers 1:ddcefddda4a7 26 #define FREETRONICSLCDSHIELD_H
KKempeneers 1:ddcefddda4a7 27
KKempeneers 0:01f3d38f8b6d 28 #define LEFT 0
KKempeneers 0:01f3d38f8b6d 29 #define RIGHT 1
KKempeneers 0:01f3d38f8b6d 30
KKempeneers 3:0e04b6c4abb8 31 /**
KKempeneers 3:0e04b6c4abb8 32 * Provides full LCD support for the HD44780 compatible LCD on the arduino shaped shield.
KKempeneers 3:0e04b6c4abb8 33 * http://www.freetronics.com/products/lcd-keypad-shield#.UnIr6_nkq0M
KKempeneers 3:0e04b6c4abb8 34 *
KKempeneers 3:0e04b6c4abb8 35 */
KKempeneers 0:01f3d38f8b6d 36 class freetronicsLCDShield : public Stream {
KKempeneers 0:01f3d38f8b6d 37 private:
KKempeneers 0:01f3d38f8b6d 38 // Functions
KKempeneers 0:01f3d38f8b6d 39 void writeByte (int byte);
KKempeneers 0:01f3d38f8b6d 40 void writeCommand (int command);
KKempeneers 0:01f3d38f8b6d 41 void writeData (int data);
KKempeneers 0:01f3d38f8b6d 42 void character(int line, int col, int value);
KKempeneers 0:01f3d38f8b6d 43
KKempeneers 0:01f3d38f8b6d 44 // Hardware
KKempeneers 0:01f3d38f8b6d 45 DigitalOut _rs, _e;
KKempeneers 0:01f3d38f8b6d 46 BusOut _d;
KKempeneers 0:01f3d38f8b6d 47 PwmOut _bl;
KKempeneers 0:01f3d38f8b6d 48 AnalogIn _a0;
KKempeneers 0:01f3d38f8b6d 49
KKempeneers 0:01f3d38f8b6d 50 public:
rba90 4:b4b2435f4a7f 51 // add definition for each button
rba90 4:b4b2435f4a7f 52 typedef enum
rba90 4:b4b2435f4a7f 53 {
rba90 4:b4b2435f4a7f 54 BTN_NONE = 0,
rba90 4:b4b2435f4a7f 55 BTN_RIGHT,
rba90 4:b4b2435f4a7f 56 BTN_UP,
rba90 4:b4b2435f4a7f 57 BTN_DOWN,
rba90 4:b4b2435f4a7f 58 BTN_LEFT,
rba90 4:b4b2435f4a7f 59 BTN_SELECT
rba90 4:b4b2435f4a7f 60 } ButtonType_t;
rba90 4:b4b2435f4a7f 61
KKempeneers 3:0e04b6c4abb8 62 /**
KKempeneers 3:0e04b6c4abb8 63 * The constructor creates an freeTronics LCD Shield object, the pins are to be provided by the user. In sequence, RegisterSelect, Enable, Data0
KKempeneers 3:0e04b6c4abb8 64 * to Data3. Bl is the backlight and a0 is to be provided for button support.
KKempeneers 3:0e04b6c4abb8 65 * Bl should be a pin with PWM capabilities and a0 should be an analogue input.
KKempeneers 3:0e04b6c4abb8 66 *
KKempeneers 3:0e04b6c4abb8 67 * The class inherits from stream, therfore writing to the display is as easy as calling printf() to display text or putc() to display a custom character
KKempeneers 3:0e04b6c4abb8 68 *
KKempeneers 3:0e04b6c4abb8 69 * Example:
KKempeneers 3:0e04b6c4abb8 70 * @code
KKempeneers 3:0e04b6c4abb8 71 * <instanceName>.printf("Hello World");
KKempeneers 3:0e04b6c4abb8 72 * @endcode */
KKempeneers 2:f40a5df43d09 73 freetronicsLCDShield (PinName rs /*= PTA13*/,
KKempeneers 2:f40a5df43d09 74 PinName e /*= PTD5*/,
KKempeneers 2:f40a5df43d09 75 PinName d0 /*= PTA4*/,
KKempeneers 2:f40a5df43d09 76 PinName d1 /*= PTA5*/,
KKempeneers 2:f40a5df43d09 77 PinName d2 /*= PTC8*/,
KKempeneers 2:f40a5df43d09 78 PinName d3 /*= PTC9*/,
KKempeneers 2:f40a5df43d09 79 PinName bl /*= PTA12*/,
KKempeneers 2:f40a5df43d09 80 PinName a0 /*= PTB0*/);
KKempeneers 3:0e04b6c4abb8 81 /** Creates custom characters
KKempeneers 3:0e04b6c4abb8 82 *
KKempeneers 3:0e04b6c4abb8 83 * Characters that aren't included in the LCD controllers character map which includes typically all ASCII characters
KKempeneers 3:0e04b6c4abb8 84 * can be generated by writing bitmaps to the character generator ram memory space. For instance the degree sign '°' is an
KKempeneers 3:0e04b6c4abb8 85 * extended ASCII character not included in the character map.
KKempeneers 3:0e04b6c4abb8 86 * It can however be generated using the writeCGRAM member function. Each line of the 5x7 dot matrix is represented by a byte in which
KKempeneers 3:0e04b6c4abb8 87 * the lower 5 bits correspond to the pixel on the display. In total 8 bytes make up one custom character (the 8th byte represents the
KKempeneers 3:0e04b6c4abb8 88 * cursor space)
KKempeneers 3:0e04b6c4abb8 89 *
KKempeneers 3:0e04b6c4abb8 90 * Example:
KKempeneers 3:0e04b6c4abb8 91 * @code
KKempeneers 3:0e04b6c4abb8 92 * CGRAM_DATA[] = {0xC0, //0b00001100
KKempeneers 3:0e04b6c4abb8 93 * 0x12, //0b00010010
KKempeneers 3:0e04b6c4abb8 94 * 0x12, //0b00010010
KKempeneers 3:0e04b6c4abb8 95 * 0xC0, //0b00001100
KKempeneers 3:0e04b6c4abb8 96 * 0x00, //0b00000000
KKempeneers 3:0e04b6c4abb8 97 * 0x00, //0b00000000
KKempeneers 3:0e04b6c4abb8 98 * 0x00, //0b00000000
KKempeneers 3:0e04b6c4abb8 99 * 0x00}; //0b00000000
KKempeneers 3:0e04b6c4abb8 100 *
KKempeneers 3:0e04b6c4abb8 101 * <instanceName>.writeCGRAM (0x00, &CGRAM_DATA[0], 8);
KKempeneers 3:0e04b6c4abb8 102 * @endcode
KKempeneers 3:0e04b6c4abb8 103 *
KKempeneers 3:0e04b6c4abb8 104 * The '°' can hereafter be displayed by calling:
KKempeneers 3:0e04b6c4abb8 105 * @code
KKempeneers 3:0e04b6c4abb8 106 * <instanceName>.putc (0);
KKempeneers 3:0e04b6c4abb8 107 * @endcode
KKempeneers 3:0e04b6c4abb8 108 *
KKempeneers 3:0e04b6c4abb8 109 */
KKempeneers 1:ddcefddda4a7 110 void writeCGRAM (char address, const char *ptr, char nbytes);
KKempeneers 3:0e04b6c4abb8 111
KKempeneers 3:0e04b6c4abb8 112 /** Sets the current cursor position.
KKempeneers 3:0e04b6c4abb8 113 *
KKempeneers 3:0e04b6c4abb8 114 * To place the cursor at a specific location on the display call the setCursorPosition member function, the first argument is the line either 0
KKempeneers 3:0e04b6c4abb8 115 * or 1, the second argument is the column 0 .. 15.
KKempeneers 3:0e04b6c4abb8 116 *
KKempeneers 3:0e04b6c4abb8 117 */
KKempeneers 0:01f3d38f8b6d 118 void setCursorPosition (int line, int col);
KKempeneers 3:0e04b6c4abb8 119
KKempeneers 3:0e04b6c4abb8 120 /** Sets the backlight.
KKempeneers 3:0e04b6c4abb8 121 *
KKempeneers 3:0e04b6c4abb8 122 * The backlight is turned on (argument true) or off (false)
KKempeneers 3:0e04b6c4abb8 123 */
KKempeneers 0:01f3d38f8b6d 124 void setBackLight (bool blStatus);
KKempeneers 3:0e04b6c4abb8 125
KKempeneers 3:0e04b6c4abb8 126 /** Sets the backlight.
KKempeneers 3:0e04b6c4abb8 127 *
KKempeneers 3:0e04b6c4abb8 128 * The backlight intensity is specified by the normalized float argument 0 .. 1
KKempeneers 3:0e04b6c4abb8 129 */
KKempeneers 0:01f3d38f8b6d 130 void setBackLight (float blIntensity);
KKempeneers 3:0e04b6c4abb8 131
KKempeneers 3:0e04b6c4abb8 132 /** Sets cursor appearance.
KKempeneers 3:0e04b6c4abb8 133 *
KKempeneers 3:0e04b6c4abb8 134 * The cursor is set visible (1st argument true) or invisible (false). When the second argument is set when the cStatus is set the cursor blinks.
KKempeneers 3:0e04b6c4abb8 135 */
KKempeneers 1:ddcefddda4a7 136 void setCursor (bool cStatus = true, bool blink = false);
KKempeneers 3:0e04b6c4abb8 137
KKempeneers 3:0e04b6c4abb8 138 /** Shifts text.
KKempeneers 3:0e04b6c4abb8 139 *
KKempeneers 3:0e04b6c4abb8 140 * Text on the display is shifted left.
KKempeneers 3:0e04b6c4abb8 141 */
KKempeneers 1:ddcefddda4a7 142 void shiftLeft (void);
KKempeneers 3:0e04b6c4abb8 143
KKempeneers 3:0e04b6c4abb8 144 /** Shifts text.
KKempeneers 3:0e04b6c4abb8 145 *
KKempeneers 3:0e04b6c4abb8 146 * Text on the display is shifted right.
KKempeneers 3:0e04b6c4abb8 147 */
KKempeneers 1:ddcefddda4a7 148 void shiftRight (void);
KKempeneers 3:0e04b6c4abb8 149
KKempeneers 3:0e04b6c4abb8 150
KKempeneers 3:0e04b6c4abb8 151 /** Shifts text.
KKempeneers 3:0e04b6c4abb8 152 *
KKempeneers 3:0e04b6c4abb8 153 * Text on the display is shifted left if direction is set (true) or right is direction is reset (false)
KKempeneers 3:0e04b6c4abb8 154 */
KKempeneers 1:ddcefddda4a7 155 void shift (bool direction);
KKempeneers 3:0e04b6c4abb8 156
KKempeneers 3:0e04b6c4abb8 157 /** Clears the display, the cursor returns to its home position (0,0).
KKempeneers 3:0e04b6c4abb8 158 *
KKempeneers 3:0e04b6c4abb8 159 * The user should preserve caution when clearing the display in the main program loop, this very quickly results in flickering. A better approach is to
KKempeneers 3:0e04b6c4abb8 160 * overwrite the display.
KKempeneers 3:0e04b6c4abb8 161 */
KKempeneers 0:01f3d38f8b6d 162 void cls (void);
KKempeneers 3:0e04b6c4abb8 163
KKempeneers 3:0e04b6c4abb8 164 /** Returns the cursor to positition (0,0). The display is NOT cleared.
KKempeneers 3:0e04b6c4abb8 165 *
KKempeneers 3:0e04b6c4abb8 166 * This function differs from setCursorPosition(0,0) in the way that home() undoes all preceding shift operations. i.e. If the display is shifted
KKempeneers 3:0e04b6c4abb8 167 * one position right, the setCursorPosition(0,0) function call would place the cursor physically at the second character of the first row while
KKempeneers 3:0e04b6c4abb8 168 * home() places it at the first character of the first row.
KKempeneers 3:0e04b6c4abb8 169 */
KKempeneers 0:01f3d38f8b6d 170 void home(void);
KKempeneers 0:01f3d38f8b6d 171
KKempeneers 3:0e04b6c4abb8 172 /** Reads the status of the buttons
KKempeneers 3:0e04b6c4abb8 173 *
KKempeneers 3:0e04b6c4abb8 174 *
KKempeneers 3:0e04b6c4abb8 175 */
rba90 4:b4b2435f4a7f 176 float readButtonAnalog(void);
rba90 4:b4b2435f4a7f 177
rba90 4:b4b2435f4a7f 178 // determine which button is pressed
rba90 4:b4b2435f4a7f 179 ButtonType_t readButton(void);
KKempeneers 0:01f3d38f8b6d 180
KKempeneers 0:01f3d38f8b6d 181 protected:
KKempeneers 0:01f3d38f8b6d 182 // Stream implementation functions
KKempeneers 0:01f3d38f8b6d 183 virtual int _putc(int value);
KKempeneers 0:01f3d38f8b6d 184 virtual int _getc();
KKempeneers 1:ddcefddda4a7 185 };
KKempeneers 1:ddcefddda4a7 186
KKempeneers 1:ddcefddda4a7 187 #endif