זוהי ההדרכה השישית שלנו בסדרת הדרכות PIC שלנו, במדריך זה אנו לומדים ממשק של 16x2 LCD עם מיקרו-בקר PIC. בהדרכות הקודמות שלנו למדנו את יסודות PIC באמצעות כמה תוכניות מהבהבות LED ולמדנו גם כיצד להשתמש בטיימרים במיקרו-בקר PIC. תוכלו לבדוק כאן את כל המדריכים בנושא למידת PIC מיקרו-בקרים באמצעות מהדר MPLABX ו- XC8.
הדרכה זו תהיה מעניינת מכיוון שנלמד כיצד לממשק 16 × 2 LCD עם PIC16F877A, עיין בסרטון המפורט בסוף הדרכה זו. חלפו הימים העתיקים שבהם השתמשנו בנוריות לד עבור אינדיקציות למשתמש. בואו נראה כיצד נוכל לגרום לפרויקטים שלנו להיראות מגניבים ושימושיים יותר באמצעות צגי LCD. בדוק גם את המאמרים הקודמים שלנו על ממשק LCD עם 8051, עם Arduino, עם Raspberry Pi, עם AVR.
פונקציות לממשק LCD עם מיקרו-בקר PIC:
כדי להקל על הדברים, יצרנו ספרייה קטנה שיכולה להקל על הדברים תוך שימוש ב- LCD עם ה- PIC16F877A שלנו. קובץ הכותרת "MyLCD.h" ניתן כאן להורדה, המכיל את כל הפונקציות הדרושות בכדי להניע את ה- LCD באמצעות PIC MCU. קוד הספרייה מוסבר היטב על ידי שורות תגובה, אך אם עדיין יש לך ספק, הגע אלינו דרך קטע התגובות. בדוק גם במאמר זה לגבי עבודות LCD בסיסיות ופינאוטים שלו.
הערה: תמיד מומלץ לדעת מה קורה בפועל בתוך קובץ הכותרת מכיוון שזה יעזור לך באיתור באגים או תוך שינוי ה- MCU.
כעת, ישנן שתי דרכים להוסיף קוד זה לתוכנית שלך. באפשרותך להעתיק את כל שורות הקוד שלמעלה ב- MyLCD.h ולהדביק אותן לפני ה- main ריק (). לחלופין, תוכל להוריד את קובץ הכותרת באמצעות הקישור ולהוסיף אותם לקובץ הכותרת של הפרויקט שלך ( # כלול " MyLCD.h "; ). ניתן לעשות זאת על ידי לחיצה ימנית על קובץ הכותרת ובחירה הוסף פריט קיים ודפדוף לקובץ כותרת זה.
כאן העתקתי והדבקתי את קוד קובץ הכותרת בקובץ C הראשי שלי. אז אם אתה משתמש בקוד שלנו, אז אינך צריך להוריד ולהוסיף את קובץ הכותרת לתוכנית שלך, פשוט השתמש בקוד השלם שניתן בסוף הדרכה זו. שים לב גם שספרייה זו תתמוך רק במיקרו-בקר PIC16F מסדרת PIC16F.
הנה אני מסביר כל פונקציה בתוך קובץ הכותרת שלנו למטה:
בטל Lcd_Start (): פונקציה זו צריכה להיות הפונקציה הראשונה שיש להתקשר כדי להתחיל לעבוד עם ה- LCD שלנו. עלינו להתקשר לפונקציה זו פעם אחת בלבד כדי למנוע פיגור בתוכנית.
בטל Lcd_Start () {Lcd_SetBit (0x00); עבור (int i = 1065244; i <= 0; i--) NOP (); Lcd_Cmd (0x03); __השהיית_מס (5); Lcd_Cmd (0x03); __השהיית_מס (11); Lcd_Cmd (0x03); Lcd_Cmd (0x02); // 02H משמש לחזרה הביתה -> מנקה את ה- RAM ומאתחל את ה- LCD Lcd_Cmd (0x02); // 02H משמש לחזרה הביתה -> מנקה את ה- RAM ומאתחל את ה- LCD Lcd_Cmd (0x08); // בחר שורה 1 Lcd_Cmd (0x00); // נקה שורה 1 להציג Lcd_Cmd (0x0C); // בחר שורה 2 Lcd_Cmd (0x00); // נקה תצוגה של שורה 2 Lcd_Cmd (0x06); }
Lcd_Clear (): פונקציה זו מנקה את מסך ה- LCD וניתן להשתמש בה בתוך לולאות כדי לנקות את מראה הנתונים הקודמים.
Lcd_Clear () {Lcd_Cmd (0); // נקה את LCD Lcd_Cmd (1); // העבר את הסמן למיקום הראשון}
ריק Lcd_Set_Cursor (x pos, y pos): ברגע שהתחלנו, ה- LCD שלנו מוכן לקבל פקודות, אנו יכולים להורות ל- LCD לקבוע את הסמן במיקום המועדף עליכם באמצעות פונקציה זו. נניח אם, אנחנו צריכים את הסמן בתו 5 בשורה הראשונה. ואז הפונקציה תבטל Lcd_Set_Cursor (1, 5)
בטל Lcd_Set_Cursor (char a, char b) {char temp, z, y; אם (a == 1) {temp = 0x80 + b - 1; // 80H משמש להזזת הסמן z = temp >> 4; // תחתון 8 סיביות y = temp & 0x0F; // עליונות 8 סיביות Lcd_Cmd (z); // הגדר שורה Lcd_Cmd (y); // הגדר עמודה} אחרת אם (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // תחתון 8 סיביות y = temp & 0x0F; // עליונות 8 סיביות Lcd_Cmd (z); // הגדר שורה Lcd_Cmd (y); // הגדר עמודה}}
בטל Lcd_Print_Char (נתוני char): לאחר הגדרת הסמן נוכל לכתוב תו למיקומו על ידי קריאה פשוטה לפונקציה זו.
בטל Lcd_Print_Char (נתוני char) // שלח 8 סיביות דרך מצב 4 סיביות {char Lower_Nibble, Upper_Nibble; Lower_Nibble = נתונים & 0x0F; Upper_Nibble = נתונים & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (עליון הנשכש >> 4); // שלח את המחצית העליונה על ידי שינוי 4 EN = 1; עבור (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // שלח מחצית תחתונה EN = 1; עבור (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
בטל Lcd_Print_String (char * a): אם תוצג קבוצת תווים, ניתן להשתמש בפונקציית המחרוזת.
בטל Lcd_Print_String (char * a) {int i; עבור (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // פצל את המחרוזת באמצעות מצביעים וקרא לפונקציה Char}
בכל פעם שקוראים ל- Lcd_Print_Char (נתוני char) , ערכי התווים שלו נשלחים לקווי הנתונים של ה- LCD. תווים אלה מגיעים ל- HD44780U בצורה של ביטים. כעת IC זה מתייחס לסיביות לדמות שתוצג באמצעות זיכרון ה- ROM שלה כמוצג בטבלה שלהלן. אתה יכול למצוא ביטים לכל התווים בגליון הנתונים של בקר HD44780U LCD.
עכשיו, מכיוון שאנחנו מרוצים מקובץ הכותרת שלנו בואו נבנה את המעגל ונבדוק את התוכנית. בדוק גם את קובץ הכותרת השלם המופיע בקישור המופיע למעלה.
דיאגרמת מעגל ובדיקה:
להלן תרשים המעגל לממשק 16x2 LCD עם מיקרו-בקר PIC.
לא הראיתי את ספק הכוח או את חיבור ICSP במעגל שלעיל, מכיוון שאנו משתמשים באותו לוח בו השתמשנו במדריך הקודם, בדוק כאן.
דבר חשוב שיש לשים לב אליו בתוכנית הוא הגדרות הסיכה של LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
ניתן לשנות את הגדרות הסיכה הללו בהתאם להגדרת החומרה של המתכנתים. זכור לשנות את תצורת היציאה המכובדת בפונקציה הראשית אם אתה משנה כאן.
החומרה לפרויקט זה מאוד פשוטה. אנו הולכים לעשות שימוש חוזר באותו מודול PIC בו השתמשנו בפעם האחרונה ולחבר את מודול ה- LCD ל- PIC שלנו באמצעות חוטי מגשר.
ניתן להבין את הקשר על ידי הטבלה הבאה:
פין LCD מס ' |
שם פין LCD |
שם פין MCU |
מספר סיכה של MCU |
1 |
קרקע, אדמה |
קרקע, אדמה |
12 |
2 |
VCC |
+ 5 וולט |
11 |
3 |
VEE |
קרקע, אדמה |
12 |
4 |
בחר הרשמה |
RD2 |
21 |
5 |
קרוא וכתוב |
קרקע, אדמה |
12 |
6 |
לְאַפשֵׁר |
RD3 |
22 |
7 |
נתונים נתונים 0 |
NC |
- |
8 |
נתונים נתונים 1 |
NC |
- |
9 |
נתונים ביט 2 |
NC |
- |
10 |
נתונים נתונים 3 |
NC |
- |
11 |
נתונים נתונים 4 |
RD4 |
27 |
12 |
נתונים ביט 5 |
RD5 |
28 |
13 |
נתונים נתונים 6 |
RD6 |
29 |
14 |
נתונים ביט 7 |
RD7 |
30 |
15 |
LED חיובי |
+ 5 וולט |
11 |
16 |
LED שלילי |
קרקע, אדמה |
12 |
עכשיו בואו פשוט נבצע את החיבורים, נזרוק את הקוד ל- MCU שלנו ונוודא את הפלט.
אם יש לך בעיות או ספקות, אנא השתמש בסעיף ההערות. בדוק גם את סרטון ההדגמה המופיע להלן.