26/08/2023
74HC595 shift register IC
74HC 595ကို 7 segmentတွေ၊led 8x8 matrix တွေမှာ အသုံးပြုကြတာများ7 segemnt တစ်ခုထက်ပိုသုံးချင်တဲ့အခါ၊led matrixတွေအတွက်arduino boardမှာ pin အသုံးပြုတာ ချွေတာနိုင်ဖို့ parallel output 8 pin ပါတဲ့ HC595 ICကို အသုံးပြုရခြင်းဖြစ်ပါတယ်။ICရဲ့ သဘောတရားကို နားလည်ရင် codeရေးရတာလွယ်ကူသလို အလုပ်လဲ တွင်ပါတယ်။shift register IC များစွာရှိသလို
ထို IC တွေကို အခြေ ခံပြီး တည်ဆောက်ထားတဲ့7 segment digit moduleတွေ၊ Led matrix moduleတွေလဲ ရှိပါတယ်။Projectအသေးလေးတွေ လုပ်ရမှာcodeရေးရတာ ရိုးရှင်းပေမဲ့ အလုပ်များများခိုင်းချင်တဲ့အခါကြ ထိုIC တွေကို အခြေ ခံပြီး တည်ဆောက်ထားတဲ့ Moduleတွေကို ဝယ်သုံးတာက ပိုအဆင်ပြေပြီး အချိန်ကုန်သက်သာစေ
ပါတယ်။
74HC595 မှာ pin 16 pins ပါပါတယ်။Q0 ကနေ Q7ထိ ရှိတဲ့ parallel output pin(ပြိုင်တူ outputထွက်တဲ့pin)8 pins ထိပါပါတယ်။Q0က pin 15ဖြစ်ပြီး Q1ကနေ Q7 ထိက pin1ကနေ pin7ထိ ဖြစ်ပါတယ်။ဒါကြောင့် 7 segementလို common pin 2 pinကလွယ် ကျန် 8 pinကို arduino boardနဲ့
ချိတ်ဆက်ရတာထက် 74HC595ကိုအသုံးပြုလိုက်တဲ့အခါ Arduino boardမှာ 7 segementရဲ့ pin 8 pinကိုတပ်ဆင်စရာ မလိုတော့ပါဘူး။ထို 8 pinကို IC မှာ တပ်ဆင်ပေးလိုက်ရင် ရပါပြီ။ထပ်တူ led matrix တွေမှာလည်း 74HC595ကို အသုံးပြုတဲ့အခါ Pin အနည်းငယ် သက်သာသွားပါတယ်။
ICမှာ pin 8က GND၊ pin 16 က Supply pin၊ST_CP pinက latch pinနဲ့ SH_CP က clock pin နဲ့ data pinဖြစ်တဲ့ pin14 တို့ကို arduino boardနဲ့ ချိတ်ဆက်ပေးရပါ့မယ်။ကျန်တဲ့ pin13က OE pinကို GND နဲ့ချိတ်ဆက်ပြီး pin11 ဖြစ်တဲ့ MR pinကို supply voltage(5V) နဲ့ ချိတ်ဆက်ရပါ့မယ်။
ကျွန်တော်တို့က Data pinကို digitalWriteနဲ့ရေးပြီး HIGHနဲ့ LOWor (1 and 0) စတဲ့ dataတွေကို ပေးပို့ပေးရပါ့မယ်။arduino boardကနေ 1 and 0
အခြေ အနေတွေကို data pinကိုပေးပို့နေချိန်မှာ latch pinကို arduino boardကနေLOW state ပေးထားရပါ့မယ်။ဥပမာ digitalWrite(latchpin,LOW); စတဲ့
codeလေးနဲ့ latch pinကို arduino board
ကနေ LOW stateပေးထားရပါ့မယ်။codeကိုရှင်းပြတဲ့အချိန်မှာ ဆက်လေ့လာကြည့်ပါ။arduini boardကနေ ပေးပို့တဲ့datas(1 and 0) တွေကို latch pin က LOW state ဖြစ်နေပြီး အဲဒီအချိန် clock pinက LOWနဲ့ HIGH အခြေအနေနဲ့ 1 period(တစ်ကြိမ်)ဖြစ်ပေါ်နေ၍ 1 period ဖြစ်ပေါ်တိုင်း data pinက ဝင်လာတဲ့ data တစ်လုံးချင်းကို ICက storeလုပ်ပေးနေပါတယ်။latch pinက HIGH state ဖြစ်မှသာ ထိန်းသိမ်းထားတဲ့ data တွေကို Icမှာပါတဲ့Q0 ကနေ Q7 ထိရှိတဲ့ output 8 pinကနေ ပြိုင်တူ output dataအနေနဲ့ ထုတ်ပေးလိုက်ပါတယ်။
ဥပမာ data pinကို arduino boardကနေ 10101010 စတဲ့ binary တန်ဖိုးတွေကို serialနည်းနဲ့ တစ်လုံချင်း ပေးပို့လိုက်တယ် ဆိုပါစို့။
IC က အဲဒီ binary code ၈လုံးကို latch pinက LOW state ဖြစ်နေသရွေ့၊အဲဒီအချိန် clock pinကလည်း HIGH and LOW(1 period)တစ်ကြိမ်စီ ဖြစ်ပေါ်နေပြီးclock 1 period တစ်ကြိမ်ဖြစ်ပေါ်ပြီးတိုင်း IC က binary bit 8လုံးထဲက bit 1 လုံးကိုစတင် store ပေးပါတယ်။နောက်တစ်ကြိမ် clock 1 period ဖြစ်တဲ့အခါ နောက်ထပ် bit တစ်လုံးကို ထပ်မံstore လုပ်ပေးပါတယ်။ဒီလိုနဲ့ binary bit 8လုံးစလုံး storeလုပ်ပြီးတဲ့အခါlatch pin ကို HIGH ဖြစ်ခိုင်းပြီး
ထို binary 8 လုံးကို တလုံးချင်း ပြန်မထုတ်ပေးဘဲ ပြိုင်တူ ထုတ်ပေးလိုက်ပါတယ်။ဒါကြောင့်လည်း ICရဲ့ Q0ကနေ Q7ထိ ရှိတဲ့ output pin တွေကို parallel output pin တွေလို့ သတ်မှတ်ထားတာ
ပါ။အောက်ပါ Example codeလေးကို
လေ့လာကြည့်ပါ။
data 6
latch 8
//ST_CP in IC
clock 10
// SH_CP in IC
void setup() {
pinMode(data,OUTPUT);
pinMode(latch,OUTPUT);
pinMode(clock,OUTPUT);
}
void loop() {
digitalWrite(latch,LOW);
shiftOut(data,clock,LSBFIRST,240);
//240 is decimal=11110000 is binary
digitalWrite(latch,HIGH);
delay(500);
}
အထက်ပါ codeကို မရှင်းပြခင် void loop()ထဲ မှာရေးထားတဲ့ shiftout functionနဲ့ သူ့ထဲက argument လေးခုအကြောင်း ဦးစွာရှင်းပြပါရစေ။
Arduino IDE မှာ shiftOut fuctionကို မူလကတည်းက supporting ပေးထားပြီးသားပါ။shiftဆိုတာ မြန်မာလို ရွေ့သည်ပေါ့။outက အပြင်ဘက်ကိုရည်ညွှန်းတာမို့ shiftOut လို့ရေးထားသည့်အခါ အပြင်ကို ရွေ့ပေးလိုက်ပါလို့ အဓိပ္ပါယ်ရတယ်။ဆိုတော့က shiftOut ထဲက first argumentက data pinကို ဆိုလိုတာပါ။data pinထဲကို binary code တစ်လုံချင်း serial နည်းနဲ့arduinoကနေ ပေးပို့ပါလို့ ဆိုလိုတာပါ။seconde argumentက clock pinကို
HIGH နဲ့ LOW စီ1 period ဖြစ်ပေါ်ခိုင်းတာပါ။Third argumentဖြစ်တဲ့ LSBFIRST ဆိုတာက least significant bit firstကို ဆိုလိုတာပါ။တနည်းအားဖြင့်
binary bit 8 လုံးကို ဘယ်ဘက်ကနေ စရေတွက်ပါလို့ ဆိုလိုတာပါ။MSBFIRSTဆိုရင် most significant bit first ကိုဆိုလိုခြင်းဖြစ်ပြီး ညာဘက်ကနေ စရေတွက် ပါလို့ဆိုလိုတာပါ။foruth argumentရဲ့တန်ဖိုးက decimalပါ။decimal တန်ဖိုးကို ဘယ်လိုယူရသလဲ
ဆိုရင် binary bit 8လုံးဖြစ်တဲ့ 1111000 ကို decimal valueအနေနဲ့ ပြန်ပြောင်း ယူထားခြင်းပါ။
Binary bit values
2^7=128
2^6 =64
2^5 =32
2^4 =16
2^3 =8
2^2 =4
2^1 =2
2^0 =1
အထက်ပါ binary bit valueတွေ
ဟာ base(အခြေ) 2 ယူပြီး 8 bit resolutionနဲ့ တွက်ယူကာ decimal တန်ဖိုးကို ပြောင်းထားတာပါ။ထိုကြောင့်shiftOut() fuctionထဲ ရေးထားတဲ့ decimal value 240ဟာ 11110000 ကိုပြန်ပြောင်းယူထားတာပါ။ရှေ့ဆုံး 1က128ကို ကိုယ်စားပြုပြီး ဒုတိယ 1 က 64ကို ကိုယ်စားပြုပါတယ်။တတိယ 1က
32ကို ကိုယ်စားပြုတာဖြစ်ပြီး စတုတ္ထ 1က 16ကို ကိုယ်စားပြုပါတယ်။အနောက်က 0000 က 0 တွေမို့ တန်ဖိုးဆက်မယူတော့ဘဲ 0 နဲ့သာ သတ်မှတ်လိုက်ပြီး ခုနက value လေးခုနဲ့ ပေါင်းလိုက်ပါတယ်။
Value=128+64+32+16+0+0+0+0 =240
တကယ်လို့ 10101010 လို့ ရေးစေချင်ရင်
decimal တန်ဖိုးကြ 170 ပေါ့။ 1ဖြစ်တဲ့ bit နေရာကိုပဲ တန်ဖိုးပေါင်ပေးရပါ့မယ်။
10101010=128+0+32+0+8+0+2+0=170
အဲဒီနောက် Q0 ကနေ Q7ထိ ရှိတဲ့ output pinတွေကနေ binary bit 8လုံးကို parallel output ထုတ်လိုက်ပါတယ်။ဆိုလိုတာက shiftout fuctionနဲ့ fourth valueမှာ decimal valueနဲ့ရေးသော်ငြာလည်း parallel ထုတ်ပေးတဲ့အခါ binary တန်ဖိုး ၈ လုံးနဲ့ပြန်ထုတ်ပေးပါတယ်။
အထက်ပါ codeမှာဆိုရင် data,clock,latch pinတွေကို ဲ့ symbolish constant ကြေငြာထားပါတယ်။void setup() မှာတော့ pinModeနဲ့ထို 3 pin
ကို output pinအဖြစ်ကြေငြာထားပါတယ်။
viod loop() fuctionမှာတော့ ဦးစွာ latch pinကို LOW stateပေးထားပြီးarduinoကနေ data pinကို ပေးပို့တဲ့ binary bit 8လုံးကို storeနေပါတယ်။store ဖို့အတွက် shiftOut fuctionမသုံးဘဲရေးလည်း ရပါတယ်။ဒါပေမဲ့ဒီနည်းကအလွယ်ကူဆုံးနည်းလမ်းမို့
ရေးပြပေးလိုက်တာပါ။latch pin က HIGH state ဖြစ်တာနဲ့ ထို binary bit8လုံး (codeထဲမှာ 240ရေးထားတာမို့ binary bit 8 လုံးက 11110000ပါ) ကိုQ0 ကနေ Q7 ထိရှိတဲ့ output 8 pinကနေ parallel ထွက်သွားပါတယ်။Q0ကနေ Q7ရဲ့ parallel outputထုတ်ရာမှာ LSBFIRST နဲ့ MSBFIRST ဆိုပြီးခွဲထားပါတယ်။ဥပမာအနေနဲ့ အောက်မှာ figureနဲ့ရှင်းပြပေးထားပါတယ်။
အဲဒီနောက် looping ပတ်ပြီး latch pinက LOW state ပြန်ဖြစ်ပြီး binary bit 8လုံးကို ပြန် storeလုပ်ကာ bit 8လုံးကို ပြန်ထုတ်ပေးပြန်ပါတယ်။
Credit They Paing