เขียนโปรแกรม MCS-51 ขยาย Port Input แบบไม่จำกัดด้วย CD4021

ในการออกแบบให้ microcontroller รับอินพุตดิจิตอลวิธีที่ตรงไปตรงมาที่สุดคือการต่อกับ Port ของ microcontroller โดยตรง แต่ถ้าอินพุตมีจำนวนมากซัก 10-20 อินพุต เราจะทำยังไง หลายคนอาจจะใช้วิธี Scan Keyboard เอา วิธีนี้มีข้อจำกัดตรงที่แต่ละอินพุตไม่อิสระต่อกัน เพราะต่อแบบ matrix

แล้วมีวิธีที่ดีกว่านี้อีกไหม? คำตอบคือมีครับ คือใช้ Shift register รับข้อมูลแบบขนาน แล้วให้สัญญาณออกมาเป็นแบบอนุกรม (Parallet in/ Serial put) โดยใช้ IC CD4021 ภายใน IC จะประกอบไปด้วย flip-flop เมื่อเราส่ง clock ไป 1ลูก data ที่ flip-flop จะส่งไปยังตัวถัดไป ถ้าเราส่ง clock ไป 8 ลูก เราก็จะได้ data จาก 8 อินพุต

จากรูปจะเห็นว่าเอาต์พุตของ flip-flop ตัวซ้าย จะเป็นอิพุตของ flip-flop ตัวขวาไปเรื่อยๆ สำหรับ data จะอยู่ที่ขา Q6, Q7, Q8 เวลาใช้งานจริงเราต่อที่ Q8 ตัวเดียวก็พอครับ ส่วน Q6, Q7 ก็ปล่อยลอยไว้ IC CD4021 1 ตัวจะต่ออินพุตได้ 8 อินพุต แต่เราสามารถต่อ IC CD4021อนุกรมกันไปได้เรื่อยๆ โดยต่อ Q8 เข้ากับ Serial input ไปเรื่อยๆ

ทีนี้มาดูในส่วนของการเขียนโปรแกรมกัน โปรแกรมตัวอย่างจะใช้ 89S52 MCS-51 เบอร์ยอดนิยมของผม

ด้านล่างจะเป็น function อ่านค่าจาก CD4021 ที่ที่อ่านได้จะ return กลับมา

//===============================================//
//??? ??? ??? ??? ??? ??? ??? ??? ?? Read data from CD4021
//===============================================//
unsigned char read_cd4021()
{
unsigned char i,a,inport,dat;

STR = 1;
STR = 0;
a = 4;??? while(a)??? a–;
dat = 0;
for (i=0;i<8;i++)
{
inport = DAT;
dat <<= 1;
dat |= inport;

CLK = 1; ??? a = 4;??? while(a)??? a–;
CLK = 0;??? ??? a = 4;??? while(a)??? a–;

}
STR = 1;

return(dat);
}

อันนี้ main()

//———————————————————–//
// Main
//———————————————————–//
void main()
{
init();
dmsec(200);??? ??? ??? //at least 100 mS
init_lcd();
dmsec(200);??? ??? ??? //at least 100 mS

show_portval_lcd();
while(1)
{
port_present = read_cd4021();
if(port_last!=port_present)
{
port_last = port_present;
show_portval_lcd();
dmsec(200);
}
}
}

ในการทดลองนี้ผมจะต่อ LCD 16×2 แสดงผลค่าที่อ่านได้จาก port โดยใช้อินพุตเป็น DIP Switch ขนาด 8 สวิตช์ มาดูส่วนของวงจรกันต่อ

การทดลองนี้ต่อ IC CD4021 ลง Proto board ครับ ทดลองเสร็จก็ไปใช้งานอื่นๆได้ต่อสะดวกดี ต่ออุปกรณ์เสร็จแล้ว ทดลองกันเลยดีกว่า

ในตอนสวิตช์ไม่สับลง GND ก็แสดงค่า 255 อันนี้ถูกต้องครับ ต่อมาสับสวิตช์ 1 และ 2 ไปที่ GND ถ้าเทียบเป็นเลขฐาน 2 จะได้ 11111100 = 252 สังเกตุว่าเท่ากับที่หน้าจอ LCD แสดงผล เป็นอันว่าอ่านค่าได้ถูกต้อง

Download

datasheet CD4021

source code CD4021(zip)