หน่วยแสดงผลเป็นอุปกรณ์ส่งออกที่สำคัญที่สุดในโครงการฝังตัวและผลิตภัณฑ์อิเล็กทรอนิกส์ 16x2 LCD เป็นหนึ่งในหน่วยแสดงผลที่มีคนใช้มากที่สุด 16x2 LCD หมายความว่ามีสองแถวที่สามารถแสดงอักขระได้ 16 ตัวต่อบรรทัดและแต่ละอักขระใช้พื้นที่เมทริกซ์ 5X7 บน LCD ในบทช่วยสอนนี้เราจะเชื่อมต่อโมดูล LCD 16X2 กับไมโครคอนโทรลเลอร์ 8051 (AT89S52) การเชื่อมต่อ LCD กับไมโครคอนโทรลเลอร์ 8051 อาจดูค่อนข้างซับซ้อนสำหรับมือใหม่ แต่หลังจากเข้าใจแนวคิดแล้วมันจะดูง่ายและสะดวกมาก แม้ว่าอาจต้องใช้เวลาเพราะคุณต้องทำความเข้าใจและเชื่อมต่อ LCD 16 พินเข้ากับไมโครคอนโทรลเลอร์ ก่อนอื่นมาทำความเข้าใจกับโมดูล LCD 16 พิน
เราสามารถแบ่งออกเป็นห้าประเภท Power Pins, contrast pin, Control Pins, Data pins และ Backlight pins
ประเภท |
หมายเลขพิน |
ชื่อพิน |
ฟังก์ชัน |
พาวเวอร์พิน |
1 |
VSS |
Ground Pin เชื่อมต่อกับกราวด์ |
2 |
VDD หรือ Vcc |
พินแรงดันไฟฟ้า + 5V |
|
คอนทราสต์พิน |
3 |
V0 หรือ VEE |
การตั้งค่าความคมชัดเชื่อมต่อกับ Vcc ตัวต้านทานตัวแปรอย่างละเอียด |
พินควบคุม |
4 |
อาร์เอส |
ลงทะเบียน Select Pin, RS = 0 Command mode, RS = 1 โหมดข้อมูล |
5 |
RW |
อ่าน / เขียนพิน RW = 0 โหมดเขียน RW = 1 โหมดการอ่าน |
|
6 |
จ |
เปิดใช้งานพัลส์สูงถึงต่ำจำเป็นต้องเปิดใช้งาน LCD |
|
หมุดข้อมูล |
7-14 |
D0-D7 |
หมุดข้อมูลเก็บข้อมูลที่จะแสดงบน LCD หรือคำสั่งคำสั่ง |
หมุดแบ็คไลท์ |
15 |
LED + หรือ A |
เพื่อเปิดไฟแบ็คไลท์ + 5V |
16 |
LED- หรือ K |
แบ็คไลท์กราวด์ |
พินทั้งหมดสามารถเข้าใจได้อย่างชัดเจนจากชื่อและฟังก์ชันยกเว้นพินควบคุมดังนั้นจึงมีการอธิบายไว้ด้านล่าง:
RS: RS คือพินลงทะเบียนเลือก เราจำเป็นต้องตั้งค่าเป็น 1 หากเรากำลังส่งข้อมูลบางอย่างเพื่อแสดงบน LCD และเราจะตั้งค่าเป็น 0 หากเราส่งคำสั่งคำสั่งเช่นล้างหน้าจอ (รหัสฐานสิบหก 01)
RW:นี่คือพินอ่าน / เขียนเราจะตั้งค่าเป็น 0 ถ้าเราจะเขียนข้อมูลบน LCD และตั้งค่าเป็น 1 หากเรากำลังอ่านจากโมดูล LCD โดยทั่วไปจะตั้งค่าเป็น 0 เนื่องจากเราไม่จำเป็นต้องอ่านข้อมูลจาก LCD ต้องอ่านคำสั่ง "รับสถานะ LCD" เพียงคำสั่งเดียวเท่านั้น
E:พินนี้ใช้เพื่อเปิดใช้งานโมดูลเมื่อให้พัลส์สูงถึงต่ำ ควรให้ชีพจร 450 ns การเปลี่ยนจากสูงเป็นต่ำทำให้โมดูลเปิดใช้งาน
มีคำสั่งคำสั่งที่ตั้งไว้ล่วงหน้าใน LCD ซึ่งเราได้ใช้ในโปรแกรมด้านล่างเพื่อเตรียม LCD (ในฟังก์ชัน lcd_init ()) คำสั่งคำสั่งที่สำคัญมีให้ด้านล่าง:
รหัส Hex |
Command to LCD Instruction Register |
0F |
เปิด LCD เคอร์เซอร์เปิด |
01 |
หน้าจอแสดงผลชัดเจน |
02 |
กลับบ้าน |
04 |
ลดเคอร์เซอร์ (เลื่อนเคอร์เซอร์ไปทางซ้าย) |
06 |
เคอร์เซอร์ที่เพิ่มขึ้น (เลื่อนเคอร์เซอร์ไปทางขวา) |
05 |
เลื่อนแสดงไปทางขวา |
07 |
เลื่อนหน้าจอไปทางซ้าย |
0E |
แสดงเปิดเคอร์เซอร์กะพริบ |
80 |
บังคับให้เคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดแรก |
C0 |
บังคับให้เคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดที่สอง |
38 |
2 บรรทัดและ 5 × 7 เมทริกซ์ |
83 |
บรรทัดเคอร์เซอร์ 1 ตำแหน่ง 3 |
3C |
เปิดใช้งานบรรทัดที่สอง |
08 |
แสดงปิดเคอร์เซอร์ปิด |
C1 |
ข้ามไปที่บรรทัดที่สองตำแหน่งที่ 1 |
OC |
แสดงเปิดเคอร์เซอร์ปิด |
C1 |
ข้ามไปที่บรรทัดที่สองตำแหน่งที่ 1 |
C2 |
ข้ามไปที่บรรทัดที่สองตำแหน่งที่ 2 |
แผนภาพวงจรและคำอธิบาย
แผนภาพวงจรสำหรับการเชื่อมต่อ LCD กับไมโครคอนโทรลเลอร์ 8051แสดงในรูปด้านบน หากคุณมีความเข้าใจพื้นฐานเกี่ยวกับ 8051 คุณต้องรู้เกี่ยวกับ EA (PIN 31), XTAL1 & XTAL2, RST pin (PIN 9), Vcc และ Ground Pin ของไมโครคอนโทรลเลอร์ 8051 ฉันใช้พินเหล่านี้ในวงจรด้านบนแล้ว หากคุณไม่มีความคิดเกี่ยวกับเรื่องนั้นฉันขอแนะนำให้คุณอ่านบทความนี้การเชื่อมต่อ LED กับไมโครคอนโทรลเลอร์ 8051 ก่อนที่จะเชื่อมต่อกับ LCD
นอกจากพินข้างต้นแล้วเราได้เชื่อมต่อพินข้อมูล (D0-D7) ของ LCD เข้ากับไมโครคอนโทรลเลอร์พอร์ต 2 (P2_0 - P2_7) และพินควบคุม RS, RW และ E เข้ากับขา 12,13,14 (พิน 2,3,4 ของพอร์ต 3) ของไมโครคอนโทรลเลอร์ตามลำดับ
PIN 2 (VDD) และ PIN 15 (แหล่งจ่ายไฟแบ็คไลท์) ของ LCD เชื่อมต่อกับแรงดันไฟฟ้า (5v) และ PIN 1 (VSS) และ PIN 16 (กราวด์แบ็คไลท์) เชื่อมต่อกับกราวด์
Pin 3 (V0) เชื่อมต่อกับแรงดันไฟฟ้า (Vcc) ผ่านตัวต้านทานตัวแปร 10k เพื่อปรับความคมชัดของ LCD ขากลางของตัวต้านทานแปรผันเชื่อมต่อกับ PIN 3 และอีกสองขาเชื่อมต่อกับแหล่งจ่ายแรงดันและกราวด์
คำอธิบายรหัส
ฉันพยายามอธิบายโค้ดผ่านความคิดเห็น (ในโค้ดเอง)
ดังที่ฉันได้อธิบายไว้ก่อนหน้านี้เกี่ยวกับโหมดคำสั่งและโหมดข้อมูลคุณจะเห็นว่าในขณะที่ส่งคำสั่ง (ฟังก์ชัน lcd_cmd) เราได้ตั้งค่า RS = 0, RW = 0 และชีพจร HIGH ถึง LOW ให้กับ E โดยทำให้เป็น 1 แล้วจึงเป็น 0 นอกจากนี้เมื่อส่งข้อมูล (ฟังก์ชั่น lcd_data) ไปยัง LCD เราได้ตั้งค่า RS = 1, RW = 0 และชีพจร HIGH ถึง LOW ให้กับ E โดยทำให้เป็น 1 ถึง 0 ฟังก์ชัน msdelay () ถูกสร้างขึ้นเพื่อสร้างความล่าช้าในหน่วยมิลลิวินาที และเรียกบ่อยในโปรแกรมจะเรียกเพื่อให้โมดูล LCD มีเวลาเพียงพอในการดำเนินการและคำสั่งภายใน
มีการสร้าง while loop เพื่อพิมพ์สตริงซึ่งเรียกใช้ฟังก์ชัน lcd_data ทุกครั้งเพื่อพิมพ์อักขระจนถึงอักขระตัวสุดท้าย (null terminator- '\ 0')
เราได้ใช้ฟังก์ชัน lcd_init () เพื่อให้ LCD พร้อมใช้งานโดยใช้คำสั่งคำสั่งที่ตั้งไว้ล่วงหน้า (อธิบายไว้ด้านบน)