Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
lcd.cpp
00001 #include "cisme.h" 00002 #include "lcd.h" 00003 #include "debug.h" 00004 #include "keys.h" 00005 00006 #ifdef USE_LCD 00007 00008 #define LCD_CMD_LEN 40 00009 #define LCD_MAX_ROW 7 00010 #define LCD_VALUE_MAX_RANK 5 00011 #define NUMBER_TO_ASCII(val) (val + 0x30) 00012 00013 #define SOH 0x01 00014 #define ETX 0x03 00015 00016 static Serial lcdComm(p13, p14); 00017 00018 static void convertToHexStr(unsigned char value, char* dst) 00019 { 00020 static const char map[] = "0123456789abcdef"; 00021 dst[0] = map[(value / 16)]; 00022 dst[1] = map[(value % 16)]; 00023 } 00024 00025 static void lcdCallback(void) 00026 { 00027 keyEvent(lcdComm.getc()); 00028 } 00029 00030 static unsigned char lcdValueRank(unsigned long value) 00031 { 00032 unsigned char rank = 1; 00033 for (unsigned long rankIx = 10; (value / rankIx) != 0; rankIx *= 10, rank++); 00034 return rank; 00035 } 00036 00037 static void lcdValueDiscardHighestRank(unsigned long* value) 00038 { 00039 unsigned char rank = lcdValueRank(*value); 00040 unsigned long divider = 1; 00041 00042 for (; rank != 1; rank--) { 00043 divider *= 10; 00044 } 00045 00046 *value %= divider; 00047 } 00048 00049 void lcdInit(void) 00050 { 00051 // Set the baud rate for the LCD 00052 lcdComm.baud(9600); 00053 // Set the serial parameters for the LCD 00054 lcdComm.format(8, Serial::None, 1); 00055 lcdComm.attach(lcdCallback, Serial::RxIrq); 00056 } 00057 00058 void lcdClear(void) 00059 { 00060 lcdComm.attach(NULL); 00061 lcdComm.printf("%cCFF007F%c", SOH, ETX); 00062 lcdComm.attach(lcdCallback, Serial::RxIrq); 00063 } 00064 00065 void lcdClearLine(unsigned char row) 00066 { 00067 static const unsigned char line[] = {1, 2, 4, 8, 16, 32, 64, 128}; 00068 static char cmd[2]; //needed only for hex representation of line 00069 00070 if (row > LCD_MAX_ROW) { 00071 ERROR("Too big row number. Received: %u, maximum is %u", row, LCD_MAX_ROW); 00072 return; 00073 } 00074 00075 convertToHexStr(line[row], cmd); 00076 00077 lcdComm.attach(NULL); 00078 lcdComm.printf("%cC%s007F%c", SOH, cmd, ETX); 00079 lcdComm.attach(lcdCallback, Serial::RxIrq); 00080 } 00081 00082 #define LCD_CMD_COUNT_MGMT_BYTES 11 00083 00084 void lcdWrite(unsigned char row, unsigned char col, Justification just, const char* format, ...) 00085 { 00086 static char cmd[LCD_CMD_LEN]; 00087 static const unsigned char line[] = {1, 2, 4, 8, 16, 32, 64, 128}; 00088 static char txt[LCD_CMD_LEN - LCD_CMD_COUNT_MGMT_BYTES] = {0}; 00089 va_list params; 00090 int charactersWritten; 00091 00092 if (row > LCD_MAX_ROW) { 00093 ERROR("Too big row number. Received: %u, maximum is %u", row, LCD_MAX_ROW); 00094 return; 00095 } 00096 00097 va_start(params, format); 00098 00099 charactersWritten = vsnprintf(txt, LCD_CMD_LEN - LCD_CMD_COUNT_MGMT_BYTES, format, params); 00100 00101 va_end(params); 00102 00103 /* 00104 * The return value is more than possible count of characters. 00105 * (excluding terminating NULL byte) 00106 * According to the man page, this means that output was truncated. 00107 */ 00108 if (charactersWritten >= LCD_CMD_LEN - LCD_CMD_COUNT_MGMT_BYTES) 00109 { 00110 ERROR("Too big text length. textLength is %u max length is %u", charactersWritten, LCD_CMD_LEN - LCD_CMD_COUNT_MGMT_BYTES - 1); 00111 return; 00112 } 00113 00114 unsigned char cmdIx = 0; 00115 cmd[cmdIx++] = 1; // SOH Byte 00116 cmd[cmdIx++] = 'P'; // Print Command 00117 convertToHexStr(line[row], cmd + cmdIx); // Row 00118 cmdIx += 2; 00119 convertToHexStr(col * 6, cmd + cmdIx); // Column 00120 cmdIx += 2; 00121 cmd[cmdIx++] = '0'; // Font - Single Line 5x7 Char 00122 cmd[cmdIx++] = '1'; // Type - Black Chars on White Background 00123 cmd[cmdIx++] = NUMBER_TO_ASCII(just); // Justification 00124 00125 // Add message text to command string 00126 size_t txtLen = strlen(txt); 00127 memcpy(cmd + cmdIx, txt, txtLen); 00128 cmdIx += txtLen; 00129 00130 cmd[cmdIx++] = ' '; 00131 // Add ETX Character to End of Command String 00132 cmd[cmdIx++] = 3; 00133 00134 lcdComm.attach(NULL); 00135 lcdComm.printf("%s\n", cmd); 00136 lcdComm.attach(lcdCallback, Serial::RxIrq); 00137 } 00138 00139 unsigned long lcdGetParam(unsigned long min, unsigned long max, unsigned char row, unsigned char col) 00140 { 00141 Key key = KEY_NONE; 00142 unsigned long value = 0; 00143 unsigned char maxRank = lcdValueRank(max); 00144 char valueStr[LCD_VALUE_MAX_RANK + 1]; 00145 00146 while (key != KEY_HASH || value > max || value < min) { 00147 unsigned char strOffset = maxRank - lcdValueRank(value); 00148 memset(valueStr, '0', LCD_VALUE_MAX_RANK); 00149 sprintf(valueStr + strOffset, "%u", value); 00150 lcdWrite(row, col, JUSTIFICATION_ABSOLUTE, valueStr); 00151 00152 key = keyWait(); 00153 if (key == KEY_ASTERISK) { // backspace 00154 value /= 10; 00155 } 00156 else if (key <= KEY_NINE) { // numeric values 00157 if (lcdValueRank(value) == maxRank) { 00158 lcdValueDiscardHighestRank(&value); 00159 } 00160 value = value * 10 + key; 00161 } 00162 } 00163 00164 return value; 00165 } 00166 00167 #endif // USE_LCD
Generated on Tue Sep 27 2022 18:47:00 by
1.7.2