التحويل بين العشري decimal و الثنائى المكود عشري binary-coded-decimal (BCD)
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: الميكروكونترولر PIC والبرجة بلغة السى والمترجم مسكروسى برو :: الميكروكونترولر PIC والبرمجة بلغة السى والمترجم ميكروسى برو
صفحة 1 من اصل 1
التحويل بين العشري decimal و الثنائى المكود عشري binary-coded-decimal (BCD)
التحويل بين العشري decimal و الثنائى المكود عشري binary-coded-decimal (BCD)
عند التعامل مع الميكروكونترولر ، ستصادف عددًا لا بأس به من المكونات التي توفر البيانات - أو تتطلب بيانات ثنائية مكودة عشرى BCD .
إذا كنت معتادًا على التحويل بين الثنائي binary والعشري decimal والست عشري hexadecimal ، فهذا أمر واضح إلى حد ما ... ولكن إذا كنت قد بدأت للتو في التعامل باستخدام المتحكمات الدقيقة ، فقد تجد نفسك في حيرة. آمل أن يجعل هذا الموضوع الأمور أكثر وضوحًا.
فى النظام BCD لا يتم فيه تخزين القيمة في ذاكرة الوصول العشوائي RAM بتنسيق ثنائي بسيط ، ولكن بدلاً من ذلك يتم بطريقة نصف ثنائية ونصف عشرية. ما يحدث بالفعل هو أن كل رقم من العدد في شكله العشري يتم تخزينه في عدد محدد من البتات ... عادة ما تكون أربعة أو ثمانية.
على سبيل المثال ، إذا كنت بحاجة إلى تخزين العدد العشري 37 في شكل BCD ، مع تخصيص أربعة بت لكل خانة ، فسيتم ترميزه على النحو التالي:
لذلك ، إذا كنت تقرأ هذه البايت من ذاكرة الوصول العشوائي (أو من مكون آخر) وكنت تتوقع الحصول على القيمة العشرية 37 ، فستحصل فعليًا على ... 55. ما عليك فعله هو قراءة البايت ، ثم تحويله مرة أخرى من BCD إلى عشري ، قبل استخدامه. ليست صعبة ، مجرد مربكة بعض الشيء.
لماذا هذا النظام ضروري؟
كان هذا النظام شائع جدا فى أنظمة الكمبيوتر الأقدم بكثير التى تعمل بمجموعات التعليمات البدائية ، ولكن الآن لا تستخدم . من حين لآخر قد ترى أن هذا النظام يستخدم حيث تكون الرياضيات التي تتطلب دقة غير محدودة أكثر أهمية من تركيب الأرقام في تنسيقات بيانات ذات عرض ثابت (مثل في التطبيقات المالية والعلمية). ولكن الأماكن التي نراها أكثر في مجال الإلكترونيات الرقمية ؛ التى غالبا ما تنطوي على الساعات ، أو أنواع أخرى من العروض الرقمية. على سبيل المثال: تقوم معظم آلات حاسبة الجيب القديمة بتخزين الأرقام في تظام BCD ، لأنها تجعل دائرة العرض أبسط بكثير.
دعونا نلقي نظرة على كيفية التحويل من وإلى BCD.
التحويل من BCD إلى العشري
لنفترض أنك قرأت بايت من مكون تقول الداتا شيت أنه بنظام BCD ، مع أربعة بت لكل رقم digit. ربما لم تعلن الداتا شيت صراحة أنه "BCD" - ربما تكون قد أعلنت فقط خانة "العشرات"“tens” بشكل منفصل بدلاً من ذلك:
الشكل يبين مقتطف من الداتا شيت لشريحة الوقت الفعلي DS1307 ، التي تصف تنسيق البيانات للدقائق والثواني. على الرغم من أنها لا تشير صراحةً إلى "BCD" ، إلا أنها توضح أن العشرات مخزّنة في وحدات بتات منفصلة (4-6) والآحاد مخزنة فى البتات (0-3) .
لتحويل هذا إلى قيمة عشرية عادية ، نقوم بفصل الأرقام digits ببعض القناع masking الثنائي البسيط ، وضرب قيمة العشرات في 10 ، ثم أضافتهم (جمعهم) معًا:
من المفيد الإشارة هنا إلى أن التمثيل السداسي عشري لقيمة BCD يطابق القيمة النهائية. على سبيل المثال: 37 في النظام العشرى يصبح 0x37 في BCD . إذا كنت تستخدم ثوابت في شفرتك والتى تكون قيم BCD ، فمن المستحسن بشدة استخدامها في شكلها السداسي عشر ، حيث إنها ستوضح ما تفعله شفرتك.
التحويل من عشري إلى BCD
للقيام بذلك ، يجب أن نفصل رقم العشرات tens عن رقم الآحاد units ، ونزحزح shift العشرات لأربعة أماكن ، ثم نجرى عملية OR بينهما معا:
من المعروف أن زحزحة جهة اليسار لمكان واحد تعادل الضرب فى 2 والزحزحة جهة اليسار لأربع أماكن تعادل الضرب فى 16 ، كما أن عملية OR تعادل الجمع (+) ، وبالتالى يكون لدينا الصيغة التالية :
يمكن وضع هذه التحويلات على هيئة دوال كما يلى :
عند التعامل مع الميكروكونترولر ، ستصادف عددًا لا بأس به من المكونات التي توفر البيانات - أو تتطلب بيانات ثنائية مكودة عشرى BCD .
إذا كنت معتادًا على التحويل بين الثنائي binary والعشري decimal والست عشري hexadecimal ، فهذا أمر واضح إلى حد ما ... ولكن إذا كنت قد بدأت للتو في التعامل باستخدام المتحكمات الدقيقة ، فقد تجد نفسك في حيرة. آمل أن يجعل هذا الموضوع الأمور أكثر وضوحًا.
فى النظام BCD لا يتم فيه تخزين القيمة في ذاكرة الوصول العشوائي RAM بتنسيق ثنائي بسيط ، ولكن بدلاً من ذلك يتم بطريقة نصف ثنائية ونصف عشرية. ما يحدث بالفعل هو أن كل رقم من العدد في شكله العشري يتم تخزينه في عدد محدد من البتات ... عادة ما تكون أربعة أو ثمانية.
على سبيل المثال ، إذا كنت بحاجة إلى تخزين العدد العشري 37 في شكل BCD ، مع تخصيص أربعة بت لكل خانة ، فسيتم ترميزه على النحو التالي:
لذلك ، إذا كنت تقرأ هذه البايت من ذاكرة الوصول العشوائي (أو من مكون آخر) وكنت تتوقع الحصول على القيمة العشرية 37 ، فستحصل فعليًا على ... 55. ما عليك فعله هو قراءة البايت ، ثم تحويله مرة أخرى من BCD إلى عشري ، قبل استخدامه. ليست صعبة ، مجرد مربكة بعض الشيء.
لماذا هذا النظام ضروري؟
كان هذا النظام شائع جدا فى أنظمة الكمبيوتر الأقدم بكثير التى تعمل بمجموعات التعليمات البدائية ، ولكن الآن لا تستخدم . من حين لآخر قد ترى أن هذا النظام يستخدم حيث تكون الرياضيات التي تتطلب دقة غير محدودة أكثر أهمية من تركيب الأرقام في تنسيقات بيانات ذات عرض ثابت (مثل في التطبيقات المالية والعلمية). ولكن الأماكن التي نراها أكثر في مجال الإلكترونيات الرقمية ؛ التى غالبا ما تنطوي على الساعات ، أو أنواع أخرى من العروض الرقمية. على سبيل المثال: تقوم معظم آلات حاسبة الجيب القديمة بتخزين الأرقام في تظام BCD ، لأنها تجعل دائرة العرض أبسط بكثير.
دعونا نلقي نظرة على كيفية التحويل من وإلى BCD.
التحويل من BCD إلى العشري
لنفترض أنك قرأت بايت من مكون تقول الداتا شيت أنه بنظام BCD ، مع أربعة بت لكل رقم digit. ربما لم تعلن الداتا شيت صراحة أنه "BCD" - ربما تكون قد أعلنت فقط خانة "العشرات"“tens” بشكل منفصل بدلاً من ذلك:
الشكل يبين مقتطف من الداتا شيت لشريحة الوقت الفعلي DS1307 ، التي تصف تنسيق البيانات للدقائق والثواني. على الرغم من أنها لا تشير صراحةً إلى "BCD" ، إلا أنها توضح أن العشرات مخزّنة في وحدات بتات منفصلة (4-6) والآحاد مخزنة فى البتات (0-3) .
لتحويل هذا إلى قيمة عشرية عادية ، نقوم بفصل الأرقام digits ببعض القناع masking الثنائي البسيط ، وضرب قيمة العشرات في 10 ، ثم أضافتهم (جمعهم) معًا:
- الكود:
bcd_value = read_from_somewhere(); // lets say bcd_value = 55, or 0x37
tens = bcd_value >> 4; // tens = 3 (by shifting down the number four places)
units = bcd_value & 0x0F; // units = 7 (the 0x0F filters-out the high digit)
final_value = (tens * 10) + units; // final_value = 37
من المفيد الإشارة هنا إلى أن التمثيل السداسي عشري لقيمة BCD يطابق القيمة النهائية. على سبيل المثال: 37 في النظام العشرى يصبح 0x37 في BCD . إذا كنت تستخدم ثوابت في شفرتك والتى تكون قيم BCD ، فمن المستحسن بشدة استخدامها في شكلها السداسي عشر ، حيث إنها ستوضح ما تفعله شفرتك.
التحويل من عشري إلى BCD
للقيام بذلك ، يجب أن نفصل رقم العشرات tens عن رقم الآحاد units ، ونزحزح shift العشرات لأربعة أماكن ، ثم نجرى عملية OR بينهما معا:
- الكود:
orig_value = 35; // original value we want to encode in BCD
tens = orig_value / 10; // tens = 3 (by integer division)
units = orig_value % 10; // units = 5 (by modulus)
bcd_value = (tens << 4) | units; // bcd_value = 53, or 0x35
(by shifting the tens up four places and binary-OR'ing it with the units)
- الكود:
unsigned int tmp1, tmp2, minute;
tmp1 = minute / 10; //Write tens of minute
tmp2 = minute % 10; //Write unit of minute
minute = tmp1 * 16 + tmp2; //Includes all value
يمكن وضع هذه التحويلات على هيئة دوال كما يلى :
- الكود:
// turns a standard byte into a BCD equivalent
unsigned int DecToBcd(unsigned int val)
{
return( ((val/10) << 4) | (val%10) );
}
// turns a BCD-encoded byte back into a standard one
unsigned int BcdToDec(unsigned int bcd)
{
return( ((bcd >> 4) * 10) + (bcd&0x0F) );
}
مواضيع مماثلة
» ترجمة وإعداد كتاب البرمجة بلغة السى المدمجة وتطبيقات لغة السى والميكروكونترولر PIC مع المترجم CCS C : Embedded C Programming Techniques and Applications of C and PIC® MCUS
» التحويل من تناظرى إلى رقمى مع المترجم CCS C :
» الفصل الثامن التحويل من تناظرى لرقمى ADC ومن رقمى لتناظرى DAC
» التحويل من تناظرى إلى رقمى مع المترجم CCS C :
» الفصل الثامن التحويل من تناظرى لرقمى ADC ومن رقمى لتناظرى DAC
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: الميكروكونترولر PIC والبرجة بلغة السى والمترجم مسكروسى برو :: الميكروكونترولر PIC والبرمجة بلغة السى والمترجم ميكروسى برو
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى