التعليق على البرنامج :
/* Project: Digital Voltmeter based on PIC16F877 Oscillator @ 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF */ 1- تعريف أطراف توصيل الميكروكونترولر بوحدة العرض LCD
// LCD module connections · 6 أطراف بالمنفذ PORTC
sbit LCD_RS at RB0_bit; sbit LCD_EN at RB1_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; · و 6 خانات تحكم بسجل التحكم TRISC
sbit LCD_RS_Direction at TRISB0_bit; sbit LCD_EN_Direction at TRISB1_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; // End LCD module connections 2- تعريف (إعلان) الرسائل والمتغيرات المستخدمة قبل الدخول للدالة الرئيسية
· الرسالة الأولى ثابتة وتنص على DVM Project .
char Message1[] = “DVM Project”;- تعريف متغير لحفظ نتيجة التحويل باسم ADC_Value ومتغير لحفظ جهد العرض باسم DisplayVolt
unsigned int ADC_Value, DisplayVolt; · والاشارة إلى متغير باسم volt يحتوى على نص عرض الجهد بالصيغة 00.0
char *volt = "00.0"; 3- الدالة الرئيسية : ونبدءها بإعدادات الميكروكونترولر :
void main() { # تهيئة الطرف RA0/AN0 كمدخل تناظرى وباقى الأطراف كمداخل / مخارج رقمية
ADCON1 = 0b00001110 ; // RA0/AN0 is analog input # تخصيص موديول المحول داخليا للقناة AN0 .
ADCON0 = 0 ; // Analog channel select @ AN0 # تهيئة جميع أطراف المنفذ PORTB والمنفذ PORTA كمخارج فيما عدا طرف الدخل التناظرى AN0
TRISB = 0b00000000; // PORTB All Outputs TRISA = 0b00000001; // PORTA All Outputs, Except RA0 · بعد ذلك تهيئة وحدة العرض LCD لبدء العمل
Lcd_Init(); // Initialize LCD · ومسح الشاسة
Lcd_Cmd(_LCD_CLEAR); // CLEAR display · ومنع ظهور (عرض) المؤشر على الشاشة
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off · ثم كتابة الرسالة الثابتة وهى الرسالة الأولى : DVM Project بدءا من الصف الأول والعامود الأول
Lcd_Out(1,1,Message1); · ثم كتابة حرف V فى الصف الثانى والعامود العاشر لتظهر بعد قيمة الجهد .
Lcd_Chr(2,10,'V'); · الدخول فى الحلقة الغير منتهية do{…} while(1) حيث يتم تنفيذ :
do { # قراءة المدخل التناظرى من القناة رقم 0 ونسخ نتيجة التحويل إلى سجل المتغير ADC_Value .
ADC_Value = ADC_Read(0); # ضرب محتويات سجل المتغير ADC_Value فى 2 ونسخ النتيجة لسجل المتغير DisplayVolt ( على سبيل المثال 0462 )
DisplayVolt = ADC_Value * 2; · الحصول على العدد الصحيح لخانة الآلاف : بالقسمة على 1000 وإضافة العدد 48 لتحويل العدد السابق لكود أسكى ونسخ العدد فى الخانة رقم 0 للمتغير volt ( 0462 / 1000 = 0 كعدد صحيح ).
volt[0] = DisplayVolt/1000 + 48; · الحصول على العدد الصحيح للمئات : بقسمة محتويات سجل المتغير DisplayVolt على 100 ثم إيجاد باقى قسمة النتيجة على 10 . ثم يضاف العدد 48 للتحويل إلى كود أسكى وتخزين النتيجة بالخانة رقم 1 بسجل المتغير volt ( 0462/100 =4 كعدد صحيح وباقى قسمة النتيجة على 10 هى العدد 4 المطلوب ) .
volt[1] = (DisplayVolt/100)%10 + 48; · نكرر بالنسبة للعدد الصحيح للعشرات ( 0462 /10 = 46 كعدد صحيح وباقى قسمة النتيجة على 10 هى العدد 6 المطلوب "القسمة تساوى أربعة صحيح والباقى 6 وهو المطلوب )
volt[3] = (DisplayVolt/10)%10 + 48; · ثم كتابة محتويات السجل volt بدءا من الصف الثانى والعامود الخامس
Lcd_Out(2,5,volt); · التأخير لفترة 500 ملى ثانية للسماح بمشاهدة العرض .
delay_ms(500); // Hold for 500 ms · تكرار العملية بصفة مستمرة لتحديث قراءة المدخل التناظرى والعرض .
} while(1); } // End main()