My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

lcdprint_hd44780.cpp 31KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091
  1. /**
  2. * @file lcdprint_hd44780.c
  3. * @brief LCD print api for HD44780
  4. * @author Yunhui Fu (yhfudev@gmail.com)
  5. * @version 1.0
  6. * @date 2016-08-19
  7. * @copyright GPL/BSD
  8. */
  9. /**
  10. * Due to the limitation of the HD44780 hardware, the current available LCD modules can only support
  11. * Western(English), Cyrillic(Russian), Kana(Japanese) charsets.
  12. */
  13. #include "../inc/MarlinConfigPre.h"
  14. #include "../inc/MarlinConfig.h"
  15. #if ENABLED(ULTRA_LCD)
  16. #include "ultralcd.h"
  17. #include "../Marlin.h"
  18. #if DISABLED(DOGLCD)
  19. #include <string.h>
  20. #include "fontutils.h"
  21. #include "lcdprint.h"
  22. #if defined(ARDUINO)
  23. #include "ultralcd_common_HD44780.h"
  24. #ifndef LCD_CLASS
  25. #include <LiquidCrystal.h>
  26. #define LCD_CLASS LiquidCrystal
  27. #endif
  28. extern LCD_CLASS lcd;
  29. LCD_CLASS *plcd = &lcd;
  30. #define _lcd_write(a) plcd->write(a)
  31. #define _lcd_setcursor(col, row) plcd->setCursor((col), (row));
  32. #else
  33. #define _lcd_write(a) TRACE("Write LCD: %c (%d)", (a), (int)(a));
  34. #define _lcd_setcursor(col, row) TRACE("Set cursor LCD: (%d,%d)", (col), (row));
  35. #endif
  36. int lcd_glyph_height(void) { return 1; }
  37. ////////////////////////////////////////////////////////////
  38. typedef struct _hd44780_charmap_t {
  39. wchar_t uchar; // the unicode char
  40. uint8_t idx; // the glyph of the char in the ROM
  41. uint8_t idx2; // the char used to be combined with the idx to simulate a single char
  42. } hd44780_charmap_t;
  43. #if defined(__AVR__)
  44. #define IV(a) U##a
  45. #else
  46. #define IV(a) L##a
  47. #endif
  48. static const hd44780_charmap_t g_hd44780_charmap_device[] PROGMEM = {
  49. // sorted by uchar:
  50. #if DISPLAY_CHARSET_HD44780 == JAPANESE
  51. {IV('¢'), 0xEC, 0}, // A2
  52. {IV('°'), 0xDF, 0}, // B0, Marlin special: '°' LCD_STR_DEGREE (0x09)
  53. {IV('ä'), 0xE1, 0}, // E4
  54. {IV('ö'), 0xEF, 0}, // F6
  55. {IV('÷'), 0xFD, 0}, // 00F7
  56. {IV('ü'), 0xF5, 0}, // 00FC
  57. {IV('ˣ'), 0xEB, 0}, // 02E3
  58. {IV('·'), 0xA5, 0}, // 0387
  59. {IV('Ώ'), 0xF4, 0}, // 038F
  60. {IV('Θ'), 0xF2, 0}, // 0398, Theta
  61. {IV('Ξ'), 0xE3, 0}, // 039E, Xi
  62. {IV('Σ'), 0xF6, 0}, // 03A3, Sigma
  63. {IV('Ω'), 0xF4, 0}, // 03A9, Omega
  64. {IV('ά'), 0xE0, 0}, // 03AC
  65. {IV('έ'), 0xE3, 0}, // 03AD
  66. {IV('α'), 0xE0, 0}, // 03B1, alpha
  67. {IV('β'), 0xE2, 0}, // 03B2, beta
  68. {IV('ε'), 0xE3, 0}, // 03B5, epsilon
  69. {IV('θ'), 0xF2, 0}, // 03B8, theta
  70. {IV('μ'), 0xE4, 0}, // 03BC, mu
  71. {IV('ξ'), 0xE3, 0}, // 03BE, xi
  72. {IV('π'), 0xF7, 0}, // 03C0, pi
  73. {IV('ρ'), 0xE6, 0}, // 03C1, rho
  74. {IV('σ'), 0xE5, 0}, // 03C3, sigma
  75. {IV('←'), 0x7F, 0}, // 2190
  76. {IV('→'), 0x7E, 0}, // 2192, Marlin special: '⮈⮉⮊⮋➤→' LCD_STR_ARROW_RIGHT (0x03)
  77. {IV('√'), 0xE8, 0}, // 221A
  78. {IV('∞'), 0xF3, 0}, // 221E
  79. {IV('█'), 0xFF, 0}, // 2588
  80. //{IV(''), 0xA0, 0},
  81. {IV('。'), 0xA1, 0},
  82. {IV('「'), 0xA2, 0},
  83. {IV('」'), 0xA3, 0},
  84. {IV('゛'), 0xDE, 0}, // ‶
  85. {IV('゜'), 0xDF, 0}, // '〫'
  86. {IV('゠'), '=', 0},
  87. {IV('ァ'), 0xA7, 0},
  88. {IV('ア'), 0xB1, 0},
  89. {IV('ィ'), 0xA8, 0},
  90. {IV('イ'), 0xB2, 0},
  91. {IV('ゥ'), 0xA9, 0},
  92. {IV('ウ'), 0xB3, 0},
  93. {IV('ェ'), 0xAA, 0},
  94. {IV('エ'), 0xB4, 0},
  95. {IV('ォ'), 0xAB, 0},
  96. {IV('オ'), 0xB5, 0},
  97. {IV('カ'), 0xB6, 0},
  98. {IV('ガ'), 0xB6, 0xDE},
  99. {IV('キ'), 0xB7, 0},
  100. {IV('ギ'), 0xB7, 0xDE}, //
  101. {IV('ク'), 0xB8, 0},
  102. {IV('グ'), 0xB8, 0xDE},
  103. {IV('ケ'), 0xB9, 0},
  104. {IV('ゲ'), 0xB9, 0xDE},
  105. {IV('コ'), 0xBA, 0},
  106. {IV('ゴ'), 0xBA, 0xDE},
  107. {IV('サ'), 0xBB, 0},
  108. {IV('ザ'), 0xBB, 0xDE},
  109. {IV('シ'), 0xBC, 0},
  110. {IV('ジ'), 0xBC, 0xDE},
  111. {IV('ス'), 0xBD, 0},
  112. {IV('ズ'), 0xBD, 0xDE},
  113. {IV('セ'), 0xBE, 0},
  114. {IV('ゼ'), 0xBE, 0xDE},
  115. {IV('ソ'), 0xBF, 0},
  116. {IV('ゾ'), 0xBF, 0xDE},
  117. {IV('タ'), 0xC0, 0},
  118. {IV('ダ'), 0xC0, 0xDE},
  119. {IV('チ'), 0xC1, 0},
  120. {IV('ヂ'), 0xC1, 0xDE},
  121. {IV('ッ'), 0xAF, 0},
  122. {IV('ツ'), 0xC2, 0},
  123. {IV('ヅ'), 0xC2, 0xDE},
  124. {IV('テ'), 0xC3, 0},
  125. {IV('デ'), 0xC3, 0xDE},
  126. {IV('ト'), 0xC4, 0},
  127. {IV('ド'), 0xC4, 0xDE},
  128. {IV('ナ'), 0xC5, 0},
  129. {IV('ニ'), 0xC6, 0},
  130. {IV('ヌ'), 0xC7, 0},
  131. {IV('ネ'), 0xC8, 0},
  132. {IV('ノ'), 0xC9, 0},
  133. {IV('ハ'), 0xCA, 0},
  134. {IV('バ'), 0xCA, 0xDE},
  135. {IV('パ'), 0xCA, 0xDF},
  136. {IV('ヒ'), 0xCB, 0},
  137. {IV('ビ'), 0xCB, 0xDE},
  138. {IV('ピ'), 0xCB, 0xDF},
  139. {IV('フ'), 0xCC, 0},
  140. {IV('ブ'), 0xCC, 0xDE},
  141. {IV('プ'), 0xCC, 0xDF},
  142. {IV('ヘ'), 0xCD, 0},
  143. {IV('ベ'), 0xCD, 0xDE},
  144. {IV('ペ'), 0xCD, 0xDF},
  145. {IV('ホ'), 0xCE, 0},
  146. {IV('ボ'), 0xCE, 0xDE},
  147. {IV('ポ'), 0xCE, 0xDF},
  148. {IV('マ'), 0xCF, 0},
  149. {IV('ミ'), 0xD0, 0},
  150. {IV('ム'), 0xD1, 0},
  151. {IV('メ'), 0xD2, 0},
  152. {IV('モ'), 0xD3, 0},
  153. {IV('ャ'), 0xAC, 0},
  154. {IV('ヤ'), 0xD4, 0},
  155. {IV('ュ'), 0xAD, 0},
  156. {IV('ユ'), 0xD5, 0},
  157. {IV('ョ'), 0xAE, 0},
  158. {IV('ヨ'), 0xD6, 0},
  159. {IV('ラ'), 0xD7, 0},
  160. {IV('リ'), 0xD8, 0},
  161. {IV('ル'), 0xD9, 0},
  162. {IV('レ'), 0xDA, 0},
  163. {IV('ロ'), 0xDB, 0},
  164. {IV('ワ'), 0xDC, 0},
  165. {IV('ヲ'), 0xA6, 0},
  166. {IV('ン'), 0xDD, 0},
  167. {IV('ヴ'), 0xB3, 0xDE},
  168. {IV('ヷ'), 0xDC, 0xDE},
  169. {IV('ヺ'), 0xA6, 0xDE},
  170. {IV('・'), 0xA5, 0},
  171. {IV('ー'), 0xB0, 0},
  172. {IV('ヽ'), 0xA4, 0},
  173. //{IV('g'), 0xE7, 0}, // error
  174. //{IV(''), 0xE9, 0},
  175. //{IV('j'), 0xEA, 0}, // error
  176. //{IV(''), 0xED, 0},
  177. //{IV(''), 0xEE, 0},
  178. //{IV('p'), 0xF0, 0}, // error
  179. //{IV('q'), 0xF1, 0}, // error
  180. //{IV(''), 0xF8, 0},
  181. //{IV('y'), 0xF9, 0}, // error
  182. {IV('万'), 0xFB, 0},
  183. {IV('円'), 0xFC, 0},
  184. {IV('千'), 0xFA, 0},
  185. //{IV(''), 0xFE, 0},
  186. //、・ヲァィゥェォャュョッー
  187. {IV('、'), 0xA4, 0}, //ヽ
  188. {IV('・'), 0xA5, 0}, //・
  189. {IV('ヲ'), 0xA6, 0}, //ヲ
  190. {IV('ァ'), 0xA7, 0}, //ァ
  191. {IV('ィ'), 0xA8, 0}, //ィ
  192. {IV('ゥ'), 0xA9, 0}, //ゥ
  193. {IV('ェ'), 0xAA, 0}, //ェ
  194. {IV('ォ'), 0xAB, 0}, //ォ
  195. {IV('ャ'), 0xAC, 0}, //ャ
  196. {IV('ュ'), 0xAD, 0}, //ュ
  197. {IV('ョ'), 0xAE, 0}, //ョ
  198. {IV('ッ'), 0xAF, 0}, //ッ
  199. {IV('ー'), 0xB0, 0}, //ー
  200. //アイウエオカキクケコサシスセ
  201. {IV('ア'), 0xB1, 0}, //ア
  202. {IV('イ'), 0xB2, 0}, //イ
  203. {IV('ウ'), 0xB3, 0}, //ウ
  204. {IV('エ'), 0xB4, 0}, //エ
  205. {IV('オ'), 0xB5, 0}, //オ
  206. {IV('カ'), 0xB6, 0}, //カ
  207. {IV('キ'), 0xB7, 0}, //キ
  208. {IV('ク'), 0xB8, 0}, //ク
  209. {IV('ケ'), 0xB9, 0}, //ケ
  210. {IV('コ'), 0xBA, 0}, //コ
  211. {IV('サ'), 0xBB, 0}, //サ
  212. {IV('シ'), 0xBC, 0}, //シ
  213. {IV('ス'), 0xBD, 0}, //ス
  214. {IV('セ'), 0xBE, 0}, //セ
  215. //ソタチツテトナニヌネノハヒフ
  216. {IV('ソ'), 0xBF, 0}, //ソ
  217. {IV('タ'), 0xC0, 0}, //タ
  218. {IV('チ'), 0xC1, 0}, //チ
  219. {IV('ツ'), 0xC2, 0}, //ツ
  220. {IV('テ'), 0xC3, 0}, //テ
  221. {IV('ト'), 0xC4, 0}, //ト
  222. {IV('ナ'), 0xC5, 0}, //ナ
  223. {IV('ニ'), 0xC6, 0}, //ニ
  224. {IV('ヌ'), 0xC7, 0}, //ヌ
  225. {IV('ネ'), 0xC8, 0}, //ネ
  226. {IV('ノ'), 0xC9, 0}, //ノ
  227. {IV('ハ'), 0xCA, 0}, //ハ
  228. {IV('ヒ'), 0xCB, 0}, //ヒ
  229. {IV('フ'), 0xCC, 0}, //フ
  230. //ヘホマミムメモヤユヨラリルレロワン゙゚
  231. {IV('ヘ'), 0xCD, 0}, //ヘ
  232. {IV('ホ'), 0xCE, 0}, //ホ
  233. {IV('マ'), 0xCF, 0}, //マ
  234. {IV('ミ'), 0xD0, 0}, //ミ
  235. {IV('ム'), 0xD1, 0}, //ム
  236. {IV('メ'), 0xD2, 0}, //メ
  237. {IV('モ'), 0xD3, 0}, //モ
  238. {IV('ヤ'), 0xD4, 0}, //ヤ
  239. {IV('ユ'), 0xD5, 0}, //ユ
  240. {IV('ヨ'), 0xD6, 0}, //ヨ
  241. {IV('ラ'), 0xD7, 0}, //ラ
  242. {IV('リ'), 0xD8, 0}, //リ
  243. {IV('ル'), 0xD9, 0}, //ル
  244. {IV('レ'), 0xDA, 0}, //レ
  245. {IV('ロ'), 0xDB, 0}, //ロ
  246. {IV('ワ'), 0xDC, 0}, //ワ
  247. {IV('ン'), 0xDD, 0}, //ン
  248. {IV('゙'), 0xDE, 0}, // ゛
  249. {IV('゚'), 0xDF, 0}, // ゜
  250. {IV('¥'), 0x5C, 0},
  251. #elif DISPLAY_CHARSET_HD44780 == WESTERN
  252. // 0x10 -- 0x1F (except 0x1C)
  253. // 0x80 -- 0xFF (except 0xA7,0xB0,0xB1,0xB3,0xB4,0xBF,0xD1,0xF8,0xFA,0xFC-0xFF)
  254. {IV('¡'), 0xA9, 0},
  255. {IV('¢'), 0xA4, 0},
  256. {IV('£'), 0xA5, 0},
  257. {IV('¥'), 0xA6, 0},
  258. {IV('§'), 0xD2, 0}, // section sign
  259. {IV('©'), 0xCF, 0},
  260. {IV('ª'), 0x9D, 0},
  261. {IV('«'), 0xBB, 0},
  262. {IV('®'), 0xCE, 0},
  263. {IV('°'), 0xB2, 0}, // Marlin special: '°' LCD_STR_DEGREE (0x09)
  264. //{IV(''), 0xD1, 0},
  265. {IV('±'), 0x10, 0}, //∓±
  266. //{'='), 0x1C, 0}, // error
  267. {IV('²'), 0x1E, 0},
  268. {IV('³'), 0x1F, 0},
  269. {IV('¶'), 0xD3, 0}, // pilcrow sign
  270. {IV('º'), 0x9E, 0},
  271. {IV('»'), 0xBC, 0}, // 00BB
  272. //{IV(''), 0xB3, 0}, // error
  273. //{IV(''), 0xB4, 0}, // error
  274. {IV('¼'), 0xB6, 0}, // 00BC
  275. {IV('½'), 0xB5, 0}, // 00BD
  276. //{IV('¾'), '3', 0}, // 00BE
  277. {IV('¿'), 0x9F, 0}, // 00BF
  278. {IV('Â'), 0x8F, 0},
  279. {IV('Ã'), 0xAA, 0},
  280. {IV('Ä'), 0x8E, 0},
  281. {IV('Æ'), 0x92, 0},
  282. {IV('Ç'), 0x80, 0},
  283. {IV('É'), 0x90, 0},
  284. {IV('Ñ'), 0x9C, 0},
  285. {IV('Õ'), 0xAC, 0},
  286. {IV('Ö'), 0x99, 0},
  287. {IV('×'), 0xB7, 0},
  288. {IV('Ø'), 0xAE, 0},
  289. {IV('Ü'), 0x9A, 0},
  290. {IV('à'), 0x85, 0},
  291. {IV('á'), 0xA0, 0},
  292. {IV('â'), 0x83, 0},
  293. {IV('ã'), 0xAB, 0},
  294. {IV('ä'), 0x84, 0},
  295. {IV('å'), 0x86, 0},
  296. {IV('æ'), 0x91, 0},
  297. {IV('ç'), 0x87, 0},
  298. {IV('è'), 0x8A, 0},
  299. {IV('é'), 0x82, 0},
  300. {IV('ê'), 0x88, 0},
  301. {IV('ë'), 0x89, 0},
  302. {IV('ì'), 0x8D, 0},
  303. {IV('í'), 0xA1, 0},
  304. {IV('î'), 0x8C, 0},
  305. {IV('ï'), 0x8B, 0},
  306. {IV('ñ'), 0x9B, 0},
  307. {IV('ò'), 0x95, 0},
  308. {IV('ó'), 0xA2, 0},
  309. {IV('ô'), 0x93, 0},
  310. {IV('õ'), 0xAD, 0},
  311. {IV('ö'), 0x94, 0},
  312. {IV('÷'), 0xB8, 0},
  313. {IV('ø'), 0xAF, 0},
  314. {IV('ù'), 0x97, 0},
  315. {IV('ú'), 0xA3, 0},
  316. {IV('û'), 0x96, 0},
  317. {IV('ü'), 0x81, 0},
  318. {IV('ÿ'), 0x98, 0},
  319. //{IV(''), 0xB0, 0}, // error
  320. //{IV(''), 0xB1, 0}, // error
  321. {IV('ƒ'), 0xA8, 0}, // 0192
  322. {IV('Ύ'), 0xDB, 0}, // 038E
  323. {IV('Ώ'), 0xDE, 0}, // 038F
  324. {IV('ΐ'), 0xE7, 0}, // 0390
  325. {IV('Γ'), 0xD4, 0}, // 0393, Gamma
  326. {IV('Δ'), 0xD5, 0}, // 0394, Delta, ◿
  327. {IV('Θ'), 0xD6, 0}, // 0398, Theta
  328. {IV('Λ'), 0xD7, 0}, // 039B, Lambda
  329. {IV('Ξ'), 0xD8, 0}, // 039E, Xi
  330. {IV('Π'), 0xD9, 0}, // Pi
  331. {IV('Σ'), 0xDA, 0}, // Sigma
  332. {IV('Υ'), 0xDB, 0}, // Upsilon
  333. {IV('Φ'), 0xDC, 0}, // Phi
  334. {IV('Ψ'), 0xDD, 0}, // Psi
  335. {IV('Ω'), 0xDE, 0}, // Omega
  336. {IV('ά'), 0xDF, 0}, // 03AC
  337. {IV('έ'), 0xE3, 0}, // 03AD
  338. {IV('ή'), 0xE5, 0}, // 03AE
  339. {IV('ί'), 0xE7, 0}, // 03AF
  340. {IV('ΰ'), 0xF1, 0}, // 03B0
  341. {IV('α'), 0xDF, 0}, // alpha
  342. {IV('β'), 0xE0, 0}, // beta
  343. {IV('γ'), 0xE1, 0}, // gamma
  344. {IV('δ'), 0xE2, 0}, // delta
  345. {IV('ε'), 0xE3, 0}, // epsilon
  346. {IV('ζ'), 0xE4, 0}, // zeta
  347. {IV('η'), 0xE5, 0}, // eta
  348. {IV('θ'), 0xE6, 0}, // theta
  349. {IV('ι'), 0xE7, 0}, // lota
  350. {IV('κ'), 0xE8, 0}, // kappa
  351. {IV('λ'), 0xE9, 0}, // lambda
  352. {IV('μ'), 0xEA, 0}, // mu
  353. {IV('ν'), 0xEB, 0}, // nu
  354. {IV('ξ'), 0xEC, 0}, // xi
  355. {IV('π'), 0xED, 0}, // pi
  356. {IV('ρ'), 0xEE, 0}, // rho
  357. {IV('σ'), 0xEF, 0}, // sigma
  358. {IV('τ'), 0xF0, 0}, // tau
  359. {IV('υ'), 0xF1, 0}, // upsilon
  360. {IV('χ'), 0xF2, 0}, // chi
  361. {IV('ψ'), 0xF3, 0}, // psi
  362. {IV('ω'), 0xF4, 0}, // 03C9, omega
  363. {IV('ϊ'), 0xE7, 0}, // 03CA
  364. {IV('ϋ'), 0xF1, 0}, // 03CB
  365. {IV('ύ'), 0xF1, 0}, // 03CD
  366. {IV('ώ'), 0xF4, 0}, // 03CE
  367. {IV('•'), 0xCD, 0}, // ·
  368. {IV('℞'), 0xA7, 0}, // ℞ Pt ASCII 158
  369. {IV('™'), 0xD0, 0},
  370. {IV('↤'), 0xF9, 0}, // ⟻
  371. {IV('↵'), 0xC4, 0},
  372. {IV('↻'), 0x04, 0}, // Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01)
  373. {IV('⇥'), 0xFB, 0},
  374. {IV('√'), 0xBE, 0}, // √
  375. {IV('∞'), 0xC2, 0}, // infinity
  376. {IV('∫'), 0x1B, 0},
  377. {IV('∼'), 0x1D, 0},
  378. {IV('≈'), 0x1A, 0},
  379. {IV('≠'), 0xBD, 0},
  380. {IV('≡'), 0x11, 0},
  381. {IV('≤'), 0xB9, 0},// ≤≥ ⩽⩾
  382. {IV('≥'), 0xBA, 0},
  383. //{IV(''), 0xBF, 0}, // error
  384. {IV('⌠'), 0xC0, 0},
  385. {IV('⌡'), 0xC1, 0},
  386. {IV('⎧'), 0x14, 0},
  387. {IV('⎩'), 0x15, 0},
  388. {IV('⎫'), 0x16, 0},
  389. {IV('⎭'), 0x17, 0},
  390. {IV('⎰'), 0x18, 0},
  391. {IV('⎱'), 0x19, 0},
  392. {IV('⎲'), 0x12, 0},
  393. {IV('⎳'), 0x13, 0},
  394. {IV('⏱'), 0x07, 0}, // Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05)
  395. {IV('┌'), 0xC9, 0},
  396. {IV('┐'), 0xCA, 0},
  397. {IV('└'), 0xCB, 0},
  398. {IV('┘'), 0xCC, 0},
  399. {IV('◸'), 0xC3, 0}, // ◿
  400. {IV('⭠'), 0xC8, 0},
  401. {IV('⭡'), 0xC5, 0},
  402. {IV('⭢'), 0xC7, 0},
  403. {IV('⭣'), 0xC6, 0},
  404. {IV('⯆'), 0xF5, 0},
  405. {IV('⯇'), 0xF7, 0}, // ⯅
  406. {IV('⯈'), 0xF6, 0},
  407. //{IV(''), 0xF8, 0}, // error
  408. //{IV(''), 0xFA, 0}, // error
  409. //{IV(''), 0xFC, 0}, // error
  410. //{IV(''), 0xFD, 0}, // error
  411. //{IV(''), 0xFE, 0}, // error
  412. //{IV(''), 0xFF, 0}, // error
  413. #elif DISPLAY_CHARSET_HD44780 == CYRILLIC
  414. {IV('¢'), 0x5C, 0}, // 00A2
  415. {IV('£'), 0xCF, 0}, // 00A3
  416. {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09)
  417. //{IV(''), 0x80, 0},
  418. //{IV(''), 0x81, 0},
  419. //{IV(''), 0x82, 0},
  420. //{IV(''), 0x83, 0},
  421. //{IV(''), 0x84, 0},
  422. //{IV(''), 0x85, 0},
  423. //{IV(''), 0x86, 0},
  424. //{IV(''), 0x87, 0},
  425. //{IV(''), 0x88, 0},
  426. //{IV(''), 0x89, 0},
  427. //{IV(''), 0x8A, 0},
  428. //{IV(''), 0x8B, 0},
  429. //{IV(''), 0x8C, 0},
  430. //{IV(''), 0x8D, 0},
  431. //{IV(''), 0x8E, 0},
  432. //{IV(''), 0x8F, 0},
  433. //{IV(''), 0x90, 0},
  434. //{IV(''), 0x91, 0},
  435. //{IV(''), 0x92, 0},
  436. //{IV(''), 0x93, 0},
  437. //{IV(''), 0x94, 0},
  438. //{IV(''), 0x95, 0},
  439. //{IV(''), 0x96, 0},
  440. //{IV(''), 0x97, 0},
  441. //{IV(''), 0x98, 0},
  442. //{IV(''), 0x99, 0},
  443. //{IV(''), 0x9A, 0},
  444. //{IV(''), 0x9B, 0},
  445. //{IV(''), 0x9C, 0},
  446. //{IV(''), 0x9D, 0},
  447. //{IV(''), 0x9E, 0},
  448. //{IV(''), 0x9F, 0},
  449. {IV('¼'), 0xF0, 0}, // 00BC
  450. {IV('⅓'), 0xF1, 0},
  451. {IV('½'), 0xF2, 0}, // 00BD
  452. {IV('¾'), 0xF3, 0}, // 00BE
  453. {IV('¿'), 0xCD, 0}, // 00BF
  454. {IV('Ё'), 0xA2, 0}, // 0401
  455. {IV('А'), 'A', 0}, // 0410
  456. {IV('Б'), 0xA0, 0},
  457. {IV('В'), 'B', 0},
  458. {IV('Г'), 0xA1, 0},
  459. {IV('Д'), 0xE0, 0},
  460. {IV('Е'), 'E', 0},
  461. {IV('Ж'), 0xA3, 0},
  462. {IV('З'), 0xA4, 0},
  463. {IV('И'), 0xA5, 0},
  464. {IV('Й'), 0xA6, 0},
  465. {IV('К'), 'K', 0},
  466. {IV('Л'), 0xA7, 0},
  467. {IV('М'), 'M', 0},
  468. {IV('Н'), 'H', 0},
  469. {IV('О'), 'O', 0},
  470. {IV('П'), 0xA8, 0},
  471. {IV('Р'), 'P', 0},
  472. {IV('С'), 'C', 0},
  473. {IV('Т'), 'T', 0},
  474. {IV('У'), 0xA9, 0},
  475. {IV('Ф'), 0xAA, 0},
  476. {IV('Х'), 'X', 0},
  477. {IV('Ц'), 0xE1, 0},
  478. {IV('Ч'), 0xAB, 0},
  479. {IV('Ш'), 0xAC, 0},
  480. {IV('Щ'), 0xE2, 0},
  481. {IV('Ъ'), 0xAD, 0},
  482. {IV('Ы'), 0xAE, 0},
  483. {IV('Ь'), 'b', 0},
  484. {IV('Э'), 0xAF, 0},
  485. {IV('Ю'), 0xB0, 0},
  486. {IV('Я'), 0xB1, 0},
  487. {IV('а'), 'a', 0},
  488. {IV('б'), 0xB2, 0},
  489. {IV('в'), 0xB3, 0},
  490. {IV('г'), 0xB4, 0},
  491. {IV('д'), 0xE3, 0},
  492. {IV('е'), 'e', 0},
  493. {IV('ж'), 0xB6, 0},
  494. {IV('з'), 0xB7, 0},
  495. {IV('и'), 0xB8, 0},
  496. {IV('й'), 0xB9, 0},
  497. {IV('к'), 0xBA, 0}, //клмноп
  498. {IV('л'), 0xBB, 0},
  499. {IV('м'), 0xBC, 0},
  500. {IV('н'), 0xBD, 0},
  501. {IV('о'), 'o', 0},
  502. {IV('п'), 0xBE, 0},
  503. {IV('р'), 'p', 0},
  504. {IV('с'), 'c', 0},
  505. {IV('т'), 0xBF, 0},
  506. {IV('у'), 'y', 0},
  507. {IV('ф'), 0xE4, 0},
  508. {IV('х'), 'x', 0},
  509. {IV('ц'), 0xE5, 0},
  510. {IV('ч'), 0xC0, 0},
  511. {IV('ш'), 0xC1, 0},
  512. {IV('щ'), 0xE6, 0},
  513. {IV('ъ'), 0xC2, 0},
  514. {IV('ы'), 0xC3, 0},
  515. {IV('ь'), 0xC4, 0},
  516. {IV('э'), 0xC5, 0},
  517. {IV('ю'), 0xC6, 0},
  518. {IV('я'), 0xC7, 0}, // 044F
  519. {IV('ё'), 0xB5, 0}, // 0451
  520. //{IV(''), 0xC8, 0},
  521. //{IV(''), 0xC9, 0},
  522. //{IV(''), 0xCA, 0},
  523. //{IV(''), 0xCB, 0},
  524. //{IV(''), 0xCC, 0},
  525. //{IV(''), 0xCD, 0},
  526. //{IV(''), 0xCE, 0},
  527. //{IV(''), 0xD0, 0},
  528. //{IV(''), 0xD1, 0},
  529. //{IV(''), 0xD2, 0},
  530. //{IV(''), 0xD3, 0},
  531. //{IV(''), 0xD4, 0},
  532. //{IV(''), 0xD5, 0},
  533. //{IV(''), 0xD6, 0},
  534. //{IV(''), 0xD7, 0},
  535. //{IV(''), 0xD8, 0},
  536. //{IV(''), 0xDB, 0},
  537. //{IV(''), 0xDC, 0},
  538. //{IV(''), 0xDD, 0},
  539. //{IV(''), 0xDE, 0},
  540. //{IV(''), 0xDF, 0},
  541. //{IV(''), 0xE7, 0},
  542. //{IV(''), 0xE8, 0},
  543. //{IV(''), 0xE9, 0},
  544. //{IV(''), 0xEA, 0},
  545. //{IV(''), 0xEB, 0},
  546. //{IV(''), 0xEC, 0},
  547. //{IV(''), 0xED, 0},
  548. //{IV(''), 0xEE, 0},
  549. //{IV(''), 0xEF, 0},
  550. //{IV(''), 0xF4, 0},
  551. //{IV(''), 0xF5, 0},
  552. //{IV(''), 0xF6, 0},
  553. //{IV(''), 0xF7, 0},
  554. //{IV(''), 0xF8, 0},
  555. //{IV(''), 0xF9, 0},
  556. //{IV(''), 0xFA, 0},
  557. //{IV(''), 0xFB, 0},
  558. //{IV(''), 0xFC, 0},
  559. //{IV(''), 0xFD, 0},
  560. //{IV(''), 0xFE, 0},
  561. //{IV(''), 0xFF, 0},
  562. {IV('↑'), 0xD9, 0}, // 2191 ←↑→↓
  563. {IV('↓'), 0xDA, 0}, // 2193
  564. #endif
  565. };
  566. // the plain ASCII replacement for various char
  567. static const hd44780_charmap_t g_hd44780_charmap_common[] PROGMEM = {
  568. {IV('¡'), 'i', 0}, // A1
  569. {IV('¢'), 'c', 0}, // A2
  570. {IV('°'), 0x09, 0}, // B0 Marlin special: '°' LCD_STR_DEGREE (0x09)
  571. // map WESTERN code to the plain ASCII
  572. {IV('Á'), 'A', 0}, // C1
  573. {IV('Â'), 'A', 0}, // C2
  574. {IV('Ã'), 'A', 0}, // C3
  575. {IV('Ä'), 'A', 0}, // C4
  576. {IV('Å'), 'A', 0}, // C5
  577. {IV('Æ'), 'A', 'E'}, // C6
  578. {IV('Ç'), 'C', 0}, // C7
  579. {IV('È'), 'E', 0}, // C8
  580. {IV('É'), 'E', 0}, // C9
  581. {IV('Í'), 'I', 0}, // CD
  582. {IV('Ñ'), 'N', 0}, // D1
  583. {IV('Õ'), 'O', 0}, // D5
  584. {IV('Ö'), 'O', 0}, // D6
  585. {IV('×'), 'x', 0}, // D7
  586. {IV('Ü'), 'U', 0}, // DC
  587. {IV('Ý'), 'Y', 0}, // DD
  588. {IV('à'), 'a', 0}, // E0
  589. {IV('á'), 'a', 0},
  590. {IV('â'), 'a', 0},
  591. {IV('ã'), 'a', 0},
  592. {IV('ä'), 'a', 0},
  593. {IV('å'), 'a', 0},
  594. {IV('æ'), 'a', 'e'},
  595. {IV('ç'), 'c', 0},
  596. {IV('è'), 'e', 0}, // 00E8
  597. {IV('é'), 'e', 0},
  598. {IV('ê'), 'e', 0},
  599. {IV('ë'), 'e', 0},
  600. {IV('ì'), 'i', 0}, // 00EC
  601. {IV('í'), 'i', 0},
  602. {IV('î'), 'i', 0},
  603. {IV('ï'), 'i', 0}, // 00EF
  604. {IV('ñ'), 'n', 0}, // 00F1
  605. {IV('ò'), 'o', 0},
  606. {IV('ó'), 'o', 0},
  607. {IV('ô'), 'o', 0},
  608. {IV('õ'), 'o', 0},
  609. {IV('ö'), 'o', 0},
  610. //{IV('÷'), 0xB8, 0},
  611. {IV('ø'), 'o', 0},
  612. {IV('ù'), 'u', 0},
  613. {IV('ú'), 'u', 0},
  614. {IV('û'), 'u', 0},
  615. {IV('ü'), 'u', 0}, // FC
  616. {IV('ý'), 'y', 0}, // FD
  617. {IV('ÿ'), 'y', 0}, // FF
  618. {IV('Ą'), 'A', 0}, // 0104
  619. {IV('ą'), 'a', 0}, // 0105
  620. {IV('Ć'), 'C', 0}, // 0106
  621. {IV('ć'), 'c', 0}, // 0107
  622. {IV('Č'), 'C', 0}, // 010C
  623. {IV('č'), 'c', 0}, // 010D
  624. {IV('Ď'), 'D', 0}, // 010E
  625. {IV('ď'), 'd', 0}, // 010F
  626. {IV('đ'), 'd', 0}, // 0111
  627. {IV('ę'), 'e', 0}, // 0119
  628. {IV('ğ'), 'g', 0}, // 011F
  629. {IV('İ'), 'I', 0}, // 0130
  630. {IV('ı'), 'i', 0}, // 0131
  631. {IV('Ł'), 'L', 0}, // 0141
  632. {IV('ł'), 'l', 0}, // 0142
  633. {IV('Ń'), 'N', 0}, // 0143
  634. {IV('ń'), 'n', 0}, // 0144
  635. {IV('ň'), 'n', 0}, // 0148
  636. {IV('ř'), 'r', 0}, // 0159
  637. {IV('Ś'), 'S', 0}, // 015A
  638. {IV('ś'), 's', 0}, // 015B
  639. {IV('ş'), 's', 0}, // 015F
  640. {IV('Š'), 'S', 0}, // 0160
  641. {IV('š'), 's', 0}, // 0161
  642. {IV('ť'), 't', 0}, // 0165
  643. {IV('ů'), 'u', 0}, // 016F
  644. {IV('ż'), 'z', 0}, // 017C
  645. {IV('Ž'), 'Z', 0}, // 017D
  646. {IV('ž'), 'z', 0}, // 017E
  647. {IV('ƒ'), 'f', 0}, // 0192
  648. {IV('ˣ'), 'x', 0}, // 02E3
  649. {IV('΄'), '\'', 0}, // 0384
  650. {IV('΅'), '\'', 0}, // 0385
  651. {IV('Ά'), 'A', 0}, // 0386
  652. {IV('·'), '.', 0}, // 0387
  653. {IV('Έ'), 'E', 0}, // 0388
  654. {IV('Ή'), 'H', 0}, // 0389
  655. {IV('Ί'), 'I', 0}, // 038A
  656. {IV('Ό'), 'O', 0}, // 038C
  657. {IV('Ύ'), 'Y', 0}, // 038E
  658. {IV('Ώ'), 'O', 0}, // 038F
  659. {IV('ΐ'), 'i', 0}, // 0390
  660. {IV('Α'), 'A', 0}, // 0391
  661. {IV('Β'), 'B', 0}, // 0392
  662. {IV('Γ'), 'T', 0}, // 0393, Gamma
  663. {IV('Δ'), '4', 0}, // 0394, Delta, ◿
  664. {IV('Ε'), 'E', 0}, // 0395
  665. {IV('Ζ'), 'Z', 0}, // 0396
  666. {IV('Η'), 'H', 0}, // 0397
  667. {IV('Θ'), '0', 0}, // 0398, Theta
  668. {IV('Ι'), 'I', 0}, // 0399
  669. {IV('Κ'), 'K', 0}, // 039A
  670. {IV('Λ'), '^', 0}, // 039B, Lambda
  671. {IV('Μ'), 'M', 0}, // 039C
  672. {IV('Ν'), 'N', 0}, // 039D
  673. {IV('Ξ'), '3', 0}, // 039E, Xi
  674. {IV('Ο'), 'O', 0}, // 039F
  675. {IV('Π'), 'n', 0}, // 03A0, Pi
  676. {IV('Ρ'), 'P', 0}, // 03A1
  677. {IV('Σ'), 'E', 0}, // 03A3, Sigma
  678. {IV('Τ'), 'T', 0}, // 03A4
  679. {IV('Υ'), 'Y', 0}, // 03A5, Upsilon
  680. {IV('Φ'), 'p', 0}, // 03A6, Phi
  681. {IV('Χ'), 'X', 0}, // 03A7
  682. {IV('Ψ'), 'P', 0}, // 03A8, Psi
  683. {IV('Ω'), 'O', 0}, // 03A9, Omega
  684. {IV('Ϊ'), 'I', 0}, // 03AA
  685. {IV('Ϋ'), 'Y', 0}, // 03AB
  686. {IV('ά'), 'a', 0}, // 03AC
  687. {IV('έ'), 'e', 0}, // 03AD
  688. {IV('ή'), 'n', 0}, // 03AE
  689. {IV('ί'), 'i', 0}, // 03AF
  690. {IV('ΰ'), 'v', 0}, // 03B0
  691. {IV('α'), 'a', 0}, // 03B1, alpha
  692. {IV('β'), 'B', 0}, // 03B2, beta
  693. {IV('γ'), 'v', 0}, // 03B3, gamma
  694. {IV('δ'), 'd', 0}, // 03B4, delta
  695. {IV('ε'), 'e', 0}, // 03B5, epsilon
  696. {IV('ζ'), 'Z', 0}, // 03B6, zeta
  697. {IV('η'), 'n', 0}, // 03B7, eta
  698. {IV('θ'), '0', 0}, // 03B8, theta
  699. {IV('ι'), 'i', 0}, // 03B9, lota
  700. {IV('κ'), 'k', 0}, // 03BA, kappa
  701. {IV('λ'), 'L', 0}, // 03BB, lambda
  702. {IV('μ'), 'u', 0}, // 03BC, mu
  703. {IV('ν'), 'v', 0}, // 03BD, nu
  704. {IV('ξ'), 'e', 0}, // 03BE, xi
  705. {IV('ο'), 'o', 0}, // 03BF
  706. {IV('π'), 'n', 0}, // 03C0, pi
  707. {IV('ρ'), 'p', 0}, // 03C1, rho
  708. {IV('ς'), 'c', 0}, // 03C2
  709. {IV('σ'), 'o', 0}, // 03C3, sigma
  710. {IV('τ'), 't', 0}, // 03C4, tau
  711. {IV('υ'), 'v', 0}, // 03C5, upsilon
  712. {IV('φ'), 'p', 0}, // 03C6
  713. {IV('χ'), 'X', 0}, // 03C7, chi
  714. {IV('ψ'), 'W', 0}, // 03C8, psi
  715. {IV('ω'), 'w', 0}, // 03C9, omega
  716. {IV('ϊ'), 'i', 0}, // 03CA
  717. {IV('ϋ'), 'v', 0}, // 03CB
  718. {IV('ό'), 'o', 0}, // 03CC
  719. {IV('ύ'), 'v', 0}, // 03CD
  720. {IV('ώ'), 'w', 0}, // 03CE
  721. // map CYRILLIC code to the plain ASCII
  722. {IV('Ё'), 'E', 0}, // 0401
  723. {IV('А'), 'A', 0}, // 0410
  724. {IV('Б'), 'b', 0}, // 0411
  725. {IV('В'), 'B', 0}, // 0412
  726. {IV('Г'), 'T', 0}, // 0413
  727. {IV('Д'), 'Q', 0}, // 0414
  728. {IV('Е'), 'E', 0}, // 0415
  729. {IV('Ж'), '*', 0}, // 0416
  730. {IV('З'), 'E', 0}, // 0417
  731. {IV('И'), 'N', 0}, // 0418
  732. {IV('Й'), 'N', 0}, // 0419
  733. {IV('К'), 'K', 0}, // 041A
  734. {IV('Л'), 'T', 0}, // 041B
  735. {IV('М'), 'M', 0}, // 041C
  736. {IV('Н'), 'H', 0}, // 041D
  737. {IV('О'), 'O', 0}, // 041E
  738. {IV('П'), 'n', 0}, // 041F
  739. {IV('Р'), 'P', 0}, // 0420
  740. {IV('С'), 'C', 0}, // 0421
  741. {IV('Т'), 'T', 0}, // 0422
  742. {IV('У'), 'Y', 0},
  743. {IV('Ф'), 'o', 0},
  744. {IV('Х'), 'X', 0},
  745. {IV('Ц'), 'U', 0},
  746. {IV('Ч'), 'y', 0},
  747. {IV('Ш'), 'W', 0},
  748. {IV('Щ'), 'W', 0},
  749. {IV('Ъ'), 'b', 0},
  750. {IV('Ы'), 'b', '|'},
  751. {IV('Ь'), 'b'},
  752. {IV('Э'), 'e'},
  753. {IV('Ю'), '|', 'O'},
  754. {IV('Я'), '9', '|'}, // 042F
  755. {IV('а'), 'a', 0}, // 0430
  756. {IV('б'), '6', 0}, // 0431
  757. {IV('в'), 'B', 0}, // 0432,
  758. {IV('г'), 'r', 0}, // 0433
  759. {IV('д'), 'a', 0}, // 0434,
  760. {IV('е'), 'e', 0}, // 0435
  761. {IV('ж'), '*', 0}, // 0436
  762. {IV('з'), 'e', 0}, // 0437,
  763. {IV('и'), 'u', 0}, // 0438
  764. {IV('й'), 'u', 0}, // 0439,
  765. {IV('к'), 'k', 0}, // 043A
  766. {IV('л'), 'n', 0},
  767. {IV('м'), 'm', 0},
  768. {IV('н'), 'H', 0},
  769. {IV('о'), 'o', 0},
  770. {IV('п'), 'n', 0},
  771. {IV('р'), 'p', 0},
  772. {IV('с'), 'c', 0},
  773. {IV('т'), 't', 0},
  774. {IV('у'), 'y', 0},
  775. {IV('ф'), 'q', 'p'},
  776. {IV('х'), 'x', 0},
  777. {IV('ц'), 'u', 0},
  778. {IV('ч'), 'y', 0},
  779. {IV('ш'), 'w', 0},
  780. {IV('щ'), 'w', 0},
  781. {IV('ъ'), 'b', 0},
  782. {IV('ы'), 'b', '|'},
  783. {IV('ь'), 'b', 0},
  784. {IV('э'), 'e', 0},
  785. {IV('ю'), '|', 'o'},
  786. {IV('я'), 'g', 0}, // 044F
  787. {IV('ё'), 'e', 0}, // 0451
  788. {IV('•'), '.', 0}, // 2022 ·
  789. {IV('℞'), 'P', 'x'}, // 211E ℞ Pt ASCII 158
  790. {IV('™'), 'T', 'M'}, // 2122
  791. {IV('←'), '<', '-'}, // 2190
  792. {IV('→'), '-', '>'}, // 2192, Marlin special: '⮈⮉⮊⮋➤→⏵➟➠➡' LCD_STR_ARROW_RIGHT (0x03)
  793. //{IV('↰'), '<', 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04)
  794. {IV('↰'), 0x03, 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04)
  795. {IV('↻'), 0x04, 0}, // 21BB Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01)
  796. {IV('∼'), '~', 0}, // 223C
  797. {IV('≈'), '~', '='}, // 2248
  798. {IV('≠'), '!', '='}, // 2260
  799. {IV('≡'), '=', 0}, // 2261
  800. {IV('≤'), '<', '='},// 2264, ≤≥ ⩽⩾
  801. {IV('≥'), '>', '='}, // 2265
  802. {IV('⏱'), 0x07, 0}, // 23F1, Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05)
  803. {IV('゠'), '=', 0}, // 30A0
  804. // ⏰⏱⏲⏳◴◵◶◷
  805. // ⏻⏼♁♂
  806. //{IV(''), 0x00, 0}, // Marlin special: '' LCD_STR_BEDTEMP (0x07)
  807. {IV('🌡'), 0x02, 0}, // D83CDF21 Marlin special: '🌡' LCD_STR_THERMOMETER (0x08)
  808. {IV('📂'), 0x05, 0}, // D83DDCC2 Marlin special: '📁📂' LCD_STR_FOLDER (0x02)
  809. //{IV(''), 0x06, 0}, // Marlin special: '' LCD_STR_FEEDRATE (0x06)
  810. };
  811. /* return v1 - v2 */
  812. static int hd44780_charmap_compare(hd44780_charmap_t * v1, hd44780_charmap_t * v2) {
  813. FU_ASSERT(NULL != v1);
  814. FU_ASSERT(NULL != v2);
  815. TRACE("compare char1 %" PRIu32 "(0x%" PRIX32 ")", v1->uchar, v1->uchar);
  816. TRACE("compare char2 %" PRIu32 "(0x%" PRIX32 ")", v2->uchar, v2->uchar);
  817. if (v1->uchar < v2->uchar) {
  818. TRACE("compare return -1");
  819. return -1;
  820. } else if (v1->uchar > v2->uchar) {
  821. TRACE("compare return 1");
  822. return 1;
  823. }
  824. #if 0
  825. if (v1->idx < v2->idx) {
  826. return -1;
  827. } else if (v1->idx > v2->idx) {
  828. return 1;
  829. }
  830. #endif
  831. TRACE("compare return 0");
  832. return 0;
  833. }
  834. static int pf_bsearch_cb_comp_hd4map_pgm(void *userdata, size_t idx, void * data_pin) {
  835. hd44780_charmap_t localval;
  836. hd44780_charmap_t *p_hd44780_charmap = (hd44780_charmap_t *)userdata;
  837. memcpy_P(&localval, p_hd44780_charmap + idx, sizeof(localval));
  838. return hd44780_charmap_compare(&localval, (hd44780_charmap_t *)data_pin);
  839. }
  840. #if DEBUG
  841. int
  842. test_hd44780_charmap(hd44780_charmap_t *data, size_t size, char *name, char flg_show_contents)
  843. {
  844. int ret;
  845. size_t idx = 0;
  846. hd44780_charmap_t preval = {0, 0, 0};
  847. hd44780_charmap_t pinval = {0, 0, 0};
  848. char flg_error = 0;
  849. int i;
  850. TRACE("Test %s\n", name);
  851. for (i = 0; i < size; i ++) {
  852. memcpy_P (&pinval, &(data[i]), sizeof(pinval));
  853. if (flg_show_contents) {
  854. #if 1
  855. TRACE("[% 4d] % 6" PRIu32 "(0x%04" PRIX32 ") --> 0x%02X,0x%02X%s\n", i, pinval.uchar, pinval.uchar, (unsigned int)(pinval.idx), (unsigned int)(pinval.idx2), (preval.uchar < pinval.uchar?"":" <--- ERROR"));
  856. #else
  857. TRACE("[% 4d]", i);
  858. TRACE("% 6" PRIu32 "(0x%04" PRIX32 "),", pinval.uchar, pinval.uchar);
  859. TRACE("0x%02X,", (unsigned int)(pinval.idx));
  860. TRACE("0x%02X,", (unsigned int)(pinval.idx2));
  861. TRACE("%s", (preval.uchar < pinval.uchar?"":" <--- ERROR"));
  862. #endif
  863. }
  864. if (preval.uchar >= pinval.uchar) {
  865. flg_error = 1;
  866. // TRACE("Error: out of order in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar);
  867. // return -1;
  868. }
  869. memcpy (&preval, &pinval, sizeof(pinval));
  870. ret = pf_bsearch_r((void *)data, size, pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx);
  871. if (ret < 0) {
  872. flg_error = 1;
  873. TRACE("Error: not found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar);
  874. //return -1;
  875. }
  876. if (idx != i) {
  877. flg_error = 1;
  878. TRACE("Error: wrong index found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar);
  879. //return -1;
  880. }
  881. }
  882. if (flg_error) {
  883. TRACE("\nError: in array %s\n\n", name);
  884. return -1;
  885. }
  886. TRACE("\nPASS array %s\n\n", name);
  887. return 0;
  888. }
  889. int
  890. test_hd44780_charmap_all(void)
  891. {
  892. int flg_error = 0;
  893. if (test_hd44780_charmap(g_hd44780_charmap_device, NUM_ARRAY(g_hd44780_charmap_device), "g_hd44780_charmap_device", 0) < 0) {
  894. flg_error = 1;
  895. test_hd44780_charmap(g_hd44780_charmap_device, NUM_ARRAY(g_hd44780_charmap_device), "g_hd44780_charmap_device", 1);
  896. }
  897. if (test_hd44780_charmap(g_hd44780_charmap_common, NUM_ARRAY(g_hd44780_charmap_common), "g_hd44780_charmap_common", 0) < 0) {
  898. flg_error = 1;
  899. test_hd44780_charmap(g_hd44780_charmap_common, NUM_ARRAY(g_hd44780_charmap_common), "g_hd44780_charmap_common", 1);
  900. }
  901. if (flg_error) {
  902. TRACE("\nFAILED in hd44780 tests!\n");
  903. return -1;
  904. }
  905. TRACE("\nPASS in hd44780 tests.\n");
  906. return 0;
  907. }
  908. #endif // DEBUG
  909. void lcd_moveto(int col, int row) {
  910. TRACE("Move to: (%d,%d)", col, row);
  911. _lcd_setcursor(col, row);
  912. }
  913. // return < 0 on error
  914. // return the advanced cols
  915. int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) {
  916. // find the HD44780 internal ROM first
  917. int ret;
  918. size_t idx = 0;
  919. hd44780_charmap_t pinval;
  920. hd44780_charmap_t localval;
  921. hd44780_charmap_t *copy_address = NULL;
  922. pinval.uchar = c;
  923. pinval.idx = -1;
  924. if (max_length < 1) return 0;
  925. // TODO: fix the '\\' that doesnt exist in the HD44870
  926. if (c < 128) {
  927. //TRACE("draw char: regular %d", (int)c);
  928. _lcd_write((uint8_t)c);
  929. return 1;
  930. }
  931. copy_address = NULL;
  932. ret = pf_bsearch_r((void *)g_hd44780_charmap_device, NUM_ARRAY(g_hd44780_charmap_device), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx);
  933. if (ret >= 0) {
  934. copy_address = (hd44780_charmap_t *)(g_hd44780_charmap_device + idx);
  935. } else {
  936. ret = pf_bsearch_r((void *)g_hd44780_charmap_common, NUM_ARRAY(g_hd44780_charmap_common), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx);
  937. if (ret >= 0) {
  938. copy_address = (hd44780_charmap_t *)(g_hd44780_charmap_common + idx);
  939. }
  940. }
  941. if (ret >= 0) {
  942. // found
  943. FU_ASSERT(NULL != copy_address);
  944. memcpy_P(&localval, copy_address, sizeof(localval));
  945. FU_ASSERT((localval.uchar == c) && (localval.uchar == pinval.uchar));
  946. TRACE("draw char: %" PRIu32 "(0x%" PRIX32 ") at ROM %d(+%d)", c, c, (int)localval.idx, (int)localval.idx2);
  947. _lcd_write(localval.idx);
  948. if (max_length >= 2 && localval.idx2 > 0) {
  949. _lcd_write(localval.idx2);
  950. return 2;
  951. }
  952. return 1;
  953. }
  954. // print '?' instead
  955. TRACE("draw char: Not found " PRIu32 "(0x%" PRIX32 ")", c, c);
  956. _lcd_write((uint8_t)'?');
  957. return 1;
  958. }
  959. /**
  960. * @brief Draw a UTF-8 string
  961. *
  962. * @param utf8_str : the UTF-8 string
  963. * @param len : the byte length of the string (returned by strlen(utf8_str) or strlen_P(utf8_str) )
  964. * @param cb_read_byte : the callback function to read one byte from the utf8_str (from RAM or ROM)
  965. * @param max_length : the pixel length of the string allowed (or number of slots in HD44780)
  966. *
  967. * @return the number of pixels advanced
  968. *
  969. * Draw a UTF-8 string
  970. */
  971. static int lcd_put_u8str_max_cb(const char * utf8_str, uint16_t len, uint8_t (*cb_read_byte)(uint8_t * str), pixel_len_t max_length) {
  972. wchar_t ch;
  973. uint8_t *p, *pend;
  974. pixel_len_t ret = 0;
  975. TRACE("BEGIN lcd_put_u8str_max_cb(len=%d, maxlen=%d)", len, max_length);
  976. pend = (uint8_t *)utf8_str + len;
  977. for (p = (uint8_t *)utf8_str; (p < pend) && (ret < max_length); ) {
  978. ch = 0;
  979. p = get_utf8_value_cb(p, cb_read_byte, &ch);
  980. if (NULL == p) {
  981. TRACE("No more char, break ...");
  982. break;
  983. }
  984. FU_ASSERT(ret < max_length);
  985. ret += lcd_put_wchar_max(ch, max_length - ret);
  986. }
  987. return (int)ret;
  988. }
  989. int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) {
  990. //TRACE("BEGIN lcd_put_u8str_max(str='%s', len=%d, maxlen=%d)", utf8_str, strlen(utf8_str), max_length);
  991. TRACE("BEGIN lcd_put_u8str_max(str='%s')", utf8_str);
  992. TRACE("BEGIN lcd_put_u8str_max('len=%d)", strlen(utf8_str));
  993. TRACE("BEGIN lcd_put_u8str_max(maxlen=%d)", max_length);
  994. return lcd_put_u8str_max_cb(utf8_str, strlen(utf8_str), read_byte_ram, max_length);
  995. }
  996. int lcd_put_u8str_max_rom(const char * utf8_str_P, pixel_len_t max_length) {
  997. //TRACE("BEGIN lcd_put_u8str_max_rom('%s', len=%d, maxlen=%d)", utf8_str_P, strlen_P(utf8_str_P), max_length);
  998. TRACE("BEGIN lcd_put_u8str_max_rom(len=%d)", strlen_P(utf8_str_P));
  999. TRACE("BEGIN lcd_put_u8str_max_rom(maxlen=%d)", max_length);
  1000. return lcd_put_u8str_max_cb(utf8_str_P, strlen_P(utf8_str_P), read_byte_rom, max_length);
  1001. }
  1002. #endif // DOGLCD
  1003. #endif // ULTRA_LCD