قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية عطية حسن محمود
عطية حسن محمود
:: عضو ذهبي و مشرف سابق لورشة صيانة التلفزيون ::
تاريخ التسجيل: Aug 2005
المشاركات: 1,029
نشاط [ عطية حسن محمود ]
قوة السمعة:
قديم 08-01-2010, 09:20 PM المشاركة 9   
افتراضي مرة اخرى



اشكرك اخى geniusse01
انا تحت امرك وامر زملائى بالمنتدى لامدادهم باى نظرية لعمل جهاز ما بل بالكتالوج ودائرته ان تواجدت
اخوانى انا ارجو الخير لكم ولدخول العالم الحقيقى الذى صنعت من اجله البيك من وجهة نظرى
اموت بالحسرة كلما رايت جهاز تافه متاكد انه يمكن صنعه محليا واخذ موافقة به من مركز اعتماد القياسات
انا لا اهدف لصناعة الة حاسبة بعينها ولكن اهدف فى الحقيقة الى طريقة عرض الارقام بالعلامة العشرية اينما كانت
واخى geniusse01 انت تقول ضع متغير به احاد وعشرات نعم معك حق ولكن انا لا اعرف سيكون الرقم بالملايين او المليارات اعرف اننى احتاج مصفوفة تخزن الارقام واحد تلوا الاخر
ثم استدعى الارقام من المصفوفة بترتيبهم وتحويلهم الى رقم واحد وهذا كما قلت عند استخدام "+" مثلا ثم مصفوفة اخرى مثلها بعد "+" ثم الجمع مع "="
ولو نجحت فى ذلك ماذا لو ادخل المستخدم "+" مرة ثانية
الالة الحاسبة تم صناعتها منذ زمن ولكن هدفى كما وضحت
اعتقد انه سيكون مثال مهم بل اقوى الامثلة
انا صنعت مثال ناقص جدا بالفلوكود لانى مبتدىء فيه
ولتسهيل الامر يوجد مثال جاهز للالة الحاسبة بالسى لكن حقيقة محتاج شرح وهو موجود مع البروتس باسم
PIC Calculator لو تحول للمايكروسى حيوضح جدا
واعتذر لاخى ومعلمى زكى شاكر ان اساء فهمى فانت استاذى اكبر من ذلك ويكفى ماتقدم من جهد بدون مقابل للقرية
جزاكم الله خيرا

اعلانات

الصورة الرمزية عطية حسن محمود
عطية حسن محمود
:: عضو ذهبي و مشرف سابق لورشة صيانة التلفزيون ::
تاريخ التسجيل: Aug 2005
المشاركات: 1,029
نشاط [ عطية حسن محمود ]
قوة السمعة:
قديم 08-01-2010, 09:30 PM المشاركة 10   
افتراضي


كود البرنامج الرئيسى يستخدم البيك 16F876
كود:
/******************************************************************************            
************                 LABCENTER ELECTRONICS                  ************            
************           Proteus VSM Sample Design Code               ************            
************                   IAR 'C' Calculator                   ************            
*******************************************************************************/       

#include "calc.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
          
//Variables
static FLOAT lvalue;
static FLOAT rvalue;
static CHAR lastop;

VOID main (VOID)
// Initialise our variables and call the 
// Assembly routine to initialise the LCD display. 
 { lcd_init();
   calc_evaluate();
 }   

VOID calc_evaluate()
 { CHAR number[MAX_DISPLAY_CHAR+1], key;
   INT8 pos;
   FLOAT tmp;
   
   // Initialize static values:
   lvalue = 0;
   rvalue = 0;
   lastop = 0;
   
   // Display a Zero to start:
   calc_format(0);
   
   // Clear the buffer before we start.
   pos = 0;

   for (;;)
    { key = calc_getkey();
      if (calc_testkey(key))
       { // Key test positive for digit so we read it into the
         // buffer and then write the buffer to the screen/LCD.
         // Size limit the number of digits - allow for termination
         // and possible negative results.
         if (pos != MAX_DISPLAY_CHAR - 2)
          { number[pos++] = key;
            number[pos] = 0;
            calc_display(number);
          }
       }
      else       
       { // If a number has been entered, then evaulate it.
         // The number is stored to lvalue if we have no current operator,
         // or else rvalue if we do.
         if (pos != 0)
          { tmp = atof(number);
            if (lastop == 0)
               lvalue = tmp;
            else
               rvalue = tmp;
          }

         // Reset the input buffer.
         pos = 0;
       
         // Process the Command - LastOp holds the last actual operator;          
         if (lastop != 0)
            calc_opfunctions(lastop);
         if (key != '=')
            lastop = key;
         else 
            lastop = 0;  
       }
    }
 }

VOID calc_opfunctions (CHAR token)
// Handle the operations. Lvalue holds the result and we test for
// consecutive operator presses.
 { INT8 result = OK;
   switch (token)
    { case '+' : lvalue += rvalue; break;
      case '-' : lvalue -= rvalue; break;
      case '*' : lvalue *= rvalue; break;
      case '/' : 
         if (rvalue != 0) 
            lvalue /= rvalue;
         else
            result = ERROR;
         break;      
     }

   if (result == OK)
      calc_format(lvalue);
   else if (result == ERROR)
      calc_display("*ERROR*"); 
 }

 
/************************************************************************
***** Utility Routines *****
***************************/

VOID calc_format (FLOAT f)
 { CHAR buf [MAX_DISPLAY_CHAR+1];
   FLOAT divisor = 100000000;
   FLOAT digit;
   INT8 pad=0, p=0;

   // Sort out minus sign:   
   if (f >= 0)
      buf[p++] = ' ';
   else
    { buf[p++] = '-';
      f = -f;
    }

   if (f >= divisor)
      buf[p++] = 'E';
   else
      while (p < MAX_DISPLAY_CHAR && (divisor > 1 || f >= 0.0000001))
       { divisor /= 10;
         digit = floor(f/divisor);
         if (divisor < 1 && divisor > 0.01)
            buf[p++] = '.';
         if (digit != 0 || divisor < 10)
          { buf[p++] = digit + '0';
            pad = TRUE;        
          }
         else if (pad)
            buf[p++] = '0';
         f -= digit*divisor;
       }
   buf[p] = 0;           
   calc_display(buf);
 }

BOOL calc_testkey (CHAR key)
// Test whether the key is a digit, a decimal point or an operator. 
// Return 1 for digit or decimal point, 0 for op.
 { if ((key == '.')|| ((key >= '0') && (key <= '9')))
      return TRUE;
   else
      return FALSE;
 }

/************************************************************************
***** I/O Routines *****
************************/

CHAR calc_getkey (VOID)
// Use the input routine from the *Keypad_Read* assembly file to 
// Scan for a key and return ASCII value of the Key pressed.
{ CHAR mykey;
  while ((mykey = keypadread()) == 0x00)
     /* Poll again */;
  return mykey;
 }

VOID calc_display (CHAR *buf)
// Use the Output and Clearscreen routines from the 
// *LCD_Write* assembly file to output ASCII values to the LCD.
 { INT8 i;
   clearscreen();
   for (i=0 ; buf[i] != 0; i++)
//    { if (buf[calc_testkey(buf[i]) || buf[i] == 0x2D)
       { wrdata(buf[i]); }
//    }   
 }
كود البرامج الفرعية
اولا calc.h

كود:
/******************************************************************************            
************             LABCENTER ELECTRONICS                      ***********            
************	       Proteus VSM Sample Design Code               ***********		 	     
************	           IAR 'C' Calculator                 	    ***********            
******************************************************************************/           
                                                                                            
typedef void VOID;                                                                          
typedef int  INT;                                                                           
typedef signed char INT8;
typedef signed int  INT16;
typedef signed long INT32;
typedef unsigned short WORD;                                                                
typedef char CHAR;                                                                          
typedef unsigned char BYTE;                                                                 
typedef float FLOAT;                                                                        
typedef double DOUBLE;                                                                      
typedef long LONG;                                                                          
typedef INT8 BOOL;
                                                                                            
//Display Config.
#define MAX_DISPLAY_CHAR 10    

// Keypad Config.
#define KEYP_NUM_ROWS 4
#define KEYP_NUM_COLS 4

//LCD Registers addresses (PORT B)
#define LCD_CMD_WR	   0x00
#define LCD_DATA_WR	   0x01
#define LCD_BUSY_RD	   0x02
#define LCD_DATA_RD	   0x03
                     
//LCD Commands        
#define LCD_CLS		   0x01
#define LCD_HOME	   0x02
#define LCD_SETMODE	   0x04
#define LCD_SETVISIBLE	   0x08
#define LCD_SHIFT	   0x10
#define LCD_SETFUNCTION	   0x20
#define LCD_SETCGADDR	   0x40
#define LCD_SETDDADDR	   0x80

#define E_PIN_MASK         0x04
#define NOP                asm("NOP")

#define FALSE 0
#define TRUE  1                                                       
                                                                                            
//Error handling status.                                                                    
enum ERROR { OK = 0, SLEEP = 1, ERROR = 2};                                                 
                                                                                               
/************************************************************************                   
***** FUNCTION PROTOTYPES *****                                                             
******************************/                                                             
VOID calc_evaluate();                                                                       
CHAR calc_getkey (VOID);                                                                    
VOID calc_format (FLOAT f);
VOID calc_display (CHAR *buf);                                             
                                                                                            
//Operator Indirect function.                                                               
VOID calc_opfunctions (CHAR token);                                                         
                                                                                            
//Utility functions.                                                                        
BOOL  calc_testkey  (CHAR ch);                                                              
VOID  calc_output   (INT status);                                                           

// Keypad Functions.
CHAR keypadread(); 
CHAR scankeypad();

VOID lcd_init();
VOID lcd_wait();
VOID wrcmd (CHAR data);
VOID wrdata(CHAR data);
VOID clearscreen();
ثانيا KEYPADCTRL.C
كود:
/*********************************************************************
**********************************************************************
*****                                                             ****
*****         L A B C E N T E R    E L E C T R O N I C S          ****
*****                                                             ****
*****                  PIC 16F87X Keypad Scanner                  ****
*****                                                             ****
**********************************************************************
*********************************************************************/

// Rows are connected to Port C 
// Columns are connected to Port A with external pull-up resistors.

#include "calc.h"
#include "io16F876.h"

CHAR keycodes[16] = {'7','8','9','/','4','5','6','*','1','2','3','-','.','0','=','+'};

CHAR keypadread()
// Find a key, wait for
// it to be released and return.
 { CHAR key = scankeypad();
   if (key)
      while (scankeypad() != 0)
         /* Nothing */  ;  
   return key;
 } 

CHAR scankeypad()
// Scan the keypad for a keypress.
// Return 0 for no press or the char pressed.
 { INT8 row,col,tmp;
   CHAR key=0;

   // Disable ADC functionality on Port A
   ADCON1 = 6; 

   // Initialise Port for input, and PORTC for output
   TRISA = PORTC = 0xFF;
   TRISC = 0;

   for (row=0; row < KEYP_NUM_ROWS; row++)
    { // Drive appropriate row low and read columns:
      PORTC = ~(1 << row);
      asm ( "NOP");     
      tmp = PORTA;
    
      // See if any column is active (low):
      for (col=0; col<KEYP_NUM_COLS; ++col)
         if ((tmp & (1<<col)) == 0)
          { INT8 idx = (row*KEYP_NUM_COLS) + col;
            key = keycodes[idx]; 
            goto DONE;
          }
    }
   DONE:

   // Disable Port Drive and return.
   TRISC = 0xFF;
   return key;
 }
ثالثا كود LCDCTRL.C
كود:
/*********************************************************************
**********************************************************************
*****                                                             ****
*****         L A B C E N T E R    E L E C T R O N I C S          ****
*****                                                             ****
*****                    PIC 16F87X LCD Driver                     ****
*****                                                             ****
**********************************************************************
*********************************************************************/

#include "calc.h"
#include "io16F876.h"

VOID lcd_init ()
// Initialise the LCD Display. 
 { PORTB = TRISB = 0; 
   TRISC = PORTC = 0xFF;
   wrcmd(0x30);                  // 8-bit mode - 1 line.
   wrcmd(LCD_SETVISIBLE+0x04);   // Display only - no cursors.
   wrcmd(LCD_SETMODE+0x03);      // Automatic Increment - Display shift left.
   wrcmd(LCD_SETDDADDR+0x0F);    // Initial Position far right.
 }

VOID clearscreen ()
// Clear the LCD Screen and reset
// initial position.
 { wrcmd(LCD_CLS);
   wrcmd(LCD_SETDDADDR+0x0F);
 }

/***** Utility Functions *****/

VOID wrcmd (CHAR cmdcode)
// Write a command to the LCD display.
 { TRISC = 0;
   PORTC = cmdcode;

   // Write to PORTB to latch data into the display.
   // Toggle Pin 'E' to send the command.
   PORTB  = LCD_CMD_WR;
   PORTB |= E_PIN_MASK;
   asm("NOP");
   PORTB &= ~E_PIN_MASK;
   
   lcd_wait();
 }
     
VOID wrdata (CHAR data)
// Write a Character to the LCD Display. 
 { TRISC = 0;
   PORTC = data;
   
   PORTB = LCD_DATA_WR;
   PORTB |= E_PIN_MASK;
   asm("NOP");
   PORTB &= ~E_PIN_MASK;
   
   lcd_wait();
 }

VOID lcd_wait ()
// Wait for the LCD busy flag to clear. 
 { BYTE status;
   TRISC = 0xFF;
   
   PORTB = LCD_BUSY_RD;
   do
    { PORTB |= E_PIN_MASK;
      asm("NOP");
      status = PORTC;
      PORTB &= ~E_PIN_MASK;
    } while (status & 0x80);
 }
ارجو من ليه القدرة على الشرح او تحويله الى ميكروسى
واتمنى لو تم تحويله الى فلوكود ايضا لانه اسهل

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية عطية حسن محمود
عطية حسن محمود
:: عضو ذهبي و مشرف سابق لورشة صيانة التلفزيون ::
تاريخ التسجيل: Aug 2005
المشاركات: 1,029
نشاط [ عطية حسن محمود ]
قوة السمعة:
قديم 08-01-2010, 09:36 PM المشاركة 11   
افتراضي


صورة البرنامج بالبروتس


geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,134
نشاط [ geniusse01 ]
قوة السمعة:
قديم 08-01-2010, 09:53 PM المشاركة 12   
افتراضي


السلام عليكم

انا سعيد جدا بردك اخي عطية ..البرنامج يبدو دسما جدا ... ولكن لا مانع من المشاركة جميعا لحل البرنامج ومن ثم التعديل عليه ...واشكرك على عرضك الجميل بالنسبة للكيمياء ..وان شاء الله اغلبك معي كثير...


ان شاء الله احاول بالبرنامج بس بدي مساعدت معي كمان مشان نفهم البرنامج ونشرحه للجميع باذن الله تعالى...ربنا يوفقك وينفع بك الاسلام والمسلمين...


السلام عليكم اخونا وحبيبنا زكي شاكر

انا عتبان عليك شوي ...مو لشي حدث انما هي الاخوة ...وانا احترمك جدا..كنت قبل فترة حابب اتطمن عليك وابعتلك رسالة خاصة بس للاسف ما مشي الحال هنا على المنتدى ولا على منتدى اخر...وكنت اريد السؤال عن الصديق العزيز النسر العرب واخباره...سلملي عليه كثير..ولا تحرمنا من وجودك وابداعاتك...

واخر دعوانا ان الحمدلله رب العالمين ... وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم...


التعديل الأخير تم بواسطة : geniusse01 بتاريخ 08-01-2010 الساعة 10:38 PM

الصورة الرمزية م. نافذ ابو كشك
م. نافذ ابو كشك
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2009
الدولة: االسعودية - الاحساء
المشاركات: 148
نشاط [ م. نافذ ابو كشك ]
قوة السمعة:
قديم 08-01-2010, 10:05 PM المشاركة 13   
افتراضي


السلام عليكم ورحمة الله وبركاتة

الى الاخ عطية الف تحية واحترام
والله يعطيك الف عافية على مجهوداتك

وانا اوعدك بأذن الله بعد ما انهي موضوع i2c

سوف اضع مشاركة جديدة لعمل الة حاسبة
مع برنامجها بالمايكروسي والبروتوس ان شاء الله

ويكون الموضع مفتوح لاراء الجميع ومناقشة الجميع


واللهم انصر الاسلام والمسلمين


الصورة الرمزية عطية حسن محمود
عطية حسن محمود
:: عضو ذهبي و مشرف سابق لورشة صيانة التلفزيون ::
تاريخ التسجيل: Aug 2005
المشاركات: 1,029
نشاط [ عطية حسن محمود ]
قوة السمعة:
قديم 08-01-2010, 10:50 PM المشاركة 14   
افتراضي


اخوانى طبعا معروف ان الميكروسى به مكتبات جاهزة مثل الكيباد وال lcd فيمكن الاستغناء عن الملفين كيباد و lcd بالتعديل للمكتبة الاصلية
ثانيا ملف calc.h ما هو الا تسمية للمتغيرات والميكروسى لديه المتغيرات لكن ليس بحروف كبتل capital فيمكن الاستغناء عنه بتعديل الكود
اظن الموضوع اصبح اسهل الان ولنبدأ معا


زكي شاكر
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: المغرب
المشاركات: 2,945
نشاط [ زكي شاكر ]
قوة السمعة:
قديم 08-01-2010, 11:48 PM المشاركة 15   
افتراضي


أخي فادي شكرا لك على سؤالك عن أخيك الأكبر منك (سنا) تحية مني لك ..
أخي عطية حسن محمود موضوع الارقام ذات الفاصلة متعلق ربما بمتغيرات تعرف في لغة السي ب variable float .. و في الاصدار الرابع من فلوكود امكانية التعامل بها
امثلة ذات صلة هنا :
Flowcode Examples
http://www.matrixmultimedia.com/Down...lick.php?id=63
من هذه الصفحة:
http://www.matrixmultimedia.com/Flowcode3a-X.php
حاليا ادرسها واحدا بعد الاخر وقد انتهيت والحمد لله من جانب كان يشغلني وهو التحويل من النظام التنائي الى العشري وبالضبط Binaire/BCD
هذا الموضوع اتعبني في السابق في الاسمبلي لكن مع فلوكود كانت الرحلة أشبه بنزهة ..
أرجو التوفيق للجميع و الى اللقاء ..


robota
:: عضو ذهبي ::
تاريخ التسجيل: Jul 2009
الدولة: الخرطوم_السودان
المشاركات: 895
نشاط [ robota ]
قوة السمعة:
قديم 09-01-2010, 08:54 PM المشاركة 16   
افتراضي


كيف يمكن تخزين ارقام من الكيباد فى متغير ثم استدعاءها لاجراء عملية جمع او طرح الخ على ارقام اخرى مخزنة فى متغير اخر
لان الموضوع محيرنى قبل ان ابدأ بعمل الة حاسبة
وجزاكم الله خيرا
م عطية اولا اعتذر عن التاخر فى الرد
اعتقد ان المشكلة التى تتحدث عنها هى عملية دمج الارقام مثلا اذا ادخل المستخدم الارقام 7ثم 4ثم 1 كيف جعل هذه الارقام رقما واحدا وهو الرقم 741 حتى يسهل جمعه او طرحه او ..... . المشكلة هى اننا لا نعرف عدد الخانات مسبقا . لكن عموما الامر سهل فقط ادخل هذه الجملة ضمن البرنامج
كود:
unm=num*10+key;
num:يمثل الرقم المطلوب بعد الدمج .
key: تمثل الرقم الذى تم ادخاله ويمكن الحصول عليه من الدالة
كود:
 key= Keypad_Released();
مع العلم انى قمت تجربة هذا فى البروتس وهو يعمل بنجاح
تقبل تحياتى



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 05:30 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)