المدخل المباشر للتعامل مع وحدات السفن سيجمنت بطريقة Multiplexing من خلال تدريبات متعددة ومتدرجة

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

المدخل المباشر للتعامل مع وحدات السفن سيجمنت بطريقة Multiplexing من خلال تدريبات متعددة ومتدرجة

مُساهمة من طرف Admin في الأربعاء مايو 04, 2016 9:04 am

المدخل المباشر للتعامل مع وحدات السفن سيجمنت بطريقة Multiplexing من خلال تدريبات متعددة ومتدرجة
التدريب الأول : تمهيد
استخدام وحدتى عرض سفن سيجمنت لعرض العدد الثابت "12" وليشير إلى رقم الوحدة المتفق عليها .
الدائرة الكهربية :



البرنامج :


الكود:

/*
 * Project name: Multiplexing_7-Segment -2 units
    MCU:            PIC16F877A
    Oscillator:      HS, 8.0000 MHz
    SW:              mikroC PRO
*/
//////////////////////////////
#define Digit1 PORTA.RA0 // TENS
#define Digit2 PORTA.RA1 // ONES
///////////////////////////////////////
unsigned char Display (unsigned char digit)//convert(decoder) digit to 7 segment bit pattern
  {
    unsigned char pattern;
    unsigned char  SEGMENT_MAP[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    pattern =  SEGMENT_MAP[digit] ;  //The pattern to return ,segment data for common cathode
    return (pattern);
  }
////////////////////////////////////////
void main() {
  unsigned char MSD, LSD, count=12; // display constant 2 digit number
  ADCON1= 6;          // Configure all pins as digital inputs .
  TRISA = 0;            // Configure PORTA as outputs , COMMON CATHODES
  TRISB = 0;            // Configure PORTB as outputs ,7 SEGMENT DATA PORT
//////////////////////////
 Digit1 = 0;            //Disable digit 1
 Digit2 = 0;            //Disable digit 2
////////////////
  while(1){
      ///////////MSB is Digit1///// Steps :////////
      MSD = count / 10;         //1-Extract MSD from "count" >>TENS
      PORTB = Display(MSD);    //2-Display the MSD , send to data port
      Digit1 = 1;               //3- Enable digit 1
      Delay_Ms(10);            //4- uase a short delay 10ms , as example
      Digit1 = 0;               //5- Disable digit 2
      /////////////LSB is Digit2////////Repeat steps :///
      LSD = count % 10;        // LSD digit >>>ONES
      PORTB = Display(LSD);    //Display the LSD
      Digit2 = 1;               //Enable digit 2
      Delay_Ms(10);            //a short 10ms delay
      Digit2 = 0;               //Disable digit 2
     ///////////////////////////////////
    }
}

ملف البرنامج والدائرة الكهربية على الرابط :


mediafire.com download/cm27ykthi6dd8ay/1-MULTIPLEXING-7SEGMENT-2UNITS-1.zip


Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: المدخل المباشر للتعامل مع وحدات السفن سيجمنت بطريقة Multiplexing من خلال تدريبات متعددة ومتدرجة

مُساهمة من طرف Admin في الأربعاء مايو 04, 2016 9:15 am

التدريب الثانى :
تطوير للتدريب الأول ، وذلك باستخدام أربعة وحدات لعرض العدد "1234"

الدائرة الكهربية :



البرنامج :


الكود:

/*
 * Project name: Multiplexing_7-Segment 4 UNITS
    MCU:            PIC16F877A
    Oscillator:      HS, 8.0000 MHz
    SW:              mikroC PRO
*/
#define Digit1 PORTA.RA0 // THOUTHAND
#define Digit2 PORTA.RA1 // HUNDRED
#define Digit3 PORTA.RA2 // TENS
#define Digit4 PORTA.RA3 // ONES

unsigned char Display (unsigned char digit)
  {
    unsigned char pattern;
    unsigned char  SEGMENT_MAP[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    pattern =  SEGMENT_MAP[digit] ;  //The pattern to return
    return (pattern);
  }

void main() {
  unsigned char DD1,DD2, DD3,DD4 ;
  unsigned int count=1234; //more than char
  ADCON1= 6;          // ALL AS DIGITAL
  TRISA = 0;            // Configure PORTA as outputs , COMMON CATHODES
  TRISB = 0;            // Configure PORTB as outputs ,7 SEGMENT DATA PORT

Digit1 = 0;            //Disable digit 1
Digit2 = 0;            //Disable digit 2
Digit3 = 0;            //Disable digit 3
Digit4 = 0;            //Disable digit 4


  while(1){
      ///////////
      DD1 = count / 1000;      //Extract DD1 from count >>THOUTHAND
      PORTB = Display(DD1);    //Display the DD1
      Digit1 = 1;            //Enable digit 1
      Delay_Ms(10);            //a short 10ms delay
      Digit1 = 0;            //Disable digit 1
      /////////
      DD2 = (count/100) % 10;        // DD2 digit >>>HUNDRED
      PORTB = Display(DD2);    //Display the DD3
      Digit2 = 1;            //Enable digit 2
      Delay_Ms(10);            //a short 10ms delay
      Digit2 = 0;            //Disable digit 2
     ////////////
     DD3 = (count/10) % 10;      //Extract DD3 from count >>TENS
      PORTB = Display(DD3);    //Display the DD3
      Digit3 = 1;            //Enable digit 3
      Delay_Ms(10);            //a short 10ms delay
      Digit3 = 0;            //Disable digit 3
     /////////
     DD4 = count % 10;      //Extract DD4 from count >>ONES
      PORTB = Display(DD4);    //Display the DD4
      Digit4 = 1;            //Enable digit 4
      Delay_Ms(10);            //a short 10ms delay
      Digit4 = 0;            //Disable digit 4
    }
}


Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: المدخل المباشر للتعامل مع وحدات السفن سيجمنت بطريقة Multiplexing من خلال تدريبات متعددة ومتدرجة

مُساهمة من طرف Admin في الأربعاء مايو 04, 2016 9:37 am

التدريب الثالث : تطبيق على التدريب السابق
قراءة جهد تناظرى من 0v إلى 5v من مقاومة متغيرة وعرض نتيجة التحويل من تناظرى لرقمى من 0 إلى 1023

الدائرة الكهربية :







البرنامج :


الكود:

/*
 * Project name: Multiplexing_7-Segment 4 UNITS
    MCU:            PIC16F877A , ADC , 0-1023
    Oscillator:      HS, 8.0000 MHz
    SW:              mikroC PRO
*/
#define Digit1 PORTD.B0 // THOUTHAND
#define Digit2 PORTD.B1 // HUNDRED
#define Digit3 PORTD.B2 // TENS
#define Digit4 PORTD.B3 // ONES

unsigned char Display (unsigned char digit)
  {
    unsigned char pattern;
    unsigned char  SEGMENT_MAP[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    pattern =  SEGMENT_MAP[digit] ;  //The pattern to return
    return (pattern);
  }

void main() {
  unsigned char DD1,DD2, DD3,DD4 ;
  unsigned int ADC_result; //
  ADCON1= 0;          //
  TRISA.B0=1; // AN0 INPUT
  TRISD = 0;            // Configure PORTD as outputs , COMMON CATHODES
  TRISB = 0;            // Configure PORTB as outputs ,7 SEGMENT DATA PORT

Digit1 = 0;            //Disable digit 1
Digit2 = 0;            //Disable digit 2
Digit3 = 0;            //Disable digit 3
Digit4 = 0;            //Disable digit 4


  while(1){
  ADC_result=ADC_Read(0);  // Read analog value from channel 0
      ///////////
      DD1 = ADC_result / 1000;      //Extract DD1 from ADC_result >>THOUTHAND
      PORTB = Display(DD1);    //Display the DD1
      Digit1 = 1;            //Enable digit 1
      Delay_Ms(10);            //a short 10ms delay
      Digit1 = 0;            //Disable digit 1
      /////////
      DD2 = (ADC_result/100) % 10;        // DD2 digit >>>HUNDRED
      PORTB = Display(DD2);    //Display the DD3
      Digit2 = 1;            //Enable digit 2
      Delay_Ms(10);            //a short 10ms delay
      Digit2 = 0;            //Disable digit 2
     ////////////
     DD3 = (ADC_result/10) % 10;      //Extract DD3 from ADC_result >>TENS
      PORTB = Display(DD3);    //Display the DD3
      Digit3 = 1;            //Enable digit 3
      Delay_Ms(10);            //a short 10ms delay
      Digit3 = 0;            //Disable digit 3
     /////////
     DD4 = ADC_result % 10;      //Extract DD4 from ADC_result >>ONES
      PORTB = Display(DD4);    //Display the DD4
      Digit4 = 1;            //Enable digit 4
      Delay_Ms(10);            //a short 10ms delay
      Digit4 = 0;            //Disable digit 4
    }
}

Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: المدخل المباشر للتعامل مع وحدات السفن سيجمنت بطريقة Multiplexing من خلال تدريبات متعددة ومتدرجة

مُساهمة من طرف Admin في الأربعاء مايو 04, 2016 9:47 am

التدريب الرابع :
قياس درجة حرارة باستخدام الحساس LM35 وعرضها على 4 وحدات سفن سيجمنت

الدائرة الكهربية :










البرنامج :


الكود:

/*
 * Project name: Multiplexing_7-Segment 4 UNITS
    MCU:            PIC16F877A , ADC , LM35
    Oscillator:      HS, 8.0000 MHz
    SW:              mikroC PRO
*/
#define Digit1 PORTD.B0 // THOUTHAND
#define Digit2 PORTD.B1 // HUNDRED
#define Digit3 PORTD.B2 // TENS
#define Digit4 PORTD.B3 // ONES

unsigned char Display (unsigned char digit)
  {
    unsigned char pattern;
    unsigned char  SEGMENT_MAP[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    pattern =  SEGMENT_MAP[digit] ;  //The pattern to return
    return (pattern);
  }

void main() {
  unsigned char DD1,DD2, DD3,DD4 ;
  unsigned int result; //
  float scale ;
  char num ;
  ADCON1= 0;          //
  TRISA.B0=1; // AN0 INPUT
  TRISD = 0;            // Configure PORTD as outputs , COMMON CATHODES
  TRISB = 0;            // Configure PORTB as outputs ,7 SEGMENT DATA PORT

Digit1 = 0;            //Disable digit 1
Digit2 = 0;            //Disable digit 2
Digit3 = 0;            //Disable digit 3
Digit4 = 0;            //Disable digit 4


  while(1){
  result=ADC_Read(0);  // Read analog value from channel 0
  scale = result * (5000.0/1023.0); // input analog voltage
  scale = scale /10.0 ; // input temp inc for LM35
  num = scale ;
      ///////////
      DD1 = num / 1000;      //Extract DD1 from result >>THOUTHAND
      PORTB = Display(DD1);    //Display the DD1
      Digit1 = 1;            //Enable digit 1
      Delay_Ms(10);            //a short 10ms delay
      Digit1 = 0;            //Disable digit 1
      /////////
      DD2 = (num/100) % 10;        // DD2 digit >>>HUNDRED
      PORTB = Display(DD2);    //Display the DD3
      Digit2 = 1;            //Enable digit 2
      Delay_Ms(10);            //a short 10ms delay
      Digit2 = 0;            //Disable digit 2
     ////////////
     DD3 = (num/10) % 10;      //Extract DD3 from result >>TENS
      PORTB = Display(DD3);    //Display the DD3
      Digit3 = 1;            //Enable digit 3
      Delay_Ms(10);            //a short 10ms delay
      Digit3 = 0;            //Disable digit 3
     /////////
     DD4 = num % 10;      //Extract DD4 from result >>ONES
      PORTB = Display(DD4);    //Display the DD4
      Digit4 = 1;            //Enable digit 4
      Delay_Ms(10);            //a short 10ms delay
      Digit4 = 0;            //Disable digit 4
    }
}

Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: المدخل المباشر للتعامل مع وحدات السفن سيجمنت بطريقة Multiplexing من خلال تدريبات متعددة ومتدرجة

مُساهمة من طرف Admin في الأربعاء مايو 04, 2016 10:00 am

التدريب الخامس :

تطوير للتدريب السابق بوضع حرف :"C" للإشارة إلى الدرجات المئوية .

الدائرة الكهربية :



البرنامج :


الكود:

/*
 * Project name: Multiplexing_7-Segment 4 UNITS
    MCU:            PIC16F877A , ADC , LM35 MOD
    Oscillator:      HS, 8.0000 MHz
    SW:              mikroC PRO
*/
#define Digit1 PORTD.B0 //  DIGIT 1 FROM LEFT , THOUTHAND
#define Digit2 PORTD.B1 // DIGIT 2 FROM LEFT , HUNDRED
#define Digit3 PORTD.B2 // DIGIT 3 FROM LEFT , TENS
#define Digit4 PORTD.B3 // DIGIT 4 FROM LEFT ,  ONES

unsigned char Display (unsigned char digit)
  {
    unsigned char pattern;
    unsigned char  SEGMENT_MAP[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    pattern =  SEGMENT_MAP[digit] ;  //The pattern to return
    return (pattern);
  }

void main() {
  unsigned char DD1,DD2, DD3,DD4 ;
  unsigned int ADC_result; //
  float scale ;
  unsigned int num ;
  ADCON1= 0;          //
  TRISA.B0=1; // AN0 INPUT
  TRISD = 0;            // Configure PORTD as outputs , COMMON CATHODES
  TRISB = 0;            // Configure PORTB as outputs ,7 SEGMENT DATA PORT

Digit1 = 0;            //Disable digit 1
Digit2 = 0;            //Disable digit 2
Digit3 = 0;            //Disable digit 3
Digit4 = 0;            //Disable digit 4


  while(1){
  ADC_result=ADC_Read(0);  // Read analog value from channel 0
  scale = ADC_result * (5000.0/1023.0); // input analog voltage
  num = scale /10.0 ; // input temp inc for LM35
      ///////////
      DD1 = num / 100;      //Extract DD1 from ADC_result >>THOUTHAND
      PORTB = Display(DD1);    //Display the DD1
      Digit1 = 1;            //Enable digit 1
      Delay_Ms(10);            //a short 10ms delay
      Digit1 = 0;            //Disable digit 1
      /////////
      DD2 = (num/10) % 10;        // DD2 digit >>>HUNDRED
      PORTB = Display(DD2);    //Display the DD3
      Digit2 = 1;            //Enable digit 2
      Delay_Ms(10);            //a short 10ms delay
      Digit2 = 0;            //Disable digit 2
     ////////////
     DD3 = num % 10;      //Extract DD3 from ADC_result >>TENS
      PORTB = Display(DD3);    //Display the DD3
      Digit3 = 1;            //Enable digit 3
      Delay_Ms(10);            //a short 10ms delay
      Digit3 = 0;            //Disable digit 3
     /////////
     //DD4 = num % 10;      //Extract DD4 from ADC_result >>ONES
      PORTB = 0x39;    //Display C CHARACTER
      Digit4 = 1;            //Enable digit 4
      Delay_Ms(10);            //a short 10ms delay
      Digit4 = 0;            //Disable digit 4
    }
}

Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: المدخل المباشر للتعامل مع وحدات السفن سيجمنت بطريقة Multiplexing من خلال تدريبات متعددة ومتدرجة

مُساهمة من طرف Admin في الأربعاء مايو 04, 2016 10:08 am

التدريب السادس :

تطوير للبرنامج الأول مع إزالة حرف "C" واستخدام خانة الآحاد لبيان كسر الآحاد مع عرض النقطة العشرية على وحدة السفن سيجمنت :

الدائرة الكهربية :




البرنامج :


الكود:

/*
 * Project name: Multiplexing_7-Segment 4 UNITS
    MCU:            PIC16F877A , ADC , LM35 MOD
    Oscillator:      HS, 8.0000 MHz
    SW:              mikroC PRO
*/
#define Digit1 PORTD.B0 //  DIGIT 1 FROM LEFT , THOUTHAND
#define Digit2 PORTD.B1 // DIGIT 2 FROM LEFT , HUNDRED
#define Digit3 PORTD.B2 // DIGIT 3 FROM LEFT , TENS
#define Digit4 PORTD.B3 // DIGIT 4 FROM LEFT ,  ONES

unsigned char Display (unsigned char digit)
  {
    unsigned char pattern;
    unsigned char  SEGMENT_MAP[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    pattern =  SEGMENT_MAP[digit] ;  //The pattern to return
    return (pattern);
  }

void main() {
unsigned char DD1,DD2, DD3,DD4 ;

float result; //
unsigned int result1;
  ADCON1= 0;          //
  TRISA.B0=1; // AN0 INPUT
  TRISD = 0;            // Configure PORTD as outputs , COMMON CATHODES
  TRISB = 0;            // Configure PORTB as outputs ,7 SEGMENT DATA PORT

Digit1 = 0;            //Disable digit 1
Digit2 = 0;            //Disable digit 2
Digit3 = 0;            //Disable digit 3
Digit4 = 0;            //Disable digit 4


  while(1){
  result=ADC_Read(0);  // Read analog value from channel 0 ,0 to 1023
  result = result * (5000.0/1023.0); // input analog voltage
  result = result /10.0 ; // input temp in C for LM35 0.0 to 150.0
        ///////////
   result = result *10.0 ;   // float 0.0 to 1500.0
   result1=result; //integer 0 to 1500 to get fraction
      /////////////
      DD1 = result1 / 1000;      //Extract DD1 from result >>THOUTHAND(hundred)
      PORTB = Display(DD1);    //Display the DD1
      Digit1 = 1;            //Enable digit 1
      Delay_Ms(10);            //a short 10ms delay
      Digit1 = 0;            //Disable digit 1
      /////////
      DD2 = (result1/100) % 10;        // DD2 digit >>>HUNDRED (tens)
      PORTB = Display(DD2);    //Display the DD3
      Digit2 = 1;            //Enable digit 2
      Delay_Ms(10);            //a short 10ms delay
      Digit2 = 0;            //Disable digit 2
     ////////////
     DD3 = (result1/10) % 10;      //Extract DD3 from result >>TENS (ones)
      PORTB = Display(DD3);    //Display the DD3
      Digit3 = 1;            //Enable digit 3
      Delay_Ms(10);            //a short 10ms delay
      Digit3 = 0;            //Disable digit 3
     /////////
     DD4 = result1 % 10;      //Extract DD4 from result >>ONES(fraction)
      //PORTB = 0x39;    //Display C CHARACTER
     PORTB = Display(DD4);
      Digit4 = 1;            //Enable digit 4
      Delay_Ms(10);            //a short 10ms delay
      Digit4 = 0;            //Disable digit 4
    }
}

Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى