นี่คือวิธีการสอนที่หกของเราของเรา PIC ชุดการสอนในการกวดวิชานี้เราได้เรียนรู้การเชื่อมต่อของ 16x2 แอลซีดีพร้อม PIC ไมโครคอนโทรลเลอร์ ในบทช่วยสอนก่อนหน้านี้เราได้เรียนรู้พื้นฐานของ PIC โดยใช้โปรแกรมไฟ LED กะพริบและได้เรียนรู้วิธีใช้ตัวจับเวลาในไมโครคอนโทรลเลอร์ PIC คุณสามารถตรวจสอบบทช่วยสอนทั้งหมดเกี่ยวกับ Learning PIC Microcontrollers โดยใช้คอมไพเลอร์ MPLABX และ XC8 ได้ที่นี่
บทช่วยสอนนี้จะเป็นสิ่งที่น่าสนใจเพราะเราจะเรียนรู้วิธีการเชื่อมต่อ LCD 16 × 2 กับ PIC16F877A ตรวจสอบวิดีโอโดยละเอียดในตอนท้ายบทช่วยสอนนี้ เป็นสมัยก่อนที่เราใช้ LED เพื่อบ่งชี้ผู้ใช้ มาดูกันว่าเราจะทำให้โครงการของเราดูเท่และมีประโยชน์มากขึ้นได้อย่างไรโดยใช้จอ LCD ตรวจสอบบทความก่อนหน้าของเราเกี่ยวกับการเชื่อมต่อ LCD กับ 8051 กับ Arduino พร้อม Raspberry Pi พร้อม AVR
ฟังก์ชั่นสำหรับเชื่อมต่อ LCD กับไมโครคอนโทรลเลอร์ PIC:
ที่จะทำให้สิ่งที่ง่ายขึ้นเราได้ทำขนาดเล็กห้องสมุดที่จะทำให้สิ่งที่ง่ายในขณะที่ใช้นี้แอลซีดีพร้อม PIC16F877A ไฟล์ส่วนหัว "MyLCD.h" มีให้ดาวน์โหลดที่นี่ซึ่งมีฟังก์ชันที่จำเป็นทั้งหมดในการขับเคลื่อน LCD โดยใช้ PIC MCU รหัสห้องสมุดอธิบายได้ดีด้วยบรรทัดความคิดเห็น แต่หากคุณยังมีข้อสงสัยติดต่อเราผ่านส่วนความคิดเห็น ตรวจสอบบทความนี้ด้วยสำหรับ Basic LCD ที่ใช้งานได้และ Pinouts
หมายเหตุ: ขอแนะนำให้ทราบว่าเกิดอะไรขึ้นในไฟล์ส่วนหัวของคุณเสมอเพราะจะช่วยคุณในการดีบักหรือในขณะที่เปลี่ยน MCU
ตอนนี้มีสองวิธีในการเพิ่มรหัสนี้ลงในโปรแกรมของคุณ คุณสามารถคัดลอกบรรทัดข้างบนทั้งหมดของโค้ดใน MyLCD.h และวางไว้ข้างหน้า void main () หรือคุณสามารถดาวน์โหลดไฟล์ส่วนหัวโดยใช้ลิงก์และเพิ่มลงในไฟล์ส่วนหัวของโปรเจ็กต์ของคุณ ( #include "MyLCD.h "; ) สามารถทำได้โดยคลิกขวาที่ไฟล์ส่วนหัวและเลือก เพิ่มรายการที่มีอยู่ และเรียกดูไฟล์ส่วนหัวนี้
ที่นี่ฉันได้คัดลอกและวางรหัสไฟล์ส่วนหัวลงในไฟล์ C หลักของฉัน ดังนั้นหากคุณใช้รหัสของเราคุณก็ไม่จำเป็นต้องดาวน์โหลดและเพิ่มไฟล์ส่วนหัวลงในโปรแกรมของคุณเพียงแค่ใช้รหัสที่สมบูรณ์ที่ระบุไว้ในตอนท้ายของบทช่วยสอนนี้ โปรดทราบว่าไลบรารีนี้จะรองรับเฉพาะไมโครคอนโทรลเลอร์ PIC PIC16F series เท่านั้น
ฉันกำลังอธิบายแต่ละฟังก์ชั่นภายในไฟล์ส่วนหัวด้านล่าง:
เป็นโมฆะ Lcd_Start (): ฟังก์ชันนี้ควรเป็นฟังก์ชันแรกที่ต้องเรียกใช้เพื่อเริ่มทำงานกับ LCD ของเรา เราควรเรียกใช้ฟังก์ชันนี้เพียงครั้งเดียวเพื่อหลีกเลี่ยงความล่าช้าในโปรแกรม
โมฆะ Lcd_Start () {Lcd_SetBit (0x00); สำหรับ (int i = 1065244; i <= 0; i--) NOP (); Lcd_Cmd (0x03); __delay_ms (5); Lcd_Cmd (0x03); __delay_ms (11); Lcd_Cmd (0x03); Lcd_Cmd (0x02); // 02H ใช้สำหรับ Return home -> ล้าง RAM และเริ่มต้น LCD Lcd_Cmd (0x02); // 02H ใช้สำหรับ Return home -> ล้าง 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 ของแถวที่ 1 จากนั้นฟังก์ชันจะเป็นโมฆะ Lcd_Set_Cursor (1, 5)
โมฆะ Lcd_Set_Cursor (ถ่าน a, ถ่าน 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); // ตั้ง Column} else if (a == 2) {temp = 0xC0 + b - 1; z = อุณหภูมิ >> 4; // 8 บิตที่ต่ำกว่า y = temp & 0x0F; // 8 บิตบน Lcd_Cmd (z); // ตั้งค่าแถว Lcd_Cmd (y); // ตั้งค่าคอลัมน์}}
โมฆะ Lcd_Print_Char (ข้อมูลถ่าน):เมื่อตั้งค่าเคอร์เซอร์แล้วเราสามารถเขียนอักขระไปยังตำแหน่งได้โดยเรียกฟังก์ชันนี้
โมฆะ Lcd_Print_Char (ข้อมูลถ่าน) // ส่ง 8 บิตผ่านโหมด 4 บิต {ถ่าน Lower_Nibble, Upper_Nibble; Lower_Nibble = ข้อมูล & 0x0F; Upper_Nibble = ข้อมูล & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 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 (ถ่าน * a):หากต้องการแสดงกลุ่มของอักขระก็จะสามารถใช้ฟังก์ชันสตริงได้
โมฆะ Lcd_Print_String (ถ่าน * a) {int i; สำหรับ (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // แยกสตริงโดยใช้พอยน์เตอร์และเรียกใช้ฟังก์ชัน Char}
ทุกครั้งที่เรียกใช้Lcd_Print_Char (ข้อมูลถ่าน) ค่าอักขระตามลำดับจะถูกส่งไปยังบรรทัดข้อมูลของ LCD อักขระเหล่านี้ไปถึง HD44780U ในรูปแบบของบิต ตอนนี้ IC นี้เชื่อมโยงบิตกับอักขระที่จะแสดงโดยใช้หน่วยความจำ ROM ดังแสดงในตารางด้านล่าง คุณสามารถค้นหาบิตสำหรับอักขระทั้งหมดในแผ่นข้อมูลของHD44780U LCD Controller
ตอนนี้เนื่องจากเราพอใจกับไฟล์ส่วนหัวของเราแล้วให้สร้างวงจรและทดสอบโปรแกรม ตรวจสอบไฟล์ส่วนหัวที่สมบูรณ์ที่ระบุในลิงค์ด้านบน
แผนภาพวงจรและการทดสอบ:
ด้านล่างนี้เป็นแผนภาพวงจรสำหรับการเชื่อมต่อ LCD 16x2 กับไมโครคอนโทรลเลอร์ 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 Pin No. |
1 |
พื้น |
พื้น |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
วี |
พื้น |
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 เป็นบวก |
+ 5V |
11 |
16 |
LED เชิงลบ |
พื้น |
12 |
ตอนนี้ให้เราทำการเชื่อมต่อถ่ายโอนรหัสไปยัง MCU ของเราและตรวจสอบผลลัพธ์
หากคุณมีปัญหาหรือข้อสงสัยโปรดใช้ส่วนความคิดเห็น ตรวจสอบวิดีโอสาธิตด้านล่างด้วย