Digole Serial Display FRDM-KL25Z Test Program Requires pull-ups on the SDA & SCL data lines. Digole Serial modified with extra Stop commands so that it works with the FRDM-KL25Z I2C library functions. Works fine on LPC1768 without extra Stop commands.
DigoleSerialDisplay/DigoleSerialDisp.cpp@0:535e018f97b9, 2013-06-22 (annotated)
- Committer:
- PhilG1300
- Date:
- Sat Jun 22 09:33:42 2013 +0000
- Revision:
- 0:535e018f97b9
Digole Serial Display FRDM-KL25Z I2C Test Program
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
PhilG1300 | 0:535e018f97b9 | 1 | /** Digole Serial Display library |
PhilG1300 | 0:535e018f97b9 | 2 | * |
PhilG1300 | 0:535e018f97b9 | 3 | * @Author: Digole Digital Solutions : www.digole.com ported to mbed by Michael Shimniok www.bot-thoughts.com |
PhilG1300 | 0:535e018f97b9 | 4 | */ |
PhilG1300 | 0:535e018f97b9 | 5 | |
PhilG1300 | 0:535e018f97b9 | 6 | #include "mbed.h" |
PhilG1300 | 0:535e018f97b9 | 7 | #include "DigoleSerialDisp.h" |
PhilG1300 | 0:535e018f97b9 | 8 | #include <stdio.h> |
PhilG1300 | 0:535e018f97b9 | 9 | #include <string.h> |
PhilG1300 | 0:535e018f97b9 | 10 | #include <inttypes.h> |
PhilG1300 | 0:535e018f97b9 | 11 | |
PhilG1300 | 0:535e018f97b9 | 12 | char null = 0; |
PhilG1300 | 0:535e018f97b9 | 13 | |
PhilG1300 | 0:535e018f97b9 | 14 | |
PhilG1300 | 0:535e018f97b9 | 15 | // that resetting the Arduino doesn't reset the LCD, so we |
PhilG1300 | 0:535e018f97b9 | 16 | // can't assume that its in that state when a sketch starts (and the |
PhilG1300 | 0:535e018f97b9 | 17 | // LiquidCrystal constructor is called). |
PhilG1300 | 0:535e018f97b9 | 18 | |
PhilG1300 | 0:535e018f97b9 | 19 | //UART function |
PhilG1300 | 0:535e018f97b9 | 20 | |
PhilG1300 | 0:535e018f97b9 | 21 | char buf[128]; |
PhilG1300 | 0:535e018f97b9 | 22 | char tmp[128]; |
PhilG1300 | 0:535e018f97b9 | 23 | |
PhilG1300 | 0:535e018f97b9 | 24 | DigoleSerialDisp::DigoleSerialDisp(PinName sda, PinName scl, uint8_t address): |
PhilG1300 | 0:535e018f97b9 | 25 | _device(sda, scl) |
PhilG1300 | 0:535e018f97b9 | 26 | { |
PhilG1300 | 0:535e018f97b9 | 27 | _address = (address<<1); |
PhilG1300 | 0:535e018f97b9 | 28 | _device.frequency(100000); |
PhilG1300 | 0:535e018f97b9 | 29 | _Comdelay=70; |
PhilG1300 | 0:535e018f97b9 | 30 | } |
PhilG1300 | 0:535e018f97b9 | 31 | |
PhilG1300 | 0:535e018f97b9 | 32 | size_t DigoleSerialDisp::write(const char x) |
PhilG1300 | 0:535e018f97b9 | 33 | { |
PhilG1300 | 0:535e018f97b9 | 34 | _device.write(_address, (char *) &x, 1); |
PhilG1300 | 0:535e018f97b9 | 35 | _device.stop(); |
PhilG1300 | 0:535e018f97b9 | 36 | return 1; |
PhilG1300 | 0:535e018f97b9 | 37 | } |
PhilG1300 | 0:535e018f97b9 | 38 | |
PhilG1300 | 0:535e018f97b9 | 39 | size_t DigoleSerialDisp::write(const char *str) |
PhilG1300 | 0:535e018f97b9 | 40 | { |
PhilG1300 | 0:535e018f97b9 | 41 | if (str == NULL) return 0; |
PhilG1300 | 0:535e018f97b9 | 42 | return write(str, strlen(str)); |
PhilG1300 | 0:535e018f97b9 | 43 | } |
PhilG1300 | 0:535e018f97b9 | 44 | |
PhilG1300 | 0:535e018f97b9 | 45 | size_t DigoleSerialDisp::write(const char *buffer, size_t size) |
PhilG1300 | 0:535e018f97b9 | 46 | { |
PhilG1300 | 0:535e018f97b9 | 47 | int len = 0; |
PhilG1300 | 0:535e018f97b9 | 48 | if (buffer != NULL) { |
PhilG1300 | 0:535e018f97b9 | 49 | _device.write(_address, (char *) buffer, size); |
PhilG1300 | 0:535e018f97b9 | 50 | len = size; |
PhilG1300 | 0:535e018f97b9 | 51 | delay(7); |
PhilG1300 | 0:535e018f97b9 | 52 | _device.stop(); |
PhilG1300 | 0:535e018f97b9 | 53 | } |
PhilG1300 | 0:535e018f97b9 | 54 | return len; |
PhilG1300 | 0:535e018f97b9 | 55 | } |
PhilG1300 | 0:535e018f97b9 | 56 | |
PhilG1300 | 0:535e018f97b9 | 57 | |
PhilG1300 | 0:535e018f97b9 | 58 | size_t DigoleSerialDisp::print(const char c) |
PhilG1300 | 0:535e018f97b9 | 59 | { |
PhilG1300 | 0:535e018f97b9 | 60 | buf[0] = 'T'; |
PhilG1300 | 0:535e018f97b9 | 61 | buf[1] = 'T'; |
PhilG1300 | 0:535e018f97b9 | 62 | buf[2] = c; |
PhilG1300 | 0:535e018f97b9 | 63 | buf[3] = 0; |
PhilG1300 | 0:535e018f97b9 | 64 | write(buf); |
PhilG1300 | 0:535e018f97b9 | 65 | write(null); |
PhilG1300 | 0:535e018f97b9 | 66 | return 1; |
PhilG1300 | 0:535e018f97b9 | 67 | } |
PhilG1300 | 0:535e018f97b9 | 68 | |
PhilG1300 | 0:535e018f97b9 | 69 | size_t DigoleSerialDisp::print(const char s[]) |
PhilG1300 | 0:535e018f97b9 | 70 | { |
PhilG1300 | 0:535e018f97b9 | 71 | int len = strlen(s); |
PhilG1300 | 0:535e018f97b9 | 72 | |
PhilG1300 | 0:535e018f97b9 | 73 | if (s == NULL) return 0; |
PhilG1300 | 0:535e018f97b9 | 74 | |
PhilG1300 | 0:535e018f97b9 | 75 | buf[0] = 'T'; |
PhilG1300 | 0:535e018f97b9 | 76 | buf[1] = 'T'; |
PhilG1300 | 0:535e018f97b9 | 77 | buf[2] = 0; |
PhilG1300 | 0:535e018f97b9 | 78 | strncat(buf, s, 125); |
PhilG1300 | 0:535e018f97b9 | 79 | write(buf); |
PhilG1300 | 0:535e018f97b9 | 80 | write(null); |
PhilG1300 | 0:535e018f97b9 | 81 | return len; |
PhilG1300 | 0:535e018f97b9 | 82 | } |
PhilG1300 | 0:535e018f97b9 | 83 | |
PhilG1300 | 0:535e018f97b9 | 84 | size_t DigoleSerialDisp::println(const char s[]) |
PhilG1300 | 0:535e018f97b9 | 85 | { |
PhilG1300 | 0:535e018f97b9 | 86 | return print(s); |
PhilG1300 | 0:535e018f97b9 | 87 | } |
PhilG1300 | 0:535e018f97b9 | 88 | |
PhilG1300 | 0:535e018f97b9 | 89 | /* |
PhilG1300 | 0:535e018f97b9 | 90 | Print.cpp - Base class that provides print() and println() |
PhilG1300 | 0:535e018f97b9 | 91 | Copyright (c) 2008 David A. Mellis. All right reserved. |
PhilG1300 | 0:535e018f97b9 | 92 | |
PhilG1300 | 0:535e018f97b9 | 93 | This library is free software; you can redistribute it and/or |
PhilG1300 | 0:535e018f97b9 | 94 | modify it under the terms of the GNU Lesser General Public |
PhilG1300 | 0:535e018f97b9 | 95 | License as published by the Free Software Foundation; either |
PhilG1300 | 0:535e018f97b9 | 96 | version 2.1 of the License, or (at your option) any later version. |
PhilG1300 | 0:535e018f97b9 | 97 | |
PhilG1300 | 0:535e018f97b9 | 98 | This library is distributed in the hope that it will be useful, |
PhilG1300 | 0:535e018f97b9 | 99 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
PhilG1300 | 0:535e018f97b9 | 100 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
PhilG1300 | 0:535e018f97b9 | 101 | Lesser General Public License for more details. |
PhilG1300 | 0:535e018f97b9 | 102 | |
PhilG1300 | 0:535e018f97b9 | 103 | You should have received a copy of the GNU Lesser General Public |
PhilG1300 | 0:535e018f97b9 | 104 | License along with this library; if not, write to the Free Software |
PhilG1300 | 0:535e018f97b9 | 105 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
PhilG1300 | 0:535e018f97b9 | 106 | |
PhilG1300 | 0:535e018f97b9 | 107 | Modified 23 November 2006 by David A. Mellis |
PhilG1300 | 0:535e018f97b9 | 108 | */ |
PhilG1300 | 0:535e018f97b9 | 109 | |
PhilG1300 | 0:535e018f97b9 | 110 | size_t DigoleSerialDisp::print(unsigned char b, int base) |
PhilG1300 | 0:535e018f97b9 | 111 | { |
PhilG1300 | 0:535e018f97b9 | 112 | return print((unsigned long) b, base); |
PhilG1300 | 0:535e018f97b9 | 113 | } |
PhilG1300 | 0:535e018f97b9 | 114 | |
PhilG1300 | 0:535e018f97b9 | 115 | size_t DigoleSerialDisp::print(int n, int base) |
PhilG1300 | 0:535e018f97b9 | 116 | { |
PhilG1300 | 0:535e018f97b9 | 117 | return print((long) n, base); |
PhilG1300 | 0:535e018f97b9 | 118 | } |
PhilG1300 | 0:535e018f97b9 | 119 | |
PhilG1300 | 0:535e018f97b9 | 120 | size_t DigoleSerialDisp::print(unsigned int n, int base) |
PhilG1300 | 0:535e018f97b9 | 121 | { |
PhilG1300 | 0:535e018f97b9 | 122 | return print((unsigned long) n, base); |
PhilG1300 | 0:535e018f97b9 | 123 | } |
PhilG1300 | 0:535e018f97b9 | 124 | |
PhilG1300 | 0:535e018f97b9 | 125 | size_t DigoleSerialDisp::print(long n, int base) |
PhilG1300 | 0:535e018f97b9 | 126 | { |
PhilG1300 | 0:535e018f97b9 | 127 | if (base == 0) { |
PhilG1300 | 0:535e018f97b9 | 128 | return write(n); |
PhilG1300 | 0:535e018f97b9 | 129 | } else if (base == 10) { |
PhilG1300 | 0:535e018f97b9 | 130 | if (n < 0) { |
PhilG1300 | 0:535e018f97b9 | 131 | int t = print('-'); |
PhilG1300 | 0:535e018f97b9 | 132 | n = -n; |
PhilG1300 | 0:535e018f97b9 | 133 | return printNumber(n, 10) + t; |
PhilG1300 | 0:535e018f97b9 | 134 | } |
PhilG1300 | 0:535e018f97b9 | 135 | return printNumber(n, 10); |
PhilG1300 | 0:535e018f97b9 | 136 | } else { |
PhilG1300 | 0:535e018f97b9 | 137 | return printNumber(n, base); |
PhilG1300 | 0:535e018f97b9 | 138 | } |
PhilG1300 | 0:535e018f97b9 | 139 | } |
PhilG1300 | 0:535e018f97b9 | 140 | |
PhilG1300 | 0:535e018f97b9 | 141 | size_t DigoleSerialDisp::print(unsigned long n, int base) |
PhilG1300 | 0:535e018f97b9 | 142 | { |
PhilG1300 | 0:535e018f97b9 | 143 | if (base == 0) return write(n); |
PhilG1300 | 0:535e018f97b9 | 144 | else return printNumber(n, base); |
PhilG1300 | 0:535e018f97b9 | 145 | } |
PhilG1300 | 0:535e018f97b9 | 146 | |
PhilG1300 | 0:535e018f97b9 | 147 | size_t DigoleSerialDisp::print(double n, int digits) |
PhilG1300 | 0:535e018f97b9 | 148 | { |
PhilG1300 | 0:535e018f97b9 | 149 | return printFloat(n, digits); |
PhilG1300 | 0:535e018f97b9 | 150 | } |
PhilG1300 | 0:535e018f97b9 | 151 | |
PhilG1300 | 0:535e018f97b9 | 152 | size_t DigoleSerialDisp::println(unsigned char b, int base) |
PhilG1300 | 0:535e018f97b9 | 153 | { |
PhilG1300 | 0:535e018f97b9 | 154 | size_t n = print(b, base); |
PhilG1300 | 0:535e018f97b9 | 155 | n += println(); |
PhilG1300 | 0:535e018f97b9 | 156 | return n; |
PhilG1300 | 0:535e018f97b9 | 157 | } |
PhilG1300 | 0:535e018f97b9 | 158 | |
PhilG1300 | 0:535e018f97b9 | 159 | size_t DigoleSerialDisp::println(int num, int base) |
PhilG1300 | 0:535e018f97b9 | 160 | { |
PhilG1300 | 0:535e018f97b9 | 161 | size_t n = print(num, base); |
PhilG1300 | 0:535e018f97b9 | 162 | n += println(); |
PhilG1300 | 0:535e018f97b9 | 163 | return n; |
PhilG1300 | 0:535e018f97b9 | 164 | } |
PhilG1300 | 0:535e018f97b9 | 165 | |
PhilG1300 | 0:535e018f97b9 | 166 | size_t DigoleSerialDisp::println(unsigned int num, int base) |
PhilG1300 | 0:535e018f97b9 | 167 | { |
PhilG1300 | 0:535e018f97b9 | 168 | size_t n = print(num, base); |
PhilG1300 | 0:535e018f97b9 | 169 | n += println(); |
PhilG1300 | 0:535e018f97b9 | 170 | return n; |
PhilG1300 | 0:535e018f97b9 | 171 | } |
PhilG1300 | 0:535e018f97b9 | 172 | |
PhilG1300 | 0:535e018f97b9 | 173 | size_t DigoleSerialDisp::println(long num, int base) |
PhilG1300 | 0:535e018f97b9 | 174 | { |
PhilG1300 | 0:535e018f97b9 | 175 | size_t n = print(num, base); |
PhilG1300 | 0:535e018f97b9 | 176 | n += println(); |
PhilG1300 | 0:535e018f97b9 | 177 | return n; |
PhilG1300 | 0:535e018f97b9 | 178 | } |
PhilG1300 | 0:535e018f97b9 | 179 | |
PhilG1300 | 0:535e018f97b9 | 180 | size_t DigoleSerialDisp::println(unsigned long num, int base) |
PhilG1300 | 0:535e018f97b9 | 181 | { |
PhilG1300 | 0:535e018f97b9 | 182 | size_t n = print(num, base); |
PhilG1300 | 0:535e018f97b9 | 183 | n += println(); |
PhilG1300 | 0:535e018f97b9 | 184 | return n; |
PhilG1300 | 0:535e018f97b9 | 185 | } |
PhilG1300 | 0:535e018f97b9 | 186 | |
PhilG1300 | 0:535e018f97b9 | 187 | size_t DigoleSerialDisp::println(double num, int digits) |
PhilG1300 | 0:535e018f97b9 | 188 | { |
PhilG1300 | 0:535e018f97b9 | 189 | size_t n = print(num, digits); |
PhilG1300 | 0:535e018f97b9 | 190 | n += println(); |
PhilG1300 | 0:535e018f97b9 | 191 | return n; |
PhilG1300 | 0:535e018f97b9 | 192 | } |
PhilG1300 | 0:535e018f97b9 | 193 | |
PhilG1300 | 0:535e018f97b9 | 194 | size_t DigoleSerialDisp::println(void) |
PhilG1300 | 0:535e018f97b9 | 195 | { |
PhilG1300 | 0:535e018f97b9 | 196 | return 1; |
PhilG1300 | 0:535e018f97b9 | 197 | } |
PhilG1300 | 0:535e018f97b9 | 198 | |
PhilG1300 | 0:535e018f97b9 | 199 | // Private Methods ///////////////////////////////////////////////////////////// |
PhilG1300 | 0:535e018f97b9 | 200 | |
PhilG1300 | 0:535e018f97b9 | 201 | size_t DigoleSerialDisp::printNumber(unsigned long n, uint8_t base) { |
PhilG1300 | 0:535e018f97b9 | 202 | char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte. |
PhilG1300 | 0:535e018f97b9 | 203 | char *str = &buf[sizeof(buf) - 1]; |
PhilG1300 | 0:535e018f97b9 | 204 | |
PhilG1300 | 0:535e018f97b9 | 205 | *str = '\0'; |
PhilG1300 | 0:535e018f97b9 | 206 | |
PhilG1300 | 0:535e018f97b9 | 207 | // prevent crash if called with base == 1 |
PhilG1300 | 0:535e018f97b9 | 208 | if (base < 2) base = 10; |
PhilG1300 | 0:535e018f97b9 | 209 | |
PhilG1300 | 0:535e018f97b9 | 210 | do { |
PhilG1300 | 0:535e018f97b9 | 211 | unsigned long m = n; |
PhilG1300 | 0:535e018f97b9 | 212 | n /= base; |
PhilG1300 | 0:535e018f97b9 | 213 | char c = m - base * n; |
PhilG1300 | 0:535e018f97b9 | 214 | *--str = c < 10 ? c + '0' : c + 'A' - 10; |
PhilG1300 | 0:535e018f97b9 | 215 | } while(n); |
PhilG1300 | 0:535e018f97b9 | 216 | |
PhilG1300 | 0:535e018f97b9 | 217 | return write(str); |
PhilG1300 | 0:535e018f97b9 | 218 | } |
PhilG1300 | 0:535e018f97b9 | 219 | |
PhilG1300 | 0:535e018f97b9 | 220 | size_t DigoleSerialDisp::printFloat(double number, uint8_t digits) |
PhilG1300 | 0:535e018f97b9 | 221 | { |
PhilG1300 | 0:535e018f97b9 | 222 | size_t n = 0; |
PhilG1300 | 0:535e018f97b9 | 223 | |
PhilG1300 | 0:535e018f97b9 | 224 | if (isnan(number)) return print("nan"); |
PhilG1300 | 0:535e018f97b9 | 225 | if (isinf(number)) return print("inf"); |
PhilG1300 | 0:535e018f97b9 | 226 | if (number > 4294967040.0) return print ("ovf"); // constant determined empirically |
PhilG1300 | 0:535e018f97b9 | 227 | if (number <-4294967040.0) return print ("ovf"); // constant determined empirically |
PhilG1300 | 0:535e018f97b9 | 228 | |
PhilG1300 | 0:535e018f97b9 | 229 | // Handle negative numbers |
PhilG1300 | 0:535e018f97b9 | 230 | if (number < 0.0) |
PhilG1300 | 0:535e018f97b9 | 231 | { |
PhilG1300 | 0:535e018f97b9 | 232 | n += print('-'); |
PhilG1300 | 0:535e018f97b9 | 233 | number = -number; |
PhilG1300 | 0:535e018f97b9 | 234 | } |
PhilG1300 | 0:535e018f97b9 | 235 | |
PhilG1300 | 0:535e018f97b9 | 236 | // Round correctly so that print(1.999, 2) prints as "2.00" |
PhilG1300 | 0:535e018f97b9 | 237 | double rounding = 0.5; |
PhilG1300 | 0:535e018f97b9 | 238 | for (uint8_t i=0; i<digits; ++i) |
PhilG1300 | 0:535e018f97b9 | 239 | rounding /= 10.0; |
PhilG1300 | 0:535e018f97b9 | 240 | |
PhilG1300 | 0:535e018f97b9 | 241 | number += rounding; |
PhilG1300 | 0:535e018f97b9 | 242 | |
PhilG1300 | 0:535e018f97b9 | 243 | // Extract the integer part of the number and print it |
PhilG1300 | 0:535e018f97b9 | 244 | unsigned long int_part = (unsigned long)number; |
PhilG1300 | 0:535e018f97b9 | 245 | double remainder = number - (double)int_part; |
PhilG1300 | 0:535e018f97b9 | 246 | n += print(int_part); |
PhilG1300 | 0:535e018f97b9 | 247 | |
PhilG1300 | 0:535e018f97b9 | 248 | // Print the decimal point, but only if there are digits beyond |
PhilG1300 | 0:535e018f97b9 | 249 | if (digits > 0) { |
PhilG1300 | 0:535e018f97b9 | 250 | n += print("."); |
PhilG1300 | 0:535e018f97b9 | 251 | } |
PhilG1300 | 0:535e018f97b9 | 252 | |
PhilG1300 | 0:535e018f97b9 | 253 | // Extract digits from the remainder one at a time |
PhilG1300 | 0:535e018f97b9 | 254 | while (digits-- > 0) |
PhilG1300 | 0:535e018f97b9 | 255 | { |
PhilG1300 | 0:535e018f97b9 | 256 | remainder *= 10.0; |
PhilG1300 | 0:535e018f97b9 | 257 | int toPrint = int(remainder); |
PhilG1300 | 0:535e018f97b9 | 258 | n += print(toPrint); |
PhilG1300 | 0:535e018f97b9 | 259 | remainder -= toPrint; |
PhilG1300 | 0:535e018f97b9 | 260 | } |
PhilG1300 | 0:535e018f97b9 | 261 | |
PhilG1300 | 0:535e018f97b9 | 262 | return n; |
PhilG1300 | 0:535e018f97b9 | 263 | } |
PhilG1300 | 0:535e018f97b9 | 264 | |
PhilG1300 | 0:535e018f97b9 | 265 | /*---------functions for Text and Graphic LCD adapters---------*/ |
PhilG1300 | 0:535e018f97b9 | 266 | void DigoleSerialDisp::disableCursor(void) |
PhilG1300 | 0:535e018f97b9 | 267 | { |
PhilG1300 | 0:535e018f97b9 | 268 | write("CS"); |
PhilG1300 | 0:535e018f97b9 | 269 | write(null); |
PhilG1300 | 0:535e018f97b9 | 270 | } |
PhilG1300 | 0:535e018f97b9 | 271 | |
PhilG1300 | 0:535e018f97b9 | 272 | void DigoleSerialDisp::enableCursor(void) |
PhilG1300 | 0:535e018f97b9 | 273 | { |
PhilG1300 | 0:535e018f97b9 | 274 | write("CS"); |
PhilG1300 | 0:535e018f97b9 | 275 | write(1); |
PhilG1300 | 0:535e018f97b9 | 276 | } |
PhilG1300 | 0:535e018f97b9 | 277 | |
PhilG1300 | 0:535e018f97b9 | 278 | void DigoleSerialDisp::drawStr(uint8_t x, uint8_t y, const char *s) |
PhilG1300 | 0:535e018f97b9 | 279 | { |
PhilG1300 | 0:535e018f97b9 | 280 | write("TP"); |
PhilG1300 | 0:535e018f97b9 | 281 | write(x); |
PhilG1300 | 0:535e018f97b9 | 282 | write(y); |
PhilG1300 | 0:535e018f97b9 | 283 | write("TT"); |
PhilG1300 | 0:535e018f97b9 | 284 | write(s); |
PhilG1300 | 0:535e018f97b9 | 285 | write(null); |
PhilG1300 | 0:535e018f97b9 | 286 | } |
PhilG1300 | 0:535e018f97b9 | 287 | |
PhilG1300 | 0:535e018f97b9 | 288 | void DigoleSerialDisp::setPrintPos(uint8_t x, uint8_t y, uint8_t graph) |
PhilG1300 | 0:535e018f97b9 | 289 | { |
PhilG1300 | 0:535e018f97b9 | 290 | if (graph == _TEXT_) { |
PhilG1300 | 0:535e018f97b9 | 291 | write("TP"); |
PhilG1300 | 0:535e018f97b9 | 292 | write(x); |
PhilG1300 | 0:535e018f97b9 | 293 | write(y); |
PhilG1300 | 0:535e018f97b9 | 294 | } else { |
PhilG1300 | 0:535e018f97b9 | 295 | write("GP"); |
PhilG1300 | 0:535e018f97b9 | 296 | write(x); |
PhilG1300 | 0:535e018f97b9 | 297 | write(y); |
PhilG1300 | 0:535e018f97b9 | 298 | } |
PhilG1300 | 0:535e018f97b9 | 299 | } |
PhilG1300 | 0:535e018f97b9 | 300 | |
PhilG1300 | 0:535e018f97b9 | 301 | void DigoleSerialDisp::clearScreen(void) |
PhilG1300 | 0:535e018f97b9 | 302 | { |
PhilG1300 | 0:535e018f97b9 | 303 | //write(null); |
PhilG1300 | 0:535e018f97b9 | 304 | write("CL"); |
PhilG1300 | 0:535e018f97b9 | 305 | } |
PhilG1300 | 0:535e018f97b9 | 306 | |
PhilG1300 | 0:535e018f97b9 | 307 | void DigoleSerialDisp::setLCDColRow(uint8_t col, uint8_t row) |
PhilG1300 | 0:535e018f97b9 | 308 | { |
PhilG1300 | 0:535e018f97b9 | 309 | write("STCR"); |
PhilG1300 | 0:535e018f97b9 | 310 | write(col); |
PhilG1300 | 0:535e018f97b9 | 311 | write(row); |
PhilG1300 | 0:535e018f97b9 | 312 | write("\x80\xC0\x94\xD4"); |
PhilG1300 | 0:535e018f97b9 | 313 | } |
PhilG1300 | 0:535e018f97b9 | 314 | |
PhilG1300 | 0:535e018f97b9 | 315 | void DigoleSerialDisp::setI2CAddress(uint8_t add) |
PhilG1300 | 0:535e018f97b9 | 316 | { |
PhilG1300 | 0:535e018f97b9 | 317 | write("SI2CA"); |
PhilG1300 | 0:535e018f97b9 | 318 | write(add); |
PhilG1300 | 0:535e018f97b9 | 319 | _address = (add<<1); |
PhilG1300 | 0:535e018f97b9 | 320 | } |
PhilG1300 | 0:535e018f97b9 | 321 | |
PhilG1300 | 0:535e018f97b9 | 322 | void DigoleSerialDisp::displayConfig(uint8_t v) |
PhilG1300 | 0:535e018f97b9 | 323 | { |
PhilG1300 | 0:535e018f97b9 | 324 | write("DC"); |
PhilG1300 | 0:535e018f97b9 | 325 | write(v); |
PhilG1300 | 0:535e018f97b9 | 326 | } |
PhilG1300 | 0:535e018f97b9 | 327 | |
PhilG1300 | 0:535e018f97b9 | 328 | void DigoleSerialDisp::preprint(void) |
PhilG1300 | 0:535e018f97b9 | 329 | { |
PhilG1300 | 0:535e018f97b9 | 330 | //print("TT"); |
PhilG1300 | 0:535e018f97b9 | 331 | } |
PhilG1300 | 0:535e018f97b9 | 332 | |
PhilG1300 | 0:535e018f97b9 | 333 | /*----------Functions for Graphic LCD/OLED adapters only---------*/ |
PhilG1300 | 0:535e018f97b9 | 334 | void DigoleSerialDisp::drawBitmap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *bitmap) { |
PhilG1300 | 0:535e018f97b9 | 335 | uint8_t i = 0; |
PhilG1300 | 0:535e018f97b9 | 336 | if ((w & 7) != 0) |
PhilG1300 | 0:535e018f97b9 | 337 | i = 1; |
PhilG1300 | 0:535e018f97b9 | 338 | write("DIM"); |
PhilG1300 | 0:535e018f97b9 | 339 | write(x); //x; |
PhilG1300 | 0:535e018f97b9 | 340 | write(y); |
PhilG1300 | 0:535e018f97b9 | 341 | write(w); |
PhilG1300 | 0:535e018f97b9 | 342 | write(h); |
PhilG1300 | 0:535e018f97b9 | 343 | for (int j = 0; j < h * ((w >> 3) + i); j++) { |
PhilG1300 | 0:535e018f97b9 | 344 | write( (const char *) (bitmap+j) ); |
PhilG1300 | 0:535e018f97b9 | 345 | delay(1); |
PhilG1300 | 0:535e018f97b9 | 346 | } |
PhilG1300 | 0:535e018f97b9 | 347 | } |
PhilG1300 | 0:535e018f97b9 | 348 | |
PhilG1300 | 0:535e018f97b9 | 349 | void DigoleSerialDisp::setRot90(void) { |
PhilG1300 | 0:535e018f97b9 | 350 | write("SD1"); |
PhilG1300 | 0:535e018f97b9 | 351 | } |
PhilG1300 | 0:535e018f97b9 | 352 | |
PhilG1300 | 0:535e018f97b9 | 353 | void DigoleSerialDisp::setRot180(void) { |
PhilG1300 | 0:535e018f97b9 | 354 | write("SD2"); |
PhilG1300 | 0:535e018f97b9 | 355 | } |
PhilG1300 | 0:535e018f97b9 | 356 | |
PhilG1300 | 0:535e018f97b9 | 357 | void DigoleSerialDisp::setRot270(void) { |
PhilG1300 | 0:535e018f97b9 | 358 | write("SD3"); |
PhilG1300 | 0:535e018f97b9 | 359 | } |
PhilG1300 | 0:535e018f97b9 | 360 | |
PhilG1300 | 0:535e018f97b9 | 361 | void DigoleSerialDisp::undoRotation(void) { |
PhilG1300 | 0:535e018f97b9 | 362 | write("SD0"); |
PhilG1300 | 0:535e018f97b9 | 363 | } |
PhilG1300 | 0:535e018f97b9 | 364 | |
PhilG1300 | 0:535e018f97b9 | 365 | void DigoleSerialDisp::setRotation(uint8_t d) { |
PhilG1300 | 0:535e018f97b9 | 366 | write("SD"); |
PhilG1300 | 0:535e018f97b9 | 367 | write(d); |
PhilG1300 | 0:535e018f97b9 | 368 | } |
PhilG1300 | 0:535e018f97b9 | 369 | |
PhilG1300 | 0:535e018f97b9 | 370 | void DigoleSerialDisp::setContrast(uint8_t c) { |
PhilG1300 | 0:535e018f97b9 | 371 | write("CT"); |
PhilG1300 | 0:535e018f97b9 | 372 | write(c); |
PhilG1300 | 0:535e018f97b9 | 373 | } |
PhilG1300 | 0:535e018f97b9 | 374 | |
PhilG1300 | 0:535e018f97b9 | 375 | void DigoleSerialDisp::drawBox(uint8_t x, uint8_t y, uint8_t w, uint8_t h) { |
PhilG1300 | 0:535e018f97b9 | 376 | write("FR"); |
PhilG1300 | 0:535e018f97b9 | 377 | write(x); |
PhilG1300 | 0:535e018f97b9 | 378 | write(y); |
PhilG1300 | 0:535e018f97b9 | 379 | write(x + w); |
PhilG1300 | 0:535e018f97b9 | 380 | write(y + h); |
PhilG1300 | 0:535e018f97b9 | 381 | } |
PhilG1300 | 0:535e018f97b9 | 382 | |
PhilG1300 | 0:535e018f97b9 | 383 | void DigoleSerialDisp::drawCircle(uint8_t x, uint8_t y, uint8_t r, uint8_t f) { |
PhilG1300 | 0:535e018f97b9 | 384 | write("CC"); |
PhilG1300 | 0:535e018f97b9 | 385 | write(x); |
PhilG1300 | 0:535e018f97b9 | 386 | write(y); |
PhilG1300 | 0:535e018f97b9 | 387 | write(r); |
PhilG1300 | 0:535e018f97b9 | 388 | write(f); |
PhilG1300 | 0:535e018f97b9 | 389 | } |
PhilG1300 | 0:535e018f97b9 | 390 | |
PhilG1300 | 0:535e018f97b9 | 391 | void DigoleSerialDisp::drawDisc(uint8_t x, uint8_t y, uint8_t r) { |
PhilG1300 | 0:535e018f97b9 | 392 | drawCircle(x, y, r, 1); |
PhilG1300 | 0:535e018f97b9 | 393 | } |
PhilG1300 | 0:535e018f97b9 | 394 | |
PhilG1300 | 0:535e018f97b9 | 395 | void DigoleSerialDisp::drawFrame(uint8_t x, uint8_t y, uint8_t w, uint8_t h) { |
PhilG1300 | 0:535e018f97b9 | 396 | write("DR"); |
PhilG1300 | 0:535e018f97b9 | 397 | write(x); |
PhilG1300 | 0:535e018f97b9 | 398 | write(y); |
PhilG1300 | 0:535e018f97b9 | 399 | write(x + w); |
PhilG1300 | 0:535e018f97b9 | 400 | write(y + h); |
PhilG1300 | 0:535e018f97b9 | 401 | } |
PhilG1300 | 0:535e018f97b9 | 402 | |
PhilG1300 | 0:535e018f97b9 | 403 | void DigoleSerialDisp::drawPixel(uint8_t x, uint8_t y, uint8_t color) { |
PhilG1300 | 0:535e018f97b9 | 404 | write("DP"); |
PhilG1300 | 0:535e018f97b9 | 405 | write(x); |
PhilG1300 | 0:535e018f97b9 | 406 | write(y); |
PhilG1300 | 0:535e018f97b9 | 407 | write(color); |
PhilG1300 | 0:535e018f97b9 | 408 | } |
PhilG1300 | 0:535e018f97b9 | 409 | |
PhilG1300 | 0:535e018f97b9 | 410 | void DigoleSerialDisp::drawLine(uint8_t x, uint8_t y, uint8_t x1, uint8_t y1) { |
PhilG1300 | 0:535e018f97b9 | 411 | write("LN"); |
PhilG1300 | 0:535e018f97b9 | 412 | write(x); |
PhilG1300 | 0:535e018f97b9 | 413 | write(y); |
PhilG1300 | 0:535e018f97b9 | 414 | write(x1); |
PhilG1300 | 0:535e018f97b9 | 415 | write(y1); |
PhilG1300 | 0:535e018f97b9 | 416 | } |
PhilG1300 | 0:535e018f97b9 | 417 | |
PhilG1300 | 0:535e018f97b9 | 418 | void DigoleSerialDisp::drawLineTo(uint8_t x, uint8_t y) { |
PhilG1300 | 0:535e018f97b9 | 419 | write("LT"); |
PhilG1300 | 0:535e018f97b9 | 420 | write(x); |
PhilG1300 | 0:535e018f97b9 | 421 | write(y); |
PhilG1300 | 0:535e018f97b9 | 422 | } |
PhilG1300 | 0:535e018f97b9 | 423 | |
PhilG1300 | 0:535e018f97b9 | 424 | void DigoleSerialDisp::drawHLine(uint8_t x, uint8_t y, uint8_t w) { |
PhilG1300 | 0:535e018f97b9 | 425 | drawLine(x, y, x + w, y); |
PhilG1300 | 0:535e018f97b9 | 426 | } |
PhilG1300 | 0:535e018f97b9 | 427 | |
PhilG1300 | 0:535e018f97b9 | 428 | void DigoleSerialDisp::drawVLine(uint8_t x, uint8_t y, uint8_t h) { |
PhilG1300 | 0:535e018f97b9 | 429 | drawLine(x, y, x, y + h); |
PhilG1300 | 0:535e018f97b9 | 430 | } |
PhilG1300 | 0:535e018f97b9 | 431 | |
PhilG1300 | 0:535e018f97b9 | 432 | void DigoleSerialDisp::nextTextLine(void) { |
PhilG1300 | 0:535e018f97b9 | 433 | write(null); |
PhilG1300 | 0:535e018f97b9 | 434 | write("TRT"); |
PhilG1300 | 0:535e018f97b9 | 435 | } |
PhilG1300 | 0:535e018f97b9 | 436 | |
PhilG1300 | 0:535e018f97b9 | 437 | void DigoleSerialDisp::setFont(uint8_t font) { |
PhilG1300 | 0:535e018f97b9 | 438 | write("SF"); |
PhilG1300 | 0:535e018f97b9 | 439 | write(font); |
PhilG1300 | 0:535e018f97b9 | 440 | } |
PhilG1300 | 0:535e018f97b9 | 441 | |
PhilG1300 | 0:535e018f97b9 | 442 | void DigoleSerialDisp::setColor(uint8_t color) { |
PhilG1300 | 0:535e018f97b9 | 443 | write("SC"); |
PhilG1300 | 0:535e018f97b9 | 444 | write(color); |
PhilG1300 | 0:535e018f97b9 | 445 | } |
PhilG1300 | 0:535e018f97b9 | 446 | |
PhilG1300 | 0:535e018f97b9 | 447 | void DigoleSerialDisp::backLightOn(void) { |
PhilG1300 | 0:535e018f97b9 | 448 | write("BL"); |
PhilG1300 | 0:535e018f97b9 | 449 | write(1); |
PhilG1300 | 0:535e018f97b9 | 450 | } |
PhilG1300 | 0:535e018f97b9 | 451 | |
PhilG1300 | 0:535e018f97b9 | 452 | void DigoleSerialDisp::backLightOff(void) { |
PhilG1300 | 0:535e018f97b9 | 453 | write("BL"); |
PhilG1300 | 0:535e018f97b9 | 454 | write(null); |
PhilG1300 | 0:535e018f97b9 | 455 | } |
PhilG1300 | 0:535e018f97b9 | 456 | |
PhilG1300 | 0:535e018f97b9 | 457 | void DigoleSerialDisp::directCommand(uint8_t d) { |
PhilG1300 | 0:535e018f97b9 | 458 | write("MCD"); |
PhilG1300 | 0:535e018f97b9 | 459 | write(d); |
PhilG1300 | 0:535e018f97b9 | 460 | } |
PhilG1300 | 0:535e018f97b9 | 461 | |
PhilG1300 | 0:535e018f97b9 | 462 | void DigoleSerialDisp::directData(uint8_t d) { |
PhilG1300 | 0:535e018f97b9 | 463 | write("MDT"); |
PhilG1300 | 0:535e018f97b9 | 464 | write(d); |
PhilG1300 | 0:535e018f97b9 | 465 | } |
PhilG1300 | 0:535e018f97b9 | 466 | |
PhilG1300 | 0:535e018f97b9 | 467 | void DigoleSerialDisp::moveArea(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, char xoffset, char yoffset) { |
PhilG1300 | 0:535e018f97b9 | 468 | write("MA"); |
PhilG1300 | 0:535e018f97b9 | 469 | write(x0); |
PhilG1300 | 0:535e018f97b9 | 470 | write(y0); |
PhilG1300 | 0:535e018f97b9 | 471 | write(x1); |
PhilG1300 | 0:535e018f97b9 | 472 | write(y1); |
PhilG1300 | 0:535e018f97b9 | 473 | write(xoffset); |
PhilG1300 | 0:535e018f97b9 | 474 | write(yoffset); |
PhilG1300 | 0:535e018f97b9 | 475 | } |
PhilG1300 | 0:535e018f97b9 | 476 | |
PhilG1300 | 0:535e018f97b9 | 477 | |
PhilG1300 | 0:535e018f97b9 | 478 | void DigoleSerialDisp::displayStartScreen(uint8_t m) { |
PhilG1300 | 0:535e018f97b9 | 479 | write("DSS"); |
PhilG1300 | 0:535e018f97b9 | 480 | write(m); |
PhilG1300 | 0:535e018f97b9 | 481 | } //display start screen |
PhilG1300 | 0:535e018f97b9 | 482 | |
PhilG1300 | 0:535e018f97b9 | 483 | |
PhilG1300 | 0:535e018f97b9 | 484 | void DigoleSerialDisp::setMode(uint8_t m) { |
PhilG1300 | 0:535e018f97b9 | 485 | write("DM"); |
PhilG1300 | 0:535e018f97b9 | 486 | write(m); |
PhilG1300 | 0:535e018f97b9 | 487 | } //set display mode |
PhilG1300 | 0:535e018f97b9 | 488 | |
PhilG1300 | 0:535e018f97b9 | 489 | |
PhilG1300 | 0:535e018f97b9 | 490 | void DigoleSerialDisp::setTextPosBack(void) { |
PhilG1300 | 0:535e018f97b9 | 491 | write("ETB"); |
PhilG1300 | 0:535e018f97b9 | 492 | } //set text position back to previous, only one back allowed |
PhilG1300 | 0:535e018f97b9 | 493 | |
PhilG1300 | 0:535e018f97b9 | 494 | |
PhilG1300 | 0:535e018f97b9 | 495 | void DigoleSerialDisp::setTextPosOffset(char xoffset, char yoffset) { |
PhilG1300 | 0:535e018f97b9 | 496 | write("ETO"); |
PhilG1300 | 0:535e018f97b9 | 497 | write(xoffset); |
PhilG1300 | 0:535e018f97b9 | 498 | write(yoffset); |
PhilG1300 | 0:535e018f97b9 | 499 | } |
PhilG1300 | 0:535e018f97b9 | 500 | |
PhilG1300 | 0:535e018f97b9 | 501 | |
PhilG1300 | 0:535e018f97b9 | 502 | void DigoleSerialDisp::setTextPosAbs(uint8_t x, uint8_t y) { |
PhilG1300 | 0:535e018f97b9 | 503 | write("ETP"); |
PhilG1300 | 0:535e018f97b9 | 504 | write(x); |
PhilG1300 | 0:535e018f97b9 | 505 | write(y); |
PhilG1300 | 0:535e018f97b9 | 506 | } |
PhilG1300 | 0:535e018f97b9 | 507 | |
PhilG1300 | 0:535e018f97b9 | 508 | |
PhilG1300 | 0:535e018f97b9 | 509 | void DigoleSerialDisp::setLinePattern(uint8_t pattern) { |
PhilG1300 | 0:535e018f97b9 | 510 | write("SLP"); |
PhilG1300 | 0:535e018f97b9 | 511 | write(pattern); |
PhilG1300 | 0:535e018f97b9 | 512 | } |
PhilG1300 | 0:535e018f97b9 | 513 | |
PhilG1300 | 0:535e018f97b9 | 514 | |
PhilG1300 | 0:535e018f97b9 | 515 | void DigoleSerialDisp::setLCDChip(uint8_t chip) { //only for universal LCD adapter |
PhilG1300 | 0:535e018f97b9 | 516 | write("SLCD"); |
PhilG1300 | 0:535e018f97b9 | 517 | write(chip); |
PhilG1300 | 0:535e018f97b9 | 518 | } |
PhilG1300 | 0:535e018f97b9 | 519 | |
PhilG1300 | 0:535e018f97b9 | 520 | |
PhilG1300 | 0:535e018f97b9 | 521 | void DigoleSerialDisp::uploadStartScreen(int lon, const unsigned char *data) |
PhilG1300 | 0:535e018f97b9 | 522 | { |
PhilG1300 | 0:535e018f97b9 | 523 | int j; |
PhilG1300 | 0:535e018f97b9 | 524 | uint8_t c; |
PhilG1300 | 0:535e018f97b9 | 525 | write("SSS"); |
PhilG1300 | 0:535e018f97b9 | 526 | write((uint8_t) (lon % 256)); |
PhilG1300 | 0:535e018f97b9 | 527 | write((uint8_t) (lon / 256)); |
PhilG1300 | 0:535e018f97b9 | 528 | for (j = 0; j < lon;j++) { |
PhilG1300 | 0:535e018f97b9 | 529 | if((j%32)==0) |
PhilG1300 | 0:535e018f97b9 | 530 | delay(10); |
PhilG1300 | 0:535e018f97b9 | 531 | delay(_Comdelay); |
PhilG1300 | 0:535e018f97b9 | 532 | c = data[j]; |
PhilG1300 | 0:535e018f97b9 | 533 | write(c); |
PhilG1300 | 0:535e018f97b9 | 534 | } |
PhilG1300 | 0:535e018f97b9 | 535 | } |
PhilG1300 | 0:535e018f97b9 | 536 | |
PhilG1300 | 0:535e018f97b9 | 537 | |
PhilG1300 | 0:535e018f97b9 | 538 | void DigoleSerialDisp::uploadUserFont(int lon, const unsigned char *data, uint8_t sect) { |
PhilG1300 | 0:535e018f97b9 | 539 | uint8_t c; |
PhilG1300 | 0:535e018f97b9 | 540 | write("SUF"); |
PhilG1300 | 0:535e018f97b9 | 541 | write(sect); |
PhilG1300 | 0:535e018f97b9 | 542 | write((uint8_t) (lon % 256)); |
PhilG1300 | 0:535e018f97b9 | 543 | write((uint8_t) (lon / 256)); |
PhilG1300 | 0:535e018f97b9 | 544 | for (int j = 0; j < lon; j++) { |
PhilG1300 | 0:535e018f97b9 | 545 | if((j%32)==0) |
PhilG1300 | 0:535e018f97b9 | 546 | delay(10); |
PhilG1300 | 0:535e018f97b9 | 547 | delay(_Comdelay); |
PhilG1300 | 0:535e018f97b9 | 548 | c = data[j]; |
PhilG1300 | 0:535e018f97b9 | 549 | write(c); |
PhilG1300 | 0:535e018f97b9 | 550 | } |
PhilG1300 | 0:535e018f97b9 | 551 | } |
PhilG1300 | 0:535e018f97b9 | 552 | |
PhilG1300 | 0:535e018f97b9 | 553 | void DigoleSerialDisp::digitalOutput(uint8_t x) |
PhilG1300 | 0:535e018f97b9 | 554 | { |
PhilG1300 | 0:535e018f97b9 | 555 | write("DOUT"); |
PhilG1300 | 0:535e018f97b9 | 556 | write(x); |
PhilG1300 | 0:535e018f97b9 | 557 | } |