เดี๋ยวนี้หากใครที่เป็น Hobbyist ที่ชอบทำโครงงานอิเล็กทรอนิกส์ ยิ่งโดยเฉพาะพวกไมโครคอนโทรลเลอร์ที่จะต้องเอาอุปกรณ์แสดงผลอย่าง LCD Module มาต่อใช้งาน และสามารถหาซื้อ LCD Module ได้อย่างแพร่หลายและราคาถูกกว่าแต่ก่อนมาก ส่วนมากที่มีขายในท้องตลาดก็จะเป็นหน้าจอขนาด 16, 20 หรือ 24 ตัวอักษร และแสดงผลแบบ 2 หรือ 4 บรรทัด
ส่วนวิธีการนำมาต่อเข้ากับไมโครคอนโทรลเลอร์และการเขียนโปรแกรมควบคุมก็ทำได้โดยง่าย สามารถดาวโหลด Datasheet และมี Clip ใน Youtube อธิบายวิธีการเชื่อมต่อสายสัญญานและเขียนโปรแกรมควบคุมให้ดูมากมาย
ผมเองสมัยเรียนไม่มีอุปกรณ์พวกนี้ให้ซื้อหามาใช้งาน จนเรียนจบได้ทำงานในโรงงานซึ่งมีการใช้ LCD Module นี้กับผลิตภัณฑ์ของบริษัทเยอะมาก (หน้าจอแสดงผลของเครื่องโทรศัพท์) และก็เพราะทำงานอยู่แผนก Engineer ที่สามารถค้นหา Data sheet มาดูการอธิบายการเชื่อมต่อและใช้งานของมันได้
เวลาว่างจากเวลางานผมเลยมักจะเอาอุปกรณ์ในโรงงานมาเชื่อมต่อกับไมโครคอนโทรลเลอร์และเขียนโปรแกรมควบคุมมันเล่นว่าจะควบคุมมันได้ตามที่เราเข้าใจจากการอ่าน Datasheet ของมันหรือไม่
สิ่งที่อยากเอามาแชร์ก็คือว่าหลายๆ ครั้งที่ผมลองดาวโหลด Datasheet ของ LCD Module ในอินเตอร์เน็ต บางครั้ง LCD Module แต่ละผู้ผลิตได้ให้ข้อมูลที่ไม่ละเอียดมากพอและ Clip สอนการต่อใช้งานก็สอนแบบให้ต่อใช้งานได้แบบเบื้องต้น แต่มักจะไม่ได้อธิบายการใช้คำสั่งพิเศษต่างๆ ที่มันมีให้ใช้งาน (จริงๆ เขาอธิบายมันไว้ในตารางคำสั่งแบบรวบย่อ มีเฉพาะของบางผู้ผลิตที่เขาแจกแจงออกมาเป็นคำสั่งควบคุมอย่างละเอียด)
และหากใครเล่นพวก MCU ใหม่ๆ ที่ปัจจุบันเขานิยมกัน เช่น Arduino, ESPxxxx, ฯลฯ ที่ส่วนมากจะสอนให้เขียนโปรแกรมควบคุมด้วยภาษา C ก็มักจะยกตัวอย่างให้รู้แค่ว่าต้องส่งคำสั่ง Setup อย่างไร และส่งข้อความออกไปอย่างไร (ส่งตำแหน่งที่จะแสดงผลหน้าจอ และตามด้วยส่งข้อความ) โดยไม่ได้แจกแจงลูกเล่นอื่นๆ ของมัน (หรืออาาจะมีบางคนทำ Clip สอนการใช้งานอย่างละเอียด เพียงแต่ผมยังไม่ผ่านตา)
ผมจึงอยากนำเกร็ดเล็กๆ จากประสบการณ์การใช้งานส่วนหนึ่งมาเล่าให้ฟัง เผื่อว่าอาจจะเป็นประโยชน์สำหรับใคร โดยปกติหากต้องการต่อใช้งาน LCD Module และดึงความสามารถของมันออกมาใช้งานอย่างเต็มที่จะต้องต่อสายสัญญานต่างๆ โดยให้มองว่า LCD Module เป็นเสมือนหน่วยความจำตัวหนึ่งที่สามารถทำได้ทั้งอ่านและเขียนข้อมูล
แต่บางครั้งอาจจะด้วยการออกแบบวงจรควบคุม เราก็อาจจะเชื่อมต่อสายสัญญานให้ตัว LCD Module ถูกเขียนได้อย่างเดียวก็ได้ (รับข้อมูลที่เป็น Command หรือ Data อย่างเดียว โดยไม่สามารถอ่านข้อมูลกลับออกไป) เช่นหากนำไปต่อกับ IC 8255 เป็นต้น ซึ่งหากทำเช่นนี้ แล้วเราต้องการจะใช้ Function พิเศษต่างๆ อาจจะงงได้ง่ายๆ หรือทำไม่ได้ เช่นการเลื่อนข้อความซ้ายขวา ผู้เขียนโปรแกรมควบคุมจะต้องสร้าง Flag หรือตัวทดให้คอยจดจำว่า ณ เวลานั้นๆ ข้อความบนหน้าจอเปลี่ยนไปอย่างไร
ประสบการณ์ที่ผมเคยเขียนโปรแกรมควบคุมมันก็คือ (ไม่ว่าจะต่อ LCD Module ตรงกับระบบบัสของ MCU เพื่อให้มองเห็นเป็นเสมือน RAM ที่จะสามารถทำได้ทั้งอ่านและเขียน ต่อผ่านพอร์ทของ IC-8255 เพื่อรับคำสั่งหรือข้อมูลอย่างเดียว (อ่านกลับไม่ได้)
สิ่งที่ผมทำก็คือการออกแบบให้มี Virtual RAM บนตัว MCU ให้ทำหน้าที่เป็นเสมือน Buffer ชั่วคราวแล้วเมื่อ MCU ต้องการจะเขียนข้อมูลหรือสร้างลูกเล่นต่างๆ บนหน้าจอ LCD ก็ให้ทำกับ Virtual RAM เช่นการทำให้ข้อความเลื่อนซ้าย/ขวา การเลื่อนเคอร์เวอร์ขึ้นลงซ้ายขวา หรือเลื่อนลบข้อความก่อนหน้า แล้วจึงเขียนโปรแกรม Dump ข้อมูลใน Virtual RAM นี้ขึ้นไปบน LCD อีกทีหนึ่งเสมือนกับมีหน่วยความจำสองส่วนซ้อนทับขนานกันอยู่ ประโยชน์ที่ได้ของวิธีนี้คือเราสามารถที่จะเพิ่ม Function หรือลูกเล่นพิเศษอื่นๆ ให้กับข้อความบนหน้าจอมากกว่าคำสั่งควบคุมหน้าจอของตัว LCD ที่มันมีมาให้
รูปภาพที่ผมลงไว้นั้นแสดงตำแหน่ง Address ของ DDRAM ของตัวอักษรแต่ละตำแหน่งบนหน้าจอ จากรูปเป็นจอ LCD แบบ 4 บรรทัดและบรรทัดละ 20 ตัวอักษร ในแต่ละบรรทัดผมเขียนตำแหน่ง Address ไว้สองแถวคือบนและล่าง แถวบนเป็นตำแหน่ง address มาตรฐานที่มากับตัว LCD Module (ทุกๆ ยี่ห้อเหมือนกัน) ส่วนตัวเลข Address แถวล่างเป็นตำแหน่งของหน่วยความจำในตัว MCU ของ MCS-51 ซึ่งเป็นหน่วยความจำแรมภายใน 128 byte ส่วนบน และผมดึงมาใช้งานจำนวน 80 byte (B0h-FFh) ซึ่งผู้ใช้งานจะออกแบบเป็นอย่างไรก็ได้
กลับมาที่ตำแหน่งหน่วยความจำมาตรฐานของ LCD ยกตัวอย่างจากภาพ บรรทัดที่ 1 และอักษรตัวที่ 1จะเริ่มจาก 80h และไล่เรียงไปเรื่อยจนจบบรรทัดที่ตัวอักษรตัวที่ 20 ซึ่งค่าตำแหน่งจะเป็น 93h และถ้าสังเกตให้ดีจะเห็นว่าตำแหน่งหน่วยความจำลำดับถัดไปซึ่งคือ 94h จะไปเริ่มที่ตัวอักษรตัวแรกของบรรทัดที่ 3 (ทำไม?) ส่วนตำแหน่งตัวษรตัวแรกของบรรทัดที่ 2 จะมี Address เป็น C0h ซึ่งผู้ใช้งานต้องระมัดระวังในการเขียนโปรแกรมควบคุม (แต่หากเขียนด้วยภาษา C อย่างใน Arduino อาจจะไม่ต้องคำนึงปัญหาพวกนี้เพราะเขาระมัดระวังให้อยู่แล้ว แต่ก็จำไว้ด้วยว่ายิ่งง่ายเท่าใดก็ยิ่งขาดความยืดหยุ่น)
หากอธิบายในอีกมุมมองหนึ่งก็คือจะบอกว่าจริงๆ แล้วตัว LCD Module นั้นมันออกแบบมาให้มีหน่วยความจำอยู่สองส่วน และแต่ละส่วนนี้ไม่ได้ต่อเนื่องกัน โดยปกติหน่วยความจำส่วนที่หนึ่งจะเริ่มจาก 80h – A7h (40 address) ซึ่งเป็นพื้นที่การแสดงผลของบรรทัดที่ 1และส่วนที่สองเริ่มจาก C0h – E7h (40 address) เป็นพื้นที่การแสดงผลของบรรทัดที่ 2 ดังนั้นจะเห็นว่าผู้ออกแบบเขากันพื้นที่ไว้ส่วนละ 40 ตำแหน่ง แต่บนหน้าจอจะแสดงได้เท่าไหร่ก็แล้วแต่ Spec. ของหน้าจอที่ทำออกมาขาย (จอขนาด 16, 20, 24, ฯลฯ อักษร) ดังนั้นหากมีการเขียนข้อมูลเลยขอบเขตของหน้าจอไป ข้อมูลตัวอักษรนั้นๆ ก็จะไม่สามารถแสดงผลให้ได้เห็นออกมาบนหน้าจอ ซึ่งผู้เขียนโปรแกรมควบคุมจะต้องใช้คำสั่งที่ตัว LCD มีมาให้สั่งให้มีการเลื่อนข้อความไปทางซ้ายหรืออื่นๆ ตามต้องการ
และด้วยความที่หน่วยความจำสองส่วนนี้ไม่ต่อกัน ดังนั้นหากข้อความแต่ละบรรทัดมีความยาวเกินหน้าจอ ก็ไม่ได้หมายความว่าข้อความส่วนที่ล้นเกินบรรทัดบนจะไปแสดงยังบรรทัดถัดไปให้โดยอัตโนมัติ
แต่ในกรณีหน้าจอถูกออกแบบให้มี 4 บรรทัด และบรรทัดละ 20 ตัวอักษร (ดังรูปตัวอย่าง) ก็เลยจะเห็นว่า ตำแหน่งของตัวอักษรของบรรทัดที่ 3 จะใช้หน่วยความจำ address ที่ช่วงเดียวกันกับของบรรทัดที่ 1 และบรรทัดที่ 4 ก็เช่นกันคือใช้หน่วยความจำส่วนเดียวกันกับของบรรทัดที่สอง
อ่านดูอาจจะเข้าใจยากสักหน่อย ยิ่งหากไม่ได้อยู่ในสายคอมพิวเตอร์หรืออิเล็กโทรนิกส์อาจจะเข้าใจยาก แต่สิ่งที่ผมอธิบายมานี้คือหากไม่ได้อ่าน Datasheet อย่างละเอียดก็จะไม่เข้าใจ (อย่างที่บอกว่า Datasheet ของบางผู้ผลิตก็ไม่ได้ให้ข้อมูลรายละเอียดส่วนนี้มา) และที่สำคัญที่สุดคือหากไม่เคยได้ลองเล่นหรือใช้งานมันก็ยากที่จะเข้าใจมันอย่างลึกซึ้ง
ผมเองก็ไม่ได้เล่นทุกๆ Function ของมันทั้งหมดหรอกนะครับ แต่เอาเฉพาะส่วนที่เคยเล่นและเข้าใจมาอธิบายให้ฟังครับเผื่อว่าจะเป็นประโยชน์บ้างสำหรับบางคน