สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
คอนโทรลเลอร์ MAX7219 ผลิตโดย Maxim Integrated เป็นไดรเวอร์การแสดงผลแคโทดอินพุต/เอาต์พุตแบบอนุกรมที่มีขนาดกะทัดรัดซึ่งสามารถเชื่อมต่อไมโครคอนโทรลเลอร์กับไฟ LED แต่ละตัว 64 ดวง, จอแสดงผล LED ตัวเลข 7 ส่วนที่มีตัวเลขสูงสุด 8 หลัก, การแสดงกราฟแท่ง ฯลฯ รวมอยู่ใน - ชิปเป็นตัวถอดรหัส BCD code-B วงจรสแกนมัลติเพล็กซ์ ไดรเวอร์เซ็กเมนต์และตัวเลข และ RAM แบบคงที่ 8 × 8 ที่เก็บตัวเลขแต่ละหลัก
โมดูล MAX7219 นั้นสะดวกมากที่จะใช้กับไมโครคอนโทรลเลอร์ เช่น ATtiny85 หรือในกรณีของเราคือ Tinusaur Board
ขั้นตอนที่ 1: ฮาร์ดแวร์
โมดูล MAX7219 มักจะมีลักษณะเช่นนี้ พวกเขามีอินพุทบัสด้านหนึ่งและเอาท์พุทบัสที่อีกด้านหนึ่ง สิ่งนี้ทำให้คุณสามารถต่อเดซี่เชน 2 โมดูลขึ้นไป กล่าวคือ ทีละโมดูล เพื่อสร้างการตั้งค่าที่ซับซ้อนยิ่งขึ้น
โมดูลที่เราใช้สามารถเชื่อมต่อแบบโซ่โดยใช้จัมเปอร์ขนาดเล็ก 5 ตัว ดูภาพด้านล่าง
ขั้นตอนที่ 2: Pinout และสัญญาณ
โมดูล MAX7219 มี 5 พิน:
- VCC – กำลัง (+)
- GND – กราวด์ (-)
- DIN – อินพุตข้อมูล
- CS – เลือกชิป
- CLK – นาฬิกา
นั่นหมายความว่าเราต้องการ 3 พินที่ด้านไมโครคอนโทรลเลอร์ ATtiny85 เพื่อควบคุมโมดูล เหล่านั้นจะเป็น:
- PB0 – เชื่อมต่อกับCLK
- PB1 – เชื่อมต่อกับ CS
- PB2 – เชื่อมต่อกับ DIN
เท่านี้ก็เพียงพอแล้วที่จะเชื่อมต่อกับโมดูล MAX7219 และตั้งโปรแกรม
ขั้นตอนที่ 3: โปรโตคอล
การสื่อสารกับ MAX7219 นั้นค่อนข้างง่าย - ใช้โปรโตคอลแบบซิงโครนัส ซึ่งหมายความว่าสำหรับทุกบิตข้อมูลที่เราส่งจะมีวงจรนาฬิกาที่บ่งบอกถึงการมีอยู่ของบิตข้อมูลนั้น
กล่าวอีกนัยหนึ่ง เราจะส่ง 2 ลำดับขนานไปยังบิต – หนึ่งสำหรับนาฬิกาและอีกชุดสำหรับข้อมูล นี่คือสิ่งที่ซอฟต์แวร์ทำ
ขั้นตอนที่ 4: ซอฟต์แวร์
วิธีการทำงานของโมดูล MAX7219 นี้คือ:
- เราเขียนไบต์ไปยังการลงทะเบียนภายใน
- MAX7219 ตีความข้อมูล
- MAX7219 ควบคุม LED ในเมทริกซ์
นั่นหมายความว่าเราไม่ต้องวนรอบอาร์เรย์ของ LED ตลอดเวลาเพื่อให้สว่างขึ้น – ตัวควบคุม MAX7219 จะดูแลเรื่องนี้เอง นอกจากนี้ยังสามารถจัดการความเข้มของไฟ LED ได้อีกด้วย
ดังนั้น ในการใช้โมดูล MAX7219 ในวิธีที่สะดวก เราจำเป็นต้องมีไลบรารีของฟังก์ชันเพื่อตอบสนองวัตถุประสงค์นั้น
อันดับแรก เราต้องการฟังก์ชันพื้นฐานบางอย่างเพื่อเขียนลงในรีจิสเตอร์ MAX7219
- กำลังเขียนไบต์ไปยัง MAX7219
- การเขียนคำ (2 ไบต์) ถึง MAX7219
ฟังก์ชันที่เขียนหนึ่งไบต์ไปยังคอนโทรลเลอร์มีลักษณะดังนี้:
เป็นโมฆะ max7219_byte (ข้อมูล uint8_t) { สำหรับ (uint8_t i = 8; i >= 1; i--) { PORTB &= ~ (1 << MAX7219_CLK); // ตั้งค่า CLK เป็น LOW ถ้า (data & 0x80) // ปิดบัง MSB ของข้อมูล PORTB |= (1 << MAX7219_DIN); // ตั้งค่า DIN เป็น HIGH อย่างอื่น PORTB &= ~(1 << MAX7219_DIN); // ตั้งค่า DIN เป็น LOW PORTB |= (1 << MAX7219_CLK); // ตั้งค่า CLK เป็นข้อมูลสูง <<= 1; // เลื่อนไปทางซ้าย } }
ตอนนี้เราสามารถส่งไบต์ไปยัง MAX7219 ได้แล้ว เราก็เริ่มส่งคำสั่งได้ ทำได้โดยส่ง 2 byes – ที่ 1 สำหรับที่อยู่ของการลงทะเบียนภายในและที่ 2 สำหรับข้อมูลที่เราต้องการส่ง
มีการลงทะเบียนมากกว่าหนึ่งโหลในคอนโทรลเลอร์ MAX7219
การส่งคำสั่งหรือคำโดยทั่วไปคือการส่ง 2 ไบต์ต่อเนื่องกัน ฟังก์ชั่นการใช้งานที่ง่ายมาก
เป็นโมฆะ max7219_word (ที่อยู่ uint8_t, ข้อมูล uint8_t) { PORTB &= ~ (1 << MAX7219_CS); // ตั้งค่า CS เป็น LOW max7219_byte (ที่อยู่); // กำลังส่งที่อยู่ max7219_byte(data); // กำลังส่งข้อมูล PORTB |= (1 << MAX7219_CS); // ตั้งค่า CS เป็น HIGH PORTB &= ~ (1 << MAX7219_CLK); // ตั้งค่า CLK เป็น LOW }
สิ่งสำคัญที่ควรทราบคือบรรทัดที่เรานำสัญญาณ CS กลับมาที่ HIGH ซึ่งเป็นจุดสิ้นสุดของลำดับ ในกรณีนี้คือจุดสิ้นสุดของคำสั่ง เทคนิคที่คล้ายกันนี้ใช้เมื่อควบคุมเมทริกซ์มากกว่าหนึ่งเมทริกซ์ที่เชื่อมต่อกันในสายโซ่ ขั้นต่อไป ก่อนที่เราจะเริ่มเปิดและปิดไฟ LED คือการเริ่มต้นคอนโทรลเลอร์ MAX7219 ทำได้โดยการเขียนค่าบางอย่างลงในรีจิสเตอร์บางตัว เพื่อความสะดวก ในขณะที่เข้ารหัส เราสามารถใส่ลำดับการเริ่มต้นในอาร์เรย์
uint8_t initseq = { 0x09, 0x00, // Decode-Mode Register, 00 = ไม่มีการถอดรหัส 0x0a, 0x01, // Intensity Register, 0x00.. 0x0f 0x0b, 0x07, // Scan-Limit Register, 0x07 เพื่อแสดงบรรทัดทั้งหมด 0x0c, 0x01, // Shutdown Register, 0x01 = การทำงานปกติ 0x0f, 0x00, // Display-Test Register, 0x00 = การทำงานปกติ };
เราแค่ต้องส่งคำสั่ง 5 คำสั่งด้านบนตามลำดับเป็นคู่ที่อยู่/ข้อมูล ขั้นตอนต่อไป – ให้ไฟ LED แถวหนึ่งสว่างขึ้น
มันง่ายมาก เราแค่เขียนคำสั่งหนึ่งคำสั่งโดยที่ไบต์ที่ 1 คือที่อยู่ (จาก 0 ถึง 7) และไบต์ที่ 2 คือ 8 บิตที่แทน LED 8 ดวงในแถว
เป็นโมฆะ max7219_row (ที่อยู่ uint8_t, ข้อมูล uint8_t) { ถ้า (ที่อยู่ >= 1 && ที่อยู่ <= 8) max7219_word (ที่อยู่, ข้อมูล); }
สิ่งสำคัญคือต้องสังเกตว่าสิ่งนี้จะใช้ได้กับ 1 เมทริกซ์เท่านั้น หากเราเชื่อมต่อเมทริกซ์มากขึ้นในสายโซ่ พวกมันทั้งหมดจะแสดงข้อมูลเดียวกัน เหตุผลก็คือหลังจากส่งคำสั่ง เรานำสัญญาณ CS กลับมาที่ HIGH ซึ่งทำให้ตัวควบคุม MAX7219 ทั้งหมดในสายโซ่ล็อคและแสดงคำสั่งสุดท้าย