A basic library for the Freetronics arduino LCD shield.

Fork of freetronicsLCDShield by Koen Kempeneers

Committer:
johnb
Date:
Sun Jul 02 15:05:19 2017 +0000
Revision:
6:ac481535732f
Parent:
5:fa933933ccd1
Child:
7:56d8df0eb209
Add pressedButton to return specifically which button is currently pressed (if any)

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 5:fa933933ccd1 2 * kkempeneers@skynet.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 */
KKempeneers 1:ddcefddda4a7 22
KKempeneers 1:ddcefddda4a7 23 #ifndef FREETRONICSLCDSHIELD_H
KKempeneers 1:ddcefddda4a7 24 #define FREETRONICSLCDSHIELD_H
KKempeneers 1:ddcefddda4a7 25
KKempeneers 0:01f3d38f8b6d 26 #define LEFT 0
KKempeneers 0:01f3d38f8b6d 27 #define RIGHT 1
KKempeneers 0:01f3d38f8b6d 28
johnb 6:ac481535732f 29 #define FREETRONICSLCDSHIELD_BUTTON_COUNT 5
johnb 6:ac481535732f 30
johnb 6:ac481535732f 31
KKempeneers 3:0e04b6c4abb8 32 /**
KKempeneers 3:0e04b6c4abb8 33 * Provides full LCD support for the HD44780 compatible LCD on the arduino shaped shield.
KKempeneers 3:0e04b6c4abb8 34 * http://www.freetronics.com/products/lcd-keypad-shield#.UnIr6_nkq0M
KKempeneers 3:0e04b6c4abb8 35 *
KKempeneers 3:0e04b6c4abb8 36 */
KKempeneers 0:01f3d38f8b6d 37 class freetronicsLCDShield : public Stream {
KKempeneers 0:01f3d38f8b6d 38 private:
KKempeneers 0:01f3d38f8b6d 39 // Functions
KKempeneers 0:01f3d38f8b6d 40 void writeByte (int byte);
KKempeneers 0:01f3d38f8b6d 41 void writeCommand (int command);
KKempeneers 0:01f3d38f8b6d 42 void writeData (int data);
KKempeneers 0:01f3d38f8b6d 43 void character(int line, int col, int value);
KKempeneers 0:01f3d38f8b6d 44
KKempeneers 0:01f3d38f8b6d 45 // Hardware
KKempeneers 0:01f3d38f8b6d 46 DigitalOut _rs, _e;
KKempeneers 0:01f3d38f8b6d 47 BusOut _d;
KKempeneers 0:01f3d38f8b6d 48 PwmOut _bl;
KKempeneers 0:01f3d38f8b6d 49 AnalogIn _a0;
KKempeneers 0:01f3d38f8b6d 50
KKempeneers 0:01f3d38f8b6d 51 public:
KKempeneers 3:0e04b6c4abb8 52 /**
KKempeneers 3:0e04b6c4abb8 53 * 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 54 * to Data3. Bl is the backlight and a0 is to be provided for button support.
KKempeneers 3:0e04b6c4abb8 55 * Bl should be a pin with PWM capabilities and a0 should be an analogue input.
KKempeneers 3:0e04b6c4abb8 56 *
KKempeneers 3:0e04b6c4abb8 57 * 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 58 *
KKempeneers 3:0e04b6c4abb8 59 * Example:
KKempeneers 3:0e04b6c4abb8 60 * @code
KKempeneers 3:0e04b6c4abb8 61 * <instanceName>.printf("Hello World");
KKempeneers 3:0e04b6c4abb8 62 * @endcode */
KKempeneers 2:f40a5df43d09 63 freetronicsLCDShield (PinName rs /*= PTA13*/,
KKempeneers 2:f40a5df43d09 64 PinName e /*= PTD5*/,
KKempeneers 2:f40a5df43d09 65 PinName d0 /*= PTA4*/,
KKempeneers 2:f40a5df43d09 66 PinName d1 /*= PTA5*/,
KKempeneers 2:f40a5df43d09 67 PinName d2 /*= PTC8*/,
KKempeneers 2:f40a5df43d09 68 PinName d3 /*= PTC9*/,
KKempeneers 2:f40a5df43d09 69 PinName bl /*= PTA12*/,
KKempeneers 2:f40a5df43d09 70 PinName a0 /*= PTB0*/);
KKempeneers 3:0e04b6c4abb8 71 /** Creates custom characters
KKempeneers 3:0e04b6c4abb8 72 *
KKempeneers 3:0e04b6c4abb8 73 * Characters that aren't included in the LCD controllers character map which includes typically all ASCII characters
KKempeneers 3:0e04b6c4abb8 74 * can be generated by writing bitmaps to the character generator ram memory space. For instance the degree sign '°' is an
KKempeneers 3:0e04b6c4abb8 75 * extended ASCII character not included in the character map.
KKempeneers 3:0e04b6c4abb8 76 * 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 77 * 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 78 * cursor space)
KKempeneers 3:0e04b6c4abb8 79 *
KKempeneers 3:0e04b6c4abb8 80 * Example:
KKempeneers 3:0e04b6c4abb8 81 * @code
KKempeneers 3:0e04b6c4abb8 82 * CGRAM_DATA[] = {0xC0, //0b00001100
KKempeneers 3:0e04b6c4abb8 83 * 0x12, //0b00010010
KKempeneers 3:0e04b6c4abb8 84 * 0x12, //0b00010010
KKempeneers 3:0e04b6c4abb8 85 * 0xC0, //0b00001100
KKempeneers 3:0e04b6c4abb8 86 * 0x00, //0b00000000
KKempeneers 3:0e04b6c4abb8 87 * 0x00, //0b00000000
KKempeneers 3:0e04b6c4abb8 88 * 0x00, //0b00000000
KKempeneers 3:0e04b6c4abb8 89 * 0x00}; //0b00000000
KKempeneers 3:0e04b6c4abb8 90 *
KKempeneers 3:0e04b6c4abb8 91 * <instanceName>.writeCGRAM (0x00, &CGRAM_DATA[0], 8);
KKempeneers 3:0e04b6c4abb8 92 * @endcode
KKempeneers 3:0e04b6c4abb8 93 *
KKempeneers 3:0e04b6c4abb8 94 * The '°' can hereafter be displayed by calling:
KKempeneers 3:0e04b6c4abb8 95 * @code
KKempeneers 3:0e04b6c4abb8 96 * <instanceName>.putc (0);
KKempeneers 3:0e04b6c4abb8 97 * @endcode
KKempeneers 3:0e04b6c4abb8 98 *
KKempeneers 3:0e04b6c4abb8 99 */
KKempeneers 1:ddcefddda4a7 100 void writeCGRAM (char address, const char *ptr, char nbytes);
KKempeneers 3:0e04b6c4abb8 101
KKempeneers 3:0e04b6c4abb8 102 /** Sets the current cursor position.
KKempeneers 3:0e04b6c4abb8 103 *
KKempeneers 3:0e04b6c4abb8 104 * 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 105 * or 1, the second argument is the column 0 .. 15.
KKempeneers 3:0e04b6c4abb8 106 *
KKempeneers 3:0e04b6c4abb8 107 */
KKempeneers 0:01f3d38f8b6d 108 void setCursorPosition (int line, int col);
KKempeneers 3:0e04b6c4abb8 109
KKempeneers 3:0e04b6c4abb8 110 /** Sets the backlight.
KKempeneers 3:0e04b6c4abb8 111 *
KKempeneers 3:0e04b6c4abb8 112 * The backlight is turned on (argument true) or off (false)
KKempeneers 3:0e04b6c4abb8 113 */
KKempeneers 0:01f3d38f8b6d 114 void setBackLight (bool blStatus);
KKempeneers 3:0e04b6c4abb8 115
KKempeneers 3:0e04b6c4abb8 116 /** Sets the backlight.
KKempeneers 3:0e04b6c4abb8 117 *
KKempeneers 3:0e04b6c4abb8 118 * The backlight intensity is specified by the normalized float argument 0 .. 1
KKempeneers 3:0e04b6c4abb8 119 */
KKempeneers 0:01f3d38f8b6d 120 void setBackLight (float blIntensity);
KKempeneers 3:0e04b6c4abb8 121
KKempeneers 3:0e04b6c4abb8 122 /** Sets cursor appearance.
KKempeneers 3:0e04b6c4abb8 123 *
KKempeneers 3:0e04b6c4abb8 124 * 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 125 */
KKempeneers 1:ddcefddda4a7 126 void setCursor (bool cStatus = true, bool blink = false);
KKempeneers 3:0e04b6c4abb8 127
KKempeneers 3:0e04b6c4abb8 128 /** Shifts text.
KKempeneers 3:0e04b6c4abb8 129 *
KKempeneers 3:0e04b6c4abb8 130 * Text on the display is shifted left.
KKempeneers 3:0e04b6c4abb8 131 */
KKempeneers 1:ddcefddda4a7 132 void shiftLeft (void);
KKempeneers 3:0e04b6c4abb8 133
KKempeneers 3:0e04b6c4abb8 134 /** Shifts text.
KKempeneers 3:0e04b6c4abb8 135 *
KKempeneers 3:0e04b6c4abb8 136 * Text on the display is shifted right.
KKempeneers 3:0e04b6c4abb8 137 */
KKempeneers 1:ddcefddda4a7 138 void shiftRight (void);
KKempeneers 3:0e04b6c4abb8 139
KKempeneers 3:0e04b6c4abb8 140
KKempeneers 3:0e04b6c4abb8 141 /** Shifts text.
KKempeneers 3:0e04b6c4abb8 142 *
KKempeneers 3:0e04b6c4abb8 143 * Text on the display is shifted left if direction is set (true) or right is direction is reset (false)
KKempeneers 3:0e04b6c4abb8 144 */
KKempeneers 1:ddcefddda4a7 145 void shift (bool direction);
KKempeneers 3:0e04b6c4abb8 146
KKempeneers 3:0e04b6c4abb8 147 /** Clears the display, the cursor returns to its home position (0,0).
KKempeneers 3:0e04b6c4abb8 148 *
KKempeneers 3:0e04b6c4abb8 149 * 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 150 * overwrite the display.
KKempeneers 3:0e04b6c4abb8 151 */
KKempeneers 0:01f3d38f8b6d 152 void cls (void);
KKempeneers 3:0e04b6c4abb8 153
KKempeneers 3:0e04b6c4abb8 154 /** Returns the cursor to positition (0,0). The display is NOT cleared.
KKempeneers 3:0e04b6c4abb8 155 *
KKempeneers 3:0e04b6c4abb8 156 * 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 157 * 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 158 * home() places it at the first character of the first row.
KKempeneers 3:0e04b6c4abb8 159 */
KKempeneers 0:01f3d38f8b6d 160 void home(void);
KKempeneers 0:01f3d38f8b6d 161
johnb 6:ac481535732f 162 typedef enum
johnb 6:ac481535732f 163 {
johnb 6:ac481535732f 164 None,
johnb 6:ac481535732f 165 Left,
johnb 6:ac481535732f 166 Down,
johnb 6:ac481535732f 167 Up,
johnb 6:ac481535732f 168 Right
johnb 6:ac481535732f 169 } ShieldButton;
johnb 6:ac481535732f 170
KKempeneers 3:0e04b6c4abb8 171 /** Reads the status of the buttons
KKempeneers 3:0e04b6c4abb8 172 *
KKempeneers 3:0e04b6c4abb8 173 *
KKempeneers 3:0e04b6c4abb8 174 */
KKempeneers 0:01f3d38f8b6d 175 float readButton(void);
KKempeneers 0:01f3d38f8b6d 176
johnb 6:ac481535732f 177 ShieldButton pressedButton(void);
johnb 6:ac481535732f 178
KKempeneers 0:01f3d38f8b6d 179 protected:
KKempeneers 0:01f3d38f8b6d 180 // Stream implementation functions
KKempeneers 0:01f3d38f8b6d 181 virtual int _putc(int value);
KKempeneers 0:01f3d38f8b6d 182 virtual int _getc();
johnb 6:ac481535732f 183
johnb 6:ac481535732f 184 static const float buttonThresholds[FREETRONICSLCDSHIELD_BUTTON_COUNT];
KKempeneers 1:ddcefddda4a7 185 };
KKempeneers 1:ddcefddda4a7 186
KKempeneers 1:ddcefddda4a7 187 #endif