สำหรับ MCU เบอร์เล็กๆ ที่มีขา I/O ไม่มากนัก เช่น 89C2051 ถ้าเราต้องการขยาย Port แบบ Output ให้ได้เยอะๆ เช่นต้องการจะต่อ 7 Segment ซัก 30 ตัว ถึงจะใช้วิธี Scan Display ก็เถอะ ลองคำนวนดู ใช้ 8 bit สำหรับ data 7 segment และในแต่ละตัวก็ต้อง มีขา Common อีก สรุปว่าคงไม่พอครับ
เทคนิคหนึ่งที่นิยมใช้ก็คือใช้ Shift register ในการขยาย Port โดยเราจะใช้ขา data เพียง 3 ขาเท่านั้น Clock, Data,Strobe IC แต่ละผู้ผลิตอาจจะตั้งชื่อขาสัญญาณแตกต่างกันไปบ้างแต่หลักการเดียวกัน โดย Data จะส่งไปพร้อมกับ Clock หรือที่เรียกการส่งข้อมูลแบบนี้ว่า Synchronous

การต่อสาย 74HC595 แบบอนุกรมหลายตัว
IC ที่นิยมนำมาใช้จะเป็นเบอร์ที่ลงท้ายด้วย 595 เช่น 74HC595, 74LS595, TPIC6B595(Open Collector) การต่อใช้งานขา Data จาก MCU จะต่อเข้ากับ Data in ของตัวที่ 1 และ Data Out ของตัวที่ 1 จะต่อเข้ากับ Data in ของตัวที่ 2 เป็นอย่างนี้ไปเรื่อยๆจนถึงตัวสุดท้าย Data Out ของตัวสุดท้ายจะไม่ถูกต่อ

IC Shift register ตระกูล 595
สำหรับ Code ตัวอย่างนี้ สามารถนำไปประยุกต์ใช้ได้ทุกตระกูล MCS51, AVR, PIC หรือตระูกูลอื่นๆ
อธิบายฟังก์ชัน
Code นี้ต่อ 74HC595 ไว้ 4 ตัวอนุกรมกัน ใน 1 ตัว ตัวแปร Hc595[0] แทน 74HC595 ตัวที่ 1 ไปเรื่อยๆ จนถึง Hc595[3] แทน 74HC595 ตัวที่ 4 การเขียนข้อมูลในแต่ละ byte จะใช้ฟังก์ชัน void wrport8 (unsigned char dat) การส่งข้อมูลไปยัง 74HC595 ทั้ง 4 ตัวใช้ฟังก์ชัน void wrport() เริ่มจาก ให้ OE595 และ STR เป็น “0″ จากนั้นก็ส่งข้อมูล Hc595[0]…Hc595[3] ตอนนี้ข้อมูลจะถูกเก็บไว้ใน D-flipflop ใน 74HC595 แล้ว แต่ยังไม่ถูกส่งออกมายัง Port ข้อมูลจะถูกส่งออกมายัง Port หลังจากส่ง Pulse ไปยัง STR
Code Example
#define SCK_DDR ??DDRB.3??//???????????? #define SDO_DDR ??DDRB.2??// #define STR_DDR ??DDRB.1??//?? #define OE595_DDR ??DDRB.0??//??#define SCK ???PORTB.3??// #define SDO ???PORTB.2??//?? #define STR ???PORTB.1??//????? #define OE595 ???PORTB.0??//?? //————————————————————————— ? ?wrport8(Hc595[0]); ?STR = 1;???? |