เจ้าของบล็อกไปเจอตัวอย่างของ ETT เป็นแอสเซมบลีของ Z80 (เจ้าของบล็อกไม่ค่อยถูกกับแอสเซมบลีซักเท่าไร) ก็เลยเป็นที่มาของบทความครั้งนี้แหละเผื่อยังมีผู้ที่หลงเข้ามาอ่านที่มาหาข้อมูลการใช้ไอซีเบอร์นี้
สำหรับเจ้า MAX7219 นี้มาจาก MAXIM โดยมีชื่อเต็มว่า Serially Interfaced 8-Digit LED Display Drivers หรือก็คือไอซีขับ LED 8 หลักนั่นเอง ขึ้นอยู่กับว่าจะใช้กับอะไร โดยเจ้าของบล็อกเอาไปใช้กับ 7-segment จำนวน 8 หลัก วงจรทั้งหมดก็จะมีดังนี้ (กดเพื่อขยายดูรูปได้)
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) โดยรูปแบบของตัวแปรที่ส่งเป็นข้อมูลออกมาขึ้นอยู่กับไมโครฯที่ใช้นะ
** สำหรับแบบไม่ใช้ 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 }
ตัวอย่าง สว่างประมาณครึ่งนึงจะเป็น 0x0A07 หรือ { 0x0A, 0x07 } สว่างต่ำสุดจะเป็น 0x0A00 หรือ { 0x0A, 0x00 }
ตัวอย่าง ต้องการแสดงแค่ 3 หลัก จะเป็น 0x0B03 หรือ { 0x0B, 0x03 } ต้องการแสดง 4 หลัก จะเป็น 0x0B04 หรือ { 0x0B, 0x04 }
ตัวอย่าง ต้องการใช้ Shutdown ก็จะเป็น 0x0C01 หรือ { 0x0C, 0x01 }
ตัวอย่าง ต้องการใช้ 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
แค่นี้ก็ใช้ได้แล้ว! ใช้ง่ายกว่าที่คิดไว้เยอะเลย
ตัวอย่าง การใช้งาน 0x0900 หรือ { 0x09, 0x00 } (ไม่ใช้ BCD) โดยรูปแบบของตัวแปรที่ส่งเป็นข้อมูลออกมาขึ้นอยู่กับไมโครฯที่ใช้นะ
DIGIT 0 - DIGIT 7 (0x01 - 0x08)
อันนี้ก็ไม่มีอะไรซับซ้อน อยากกำหนดหลักไหนก็ส่ง Address ด้วยด้วย Data สำหรับ Data ก็จะมีดังนี (กดที่ภาพเพื่อขยายภาพได้)ทีนี้มาดูที่ฝั่ง 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
แค่นี้ก็ใช้ได้แล้ว! ใช้ง่ายกว่าที่คิดไว้เยอะเลย