06 July 2012

MAX7219 ตัวช่วยสำหรับ LED Display

Updated on

        พอดีงานเจ้าของบล็อกอยากจะลองใช้ไมโครฯติดต่อ SPI แล้วทีนี้ก็มีคนแนะนำเจ้า MAX7219 มา ก็เลยลองดูปรากฏว่าไอเจ้า MAX7219 นี้ หาข้อมูลได้น้อยมาก แล้วก็มารู้ทีหลังว่ามีอายุมาเป็นสิบๆปีละ

        เจ้าของบล็อกไปเจอตัวอย่างของ ETT เป็นแอสเซมบลีของ Z80 (เจ้าของบล็อกไม่ค่อยถูกกับแอสเซมบลีซักเท่าไร) ก็เลยเป็นที่มาของบทความครั้งนี้แหละเผื่อยังมีผู้ที่หลงเข้ามาอ่านที่มาหาข้อมูลการใช้ไอซีเบอร์นี้

        สำหรับเจ้า MAX7219 นี้มาจาก MAXIM โดยมีชื่อเต็มว่า Serially Interfaced 8-Digit LED Display Drivers หรือก็คือไอซีขับ LED 8 หลักนั่นเอง ขึ้นอยู่กับว่าจะใช้กับอะไร โดยเจ้าของบล็อกเอาไปใช้กับ 7-segment จำนวน 8 หลัก วงจรทั้งหมดก็จะมีดังนี้ (กดเพื่อขยายดูรูปได้)



        ทีนี้ จะใช้ยังไงล่ะ? สำหรับวิธีการติดต่อแบบ SPI ไม่ขอพูดถึงนะ จะเข้าเรื่อง Address ของไอซีเบอร์นี้ไปเลย เอาเข้าจริงๆแล้วเจ้าตัวนี้ใช้โคตรง่ายเลย แต่ตอนหาข้อมูลมาอ่านแล้วงงซะงั้น

        อัตราการส่งข้อมูลใช้ได้สูงสุดที่ 10MHz เลยทีเดียว การส่งข้อมูลก็ใช้ขนาด 16 บิตเหมือนทั่วไปน่ะแหละ 8 บิตสูงเป็น Address ส่วนอีก 8 บิตต่ำเป็น Data สำหรับ Address ก็จะมีดังนี้


        ** X คือค่าอะไรก็ได้ ไม่มีผลต่อคำสั่ง ในบทความนี้จะใช้เป็น 0 จะได้ดูง่าย **

DECODE MODE (0x09)

        เริ่มด้วยคำสั่ง Decode Mode ก่อน เพราะมีผลกับค่าที่กำหนดให้แต่ละหลัก สำหรับ Decode Mode จะเป็นการกำหนดว่าจะกำหนดเป็นรหัส BCD หรือไม่ เพราะในการใช้งาน 7-segment อย่างเช่นเลข 0 ก็จะเป็น 0x7E เลข 5 เป็น 0x5B เป็นต้น แต่การใช้ BDC จะช่วยให้สะดวกขึ้น จากเลข 0 ที่ใช้ 0x7E ก็จะเป็น 0x00 ได้เลย เลข 5 ก็ใช้เป็น 0x05 ได้เลย ไม่ต้องมาสร้างอาร์เรย์เก็บรูปแบบการแสดงตัวเลขละ

        ในการกำหนด Decode Mode จะกำหนดได้ตั้งแต่ 0x00 ถึง 0xFF โดยที่ 0x00 คือไม่มีการใช้ BCD และ 0xFF คือใช้ BCD ทุกหลัก ถ้าเป็น 0x3A ก็จะเป็น DIGIT 5, 4, 3, 1 ที่ใช้ BCD (00111010B) (เลข 1 ในแต่ละบิตแทนที่การใช้ BCD ในหลักนั้นๆ และ 0 คือไม่ใช้ BCD ) และถ้าเป็น 0x85 ก็จะเป็น DIGIT 7, 2, 0 ที่ใช้ BCD (10000101

        ตัวอย่าง การใช้งาน 0x0900 หรือ { 0x09, 0x00 } (ไม่ใช้ BCD) โดยรูปแบบของตัวแปรที่ส่งเป็นข้อมูลออกมาขึ้นอยู่กับไมโครฯที่ใช้นะ

DIGIT 0 - DIGIT 7 (0x01 - 0x08)

        อันนี้ก็ไม่มีอะไรซับซ้อน อยากกำหนดหลักไหนก็ส่ง Address ด้วยด้วย Data สำหรับ Data ก็จะมีดังนี (กดที่ภาพเพื่อขยายภาพได้)


        ** สำหรับแบบไม่ใช้ BCD ก็สามารถกำหนดได้มากกว่าในตาราง และ X คือค่าอะไรก็ได้ ไม่มีผลต่อคำสั่ง ในบทความนี้จะใช้เป็น 0 จะได้ดูง่าย **

        โดย Data ที่ว่าก็ขึ้นอยู่กับว่า Decode Mode กำหนดเป็นแบบไหน ถ้าใช้ BCD ก็ดูฝั่ง BCD Mode ถ้าไม่ใช้ก็ให้ดูฝั่ง No BCD

        ทีนี้มาดูที่ฝั่ง BCD Mode ก่อนละกัน จะเห็นว่า D6-D4 เป็น X ซึ่งเป็นค่าที่ไม่มีนัยยะสำคัญ เจ้าของบล็อกขอใช้เป็น 0 ละกัน และ D7 สำหรับกรณีที่ต้องการให้จุดทศนิยมหรือ DP ติด (0 : ดับ, 1 : ติด)

        ตัวอย่าง ต้องการให้ DIGIT 5 แสดงเลข 6 ไม่มีจุด จะเป็น 0x0606 หรือ { 0x06, 0x06 } ต้องการให้ DIGIT 0 แสดงเลข 2 มีจุด จะเป็น 0x0302 หรือ { 0x03, 0x02 }

        ต่อมาดูฝั่ง No BCD กันบ้าง ซึ่ง DP ก็จะเหมือนกับ D7 ของ BCD MODE สำหรับเลขก็จะเรียงจาก 0 ถึง 9 ดังนี้ (เหมือนตอนใช้กับ 7-segment ปกตินั่นแหละ) 0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, 0x7F, 0x7B ในกรณีที่ต้องการเพิ่มจุดลงไป เรียงจาก 0-9 ก็จะเป็น (เอาไปใช้ได้เลย จะได้ไม่ต้องคิดเอง) 0xFE, 0xB0, 0xED, 0xF9, 0xB3, 0xDB, 0xDF, 0xF0, 0xFF, 0xFB

        ตัวอย่าง ต้องการให้ DIGIT 6 แสดงเลข 9 ไม่มีจุด จะเป็น 0x077B หรือ { 0x07, 0x7B } ต้องการให้ DIGIT 0 แสดงเลข 1 มีจุด ก็จะเป็น 0x01B0 หรือ { 0x01, 0xB0 }

INTENSITY (0x0A)

        สำหรับกำหนดความสว่างของไฟ LED หรือ 7-segment โดยกำหนดค่าได้ตั้งแต่ 0-15 (0x00 - 0x0F) ก็จะสว่างจากน้อยไปมาก

        ตัวอย่าง สว่างประมาณครึ่งนึงจะเป็น 0x0A07 หรือ { 0x0A, 0x07 } สว่างต่ำสุดจะเป็น 0x0A00 หรือ { 0x0A, 0x00 }

SCAN LIMIT (0x0B)

        สำหรับการกำหนดว่าจะให้แสดงหลักไหนบ้าง มีค่าตั้งแต่ 0-7 (0x00 - 0x07) (แหงล่ะ บางงานก็ไม่ได้อยากแสดงทั้ง 8 หลักนี่นา) โดยที่ 0x00 จะแสดงแค่ DIGIT 0 เท่านั้น 0x04 จะแสดง DIGIT 0, 1, 2, 3, 4 และ 0x07 จะแสดง DIGIT 0, 1, 2, 3, 4, 5, 6, 7 หรือทุกหลักนั่นเอง

        ตัวอย่าง ต้องการแสดงแค่ 3 หลัก จะเป็น 0x0B03 หรือ { 0x0B, 0x03 } ต้องการแสดง 4 หลัก จะเป็น 0x0B04 หรือ { 0x0B, 0x04 }

SHUTDOWN (0x0C)

        สำหรับกำหนดการ Shutdown ซึ่ง 1 สำหรับ Normal และ 0 สำหรับ Shutdown เมื่อเข้าสู๋ Shutdown Mode ขา Data (A-G และ DP) จะเป็น Low ส่วนขา DIGIT (DIGIT 0 - DIGIT 7) จะเป็น High
        ตัวอย่าง ต้องการใช้ Shutdown ก็จะเป็น 0x0C01 หรือ { 0x0C, 0x01 }

DISPLAY TEST (0x0F)

        สำหรับทดสอบการแสดงผล โดยทุกขาจะเป็น High หมด โดย 0 คือ Normal Mode และ 1 คือ Display Test

        ตัวอย่าง ต้องการใช้ Display Test จะเป็น 0x0F01 หรือ { 0x0F, 0x01 }


        ตัวอย่างที่เจ้าของบล็อกใช้งานก็จะเป็นดังนี้ กำหนดให้ 7-segment ทั้ง 8 หลัก 0 ถึง 7 ตามลำดับ

                                0x09FF กำหนดเป็น BCD ทุกหลัก
                                0x0A0F กำหนดความสว่างเป็นสว่างสุด (15)
                                0x0B07 กำหนดให้แสดงผลทุกหลัก
                                0x0C01 กำหนดเป็น Normal (ไม่ Shutdown)
                                0x0F00 กำหนดเป็น Normal (ไม่ Display Test)

                                0x0100 กำหนดให้ DIGIT 0 เป็น 0
                                0x0201 กำหนดให้ DIGIT 1 เป็น 1
                                0x0302 กำหนดให้ DIGIT 2 เป็น 2
                                0x0403 กำหนดให้ DIGIT 3 เป็น 3
                                0x0504 กำหนดให้ DIGIT 4 เป็น 4
                                0x0605 กำหนดให้ DIGIT 5 เป็น 5
                                0x0706 กำหนดให้ DIGIT 6 เป็น 6
                                0x0807 กำหนดให้ DIGIT 7 เป็น 7

        แค่นี้ก็ใช้ได้แล้ว! ใช้ง่ายกว่าที่คิดไว้เยอะเลย