أساس برمجة مسجل الإزاحة 74HCH164
الدائرة الكهربية :
كود البرنامج والتعليق عليه :
كود:
/* إستخدام مسجل الإزاحة 74164 فى إنشاء عداد ثنائى من الصفر حتى 255
يحتاج هذا المسجل إلى خطين فقط لتفيذ تحويل البينات التسلسلية إلى تفرعية
*/
// تعريف الخطين بأسماء متعارف عليها لتسهيل فهم البرنامج وسوف نستخدم موجه التعريف
# Define Data_pin PORTB.B0 // يستخدم هذا الطرف لإرسال البيانات التسلسلية من الميكروكونترولر إلى مسجل الإزاحة
# Define Clock_pin PORTB.B1 // يستخدم هذا الطرف لتوصيل نبضات الساعة من الميكروكونترولر إلى مسجل الإزاحة
// تسهيلا للعمل نعرف الدالة التى تقوم بإجراء الإرسال التسلسلى
//sipo_out اسم الدالة
//dat بارامتر أو دليل الدالة الذى من خلاله يتم تمرير البيانات
void sipo_out ( unsigned char dat )
{
unsigned char value = 0 ; //تعريف متغير يحتفظ بالقيمة بعد الإزاحة
unsigned char shift = 0 ; //ومتغير كعداد لبيان مقدار إزاحة البيانات
for ( shift = 0 ; shift < 8 ; shift ++ ) // إنشاء حلقة تكرار 8 مرات كل مرة تختص ببت من البتات الثمانية للعدد أو الحرف
{ // فى كل تكرار يتم تنفيذ ما يلى
value = dat >> shift ; // إزاحة بينات العدد أو الحرف جهة اليمين بمقدار ترتيب التكرار وحفظ النتيجة فى متغير القيمة
if ( value & 1 ) // للتعامل مع بت واحدة فقط تتم عملية و المنطقية مع الواحد وتسمى بعملية القناع إو الإخفاء
{
Data_pin = 1 ; // إن كان الناتج صوب يكون بت البيانات بواحد ومن ثم يتم رفع حالة خط البيانات
}
else // وإن لم تكن صواب
{
Data_pin = 0 ; // يتم خفض حالة خط البيانات
}
Clock_pin = 1 ; // ثم رفع حالة خط الساعة
Clock_pin = 0 ; // وخفضه للسماح بإخراج البيانات
}
}
unsigned char a ; // تعريف متغير لعداد حلقة التكرار
void main() // بداية الدالة الرئيسية
{
TRISB = 0 ; //تهيئة هذه الأطراف كمخارج
Data_pin = 0 ; // يتم تهيئة هذه الأطراف باصفار
Clock_pin = 0 ; //لضمان ضع البداية
do{
//أخيرا عندما نريد نقل بايت من خلال SIPO نستدعى الدالة ونمرر (نضع) بها البيانات المراد نقلها . على سبيل المثال
sipo_out ( 255 ) ; // نبدأ بإضاءة جميع الليدات كخطوة اختياريةلبيان عمل الدالة
for(a=0;a<255;a++ ) // بعد ذلك ننشأ حلقة بعداد كبارامتر لدالة الدخل التسلسلى الخرج التفرعى من الصفر وحتى 255
{ // فى كل تكرار يتم الآتى
sipo_out ( a ) ; // تخصيص رقم التكرار كبارامتر أو دليل للدالة لتمريره أى تنفيذه وفقا لكود هذه الدالة السابق كتابته بأعلى
Delay_Ms ( 100 ) ; // تأخير زمنى بسيط
} // نهاية حلقة التكرار التى تتكرر من الصفر إلى 255
}while(1); // تكرار عملية إضاءة كل الليدات ثم أضاءة الليدات حسب عداد ثنائى من الصفر وحتى 255
} // نهاية الدالة الرئيسية