רגע של עברית

השפה העברית היתה מאז ומתמיד קוץ בת…כנות מחשבים, הן בגלל כיוון הטקסט והן בגלל האותיות הגרפיות עצמן. הבעייתיות הזו לא פוסחת גם על עולם המיקרו-בקרים, ומסכי ה-LCD הטקסטואליים הנפוצים מאד והזולים שמבוססים על השבב HD44780 כלל אינם מסוגלים להציג עברית. זאת אומרת…

הבייט הלבן מגיש: רגע של עברית על LCD 1602
הבייט הלבן מגיש: רגע של עברית על LCD 1602

כל מייקר מכיר את מסכי ה-LCD הסופר-פופולריים האלה, וגם יודע – או מגלה מהר מאד – שהאותיות והסמלים שהם מסוגלים להציג צרובים עמוק בתוך השבב ואין שום דרך לשנות אותם. ליתר דיוק, יש שמונה אותיות (אינדקסים 0-7) שאפשר להגדיר כרצוננו כמפות של 5×8 פיקסלים, וכל שאר התווים (באנגלית, יפנית ו/או שפות אחרות) קבועים מראש. בעיקרון אפשר להזמין מהמפעל שבבים עם אותיות קבועות אחרות, אבל זה בהחלט לא פתרון ללקוחות פרטיים וקטנים. מי שמוכן להשקיע סכום גדול יחסית יכול גם לקנות בארץ מסך מותאם לעברית – אך אם אתם מוכנים להתפשר טיפה על קריאות הטקסט, יש גם דרך אחרת…

ערוץ 1602, דיווחי תנועה כל היום!
ערוץ 1602, דיווחי תנועה כל היום!

הרעיון מבוסס, כפי שבוודאי כבר הבנתם, על דמיון חזותי בין אותיות עבריות שונות לבין אותיות וסמלים לועזיים. יש לנו, כאמור, שמונה תווים שאנחנו יכולים לעצב חופשי. האם אפשר למצוא, בין כל התווים הקבועים בזיכרון שבב המסך, שמונה-עשרה מקבילות (אל תשכחו את הסופיות) לכל האותיות הנותרות?

עיון ב-datasheet ובדיקה מדגמית עם המסך עצמו גילו שהמסך שלי מכיר את התווים הקבועים הבאים:

טבלת התווים המובנים במסך זול מסין
טבלת התווים המובנים במסך זול מסין (מתוך ה-datasheet)

חיפשתי את הסמלים הדומים ביותר לאותיות בעברית, תוך כדי ניסויים בשטח (למשל, בשורה העליונה, איזו "פ" נראית טוב יותר על ה-LCD – התו השני משמאל בטור השמאלי או בטור הימני?), וגיליתי שעם קצת דמיון והרבה פשרות (כגון ערבוב בין דפוס לכתב), זה אפשרי.

השלב הבא היה למצוא דרך לומר לארדואינו אילו תווים אני רוצה בעצם להציג – הרי סביבת הפיתוח עצמה אינה מתייחסת לתווים עבריים כתווי ASCII רגילים, ולכן כל פעולה שקשורה בהם מסורבלת יותר (בידקו את האורך של מחרוזת עם עברית בעזרת הפוקנציה strlen ותראו שכל תו עברי "תופס" שני בייטים). הפתרון שבחרתי הוא תעתיק שמבוסס על אותיות בודדות: "A" תייצג את א', "B" את ב', "G" את ג' וכן הלאה. העניינים קצת הסתבכו עם ח', ע', צ', ש' ו-ת', אבל אלתרתי להן פתרונות. לדוגמה, התו "@" (שטרודל) הוא ש'. לאותיות סופיות השתמשתי באותיות אנגליות קטנות – אם M היא מ' אז m היא ם סופית.

יצרתי מערך שמופיעות בו, לסירוגין, האותיות המייצגות והאותיות המיוצגות. כשאני נותן לפונקציה שכתבתי מחרוזת כמו "@LVm", היא מחפשת כל תו במקומות האי-זוגיים במערך, ואם הוא נמצא, מחזירה לי את התו שמיד אחריו, וכך מתקבל הרצף "שלום".

כולם אוהבים פיצה
כולם אוהבים פיצה

על סמך הפונקציה הזו, כתבתי פונקציה שתדע לכתוב את המחרוזת מהסוף להתחלה, כדי שהתוצאה הסופית תיראה כאילו נכתבה מימין לשמאל. הנה כל חלקי הקוד הרלוונטיים:

byte convert[] = {'A', 0x02, 'B', 0xD5, 'G',   0xB5, 'D', 0x03, 'H', 0xCA, 'V', 0x6C, 'Z', 0x04, 'X', 0x6E, 't', 0xDA, 'Y', 0xA5, 'C', 0xBA, 'c', 0x06, 'L', 0xB9, 'M', 0x4E, 'm', 0xE6, 'N', 0xC9, 'n', 0x05, 'S', 0x4F, 'U', 0xBF, 'P', 0xC0, 'f', 0x07, 'J', 0x00, 'j', 0xE4, 'K', 0xB1, 'R', 0x01, '@', 0x57, 'T', 0xF7, ' ', 0x20, '\0'};

char getHebChar(char c) {
  
  byte b = 0;
  while (convert[b]) {
    if (convert[b] == c) return convert[b + 1];
    b += 2;
  } 
  
  return c;
  
}

void hebWrite(const char x, 
              const char y, char *p) {

  byte l = strlen(p);
  
  p = p + l - 1;
  lcd.setCursor(x - l, y);
  while (l--) lcd.write(getHebChar(*p--)); 
  
}

הדבר היחיד שחסר כאן הוא מפות הפיקסלים עבור האותיות שאין להן מקבילה מתאימה: צ', א', ר', ד', ז', ן', ף' ו-ך'. את זה אני משאיר לכם כתרגיל, ואפשר להיעזר בדוגמה שמגיעה עם סביבת הפיתוח, בתפריט File -> Examples -> LiquidCrystal -> CustomCharacter. בהצלחה!

להרשמה
הודע לי על
8 Comments
מהכי חדשה
מהכי ישנה לפי הצבעות
Inline Feedbacks
הראה את כל התגובות

https://github.com/Boris4K/LCD_1602_HEB
עשיתי ספריה שמאפשרת להציג 8 תוים בו זמנית בעברית

טריק מגניב. משומה הוא מזכיר לי(אולי בגלל החג…) את הברכה הקלאסית של רצף לא הגיוני של אותיות באנגלית שכשאתה הופך את המשפט ב180 מעלות אתה מגלה שכתוב "חג פסח שמח וכשר". הפוסט שלך גרם לי לתהות דבר מה. מסכי LCD ככל הנראה עובדים על שיטת הscanning(שכל פעם שורה נפרדת אחרת דולקת), אז מה יקרה אם ננסה ליישם מודל דומה על מנת להצליח לכתוב משפט עם יותר מ8 אותיות שונות בעברית? זאתאומרת שבמקום שנגדיר 8 בייטים נפרדים עבור 8 אותיות עבריות נגדיר רק בייט אחד אשר כל פעם יהיה בו תוכן אחר עבור אות עברית אחרת. מבין לאן אני חותר? כל… לקרוא עוד »

נראה לי שהשימוש העיקרי בזה יהיה קאפצ'ה 🙂

קראתי איפשהו שאפשר ליצור עד 3 או מספר מסויים של תווים ייחודיים בספריה

אה לא משנה מה שעשית זה מה שהתכוונתי 😉