السلام عليكم
بكل بساطة تستخرج القيم الموجودة في المصفوفة كالتالي
مثلا تريد اخراج قيمة الخانة الثالثة من المصفوفة الى البور B ستكتب
وهذا في حالتك سيجعل النتيجة 3 عشري..
وان كنت تسأل عن كيفية اسناد كل المصفوفة للشاشات الأربع ممكن
كود:
porta=1;
PORTB=arr[0];
delay();
PORTA= 2;
portb=arr[1];
delay();
porta=4;
portb=arr[2];
delay();
porta=8;
portb=arr[3];
delay();
مع تكرار هذه الحلقة ستعمل الشاشات بال multiplexage
اعتقد فهمت وظيفة البور A ؟ سيتحكم في الاطراف المشتركة للشاشات الاربع
اجعل التأخير في حدود ميلي ثانية على الأكثر.
هذا طبعا كود سهل يمكنك تقليصه أكثر علما ان استخراج قيمة المصفوفة ممكن ان يتم باسناد متغير يحمل رقم الخانة..
كود:
i=3;
PORTB=arr[i];
(هنا النتيجة 4 )
|
شكراااا أخى الكريم وجزاك الله خيرااا
من الواضح أننى لا استطيع وضع السؤال بشكل صحيح .. على العموم دة كود كنت كاتبة من فطرة ..
ولكن جزئية المصفوفه لا أفهمها ..
اقتبستها من أحد الأكواد واستخدمتها مع باقى الكود بتاعى ولكن للأسق لا افهم طريقه عمل المصفوفه بهذا الشكل ؟؟
لماذا تم اسناد ارقام مبدأيه للمصفوفه .. أنا اعلم أنها ارقام بالنظام العشرى .. وهى تبدأ من ( 0 ) الى (9 ) ...
لاحظ الكود
كود:
// ENG / ABDALLA HEYGAZY //
// DATA / 2016 / 3 / 17 //
#define enable_1 portb.f0
#define enable_2 portb.f1
#define enable_3 portb.f2
#define enable_4 portb.f3
#define enable_5 portb.f4
#define enable_6 portb.f5
#define DP portc.f7
////////////////////////////////
#define enable_1_dir trise.f0
#define enable_2_dir trise.f1
#define enable_3_dir trise.f2
#define enable_4_dir trise.f3
#define enable_5_dir trise.f4
#define enable_6_dir trise.f5
#define DP_dir trisc.f7
////////////////////////////////
#define seg_data portc
#define seg_data_dir trisc
#define seg_data1 portd
#define seg_data_dir1 trisd
#define output 0
#define input 1
#define off 0
#define on 1
///////////////////////////////
////////////////////////////////////////////////////////////////////////////////
char segment[]={63,6,91,79,102,109,125,7,127,111};
char segment1[]={63,6,91,79,102,109,125,7,127,111};
unsigned char ch,x;
unsigned int adc_rd;
unsigned int adc_rd1;
char *text;
long tlong;
long tlong1;
///////////////////
void init(){
INTCON = 0;
ADCON1 = 0x02;
seg_data_dir=enable_1_dir=enable_2_dir=enable_3_dir=DP_dir=enable_4_dir=enable_5_dir=enable_6_dir=output;
seg_data_dir=enable_4_dir=enable_5_dir=enable_6_dir=DP_dir=output;
seg_data=0;
seg_data1=0;
enable_1=1;
enable_2=1;
enable_3=1;
enable_4=1;
enable_5=1;
enable_6=1;
TRISB=output;
TRISD=output;
PORTB=off;
PORTD=off;
TRISE=output;
PORTE=off;
TRISA=3;
PORTE=off;
}
////////////////////////////////////////////////////////////////////////////////
void show_adc() {
adc_rd = ADC_Read(0);
tlong = (long)adc_rd * 5000;
tlong = tlong / 1023;
//***********************//
adc_rd1 = ADC_Read(1);
tlong1 = (long)adc_rd1 * 5000;
tlong1 = tlong1 / 1023;
}
void show_number() {
////////////////////////////////////////////////////////////////////////////////
enable_1=0;enable_2=1;
enable_3=1;DP=1;
seg_data=seg_data&0x80|segment[tlong/1000];
delay_ms(1);
seg_data=0;
////////////////////////////////////////////////////////////////////////////////
enable_1=1;enable_2=0;
enable_3=1;
seg_data=seg_data&0x80|segment[tlong%1000/100];
delay_ms(1);
seg_data=0;
////////////////////////////////////////////////////////////////////////////////
enable_1=1;enable_2=1;
enable_3=0;
seg_data=seg_data&0x80|segment[tlong%1000%100/10];
delay_ms(1);
seg_data=0;
////////////////////////////////////////////////////////////////////////////////
enable_1=1;enable_2=1;
enable_3=1;
seg_data=seg_data&0x80|segment[tlong%1000%100%10];
delay_ms(1);
seg_data=0;
}
void show_number2() {
////////////////////////////////////////////////////////////////////////////////
enable_4=0;enable_5=1;
enable_6=1;DP=0;
seg_data1=seg_data1&0x80|segment1[tlong1/1000];
delay_ms(1);
seg_data1=0;
////////////////////////////////////////////////////////////////////////////////
enable_4=1;enable_5=0;
enable_6=1;
seg_data1=seg_data1&0x80|segment1[tlong1%1000/100];
delay_ms(1);
seg_data1=0;
////////////////////////////////////////////////////////////////////////////////
enable_4=1;enable_5=1;
enable_6=0;
seg_data1=seg_data1&0x80|segment1[tlong1%1000%100/10];
delay_ms(1);
seg_data1=0;
////////////////////////////////////////////////////////////////////////////////
enable_4=1;enable_5=1;
enable_6=1;
seg_data1=seg_data1&0x80|segment1[tlong1%1000%100%10];
delay_ms(1);
seg_data1=0;
}
void InitTimer0(){
OPTION_REG = 0x88;
TMR0 = 56;
INTCON = 0xA0;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 56;
//Enter your code here
}
}
void main(){
init();
InitTimer0();
loop4:
while (1)
{
show_adc();
show_number();
show_number2();
if( tlong>=1500 ) { porta.f3=1; porte.f2=0; porte.f1=0; goto loop }
show_adc();
show_number();
show_number2();
}
loop:
while (1)
{
if( tlong>1700 ) { porte.f2=1; porta.f3=0; goto loop1 }
if( tlong<1500 ) { porta.f3=1; porte.f2=0; goto loop4 }
show_adc();
show_number();
show_number2();
}
loop1:
while (1)
{
if( tlong>1800 ) { porte.f1=1; porte.f0=0; porte.f2=0;goto loop2 }
if( tlong<1700 ) { porte.f2=1; porte.f1=0; porte.f0=0; porta.f3=0; goto loop }
show_adc();
show_number();
show_number2();
}
loop2:
while (1)
{
if( tlong>1900 ) { porte.f0=1; porte.f1=0; porte.f2=0; goto loop3 }
if( tlong<1800 ) { porte.f1=1; porte.f0=0; porte.f2=0; goto loop1 }
show_adc();
show_number();
show_number2();
}
loop3:
while (1)
{
if( tlong>=2010 ) { porta.f5=1; porte.f0=0; porte.f1=0; porte.f2=0; }
if( tlong<=1900 ) { porte.f0=1; porte.f1=0; porta.f5=0; porte.f2=0; goto loop2 }
if( tlong>=2450 ) { porta.f2=1;goto loop5 }
show_adc();
show_number();
show_number2();
}
loop5:
while (1)
{
if( tlong<2350 ) { porta.f5=1; porta.f2=0; porte.f0=0; porte.f1=0; porte.f2=0; porta.f3=0;goto loop3 }
show_adc();
show_number();
show_number2();
}
}
الحمد لله كل سطور الكود انا اللى كاتبها وأفهمها جيداااا .. ولكن لا استطيع فهم جزئيه .. أسناد قيم مبدأيه للمصفوفه .. وهى قيم بنظام العشرى وهو "نظام الديسمال "
لاحظ الكود
كود:
char segment[]={63,6,91,79,102,109,125,7,127,111};
تم اسناد أرقام للمصفوفه ك قيم مبدأية .. وهى تبدأ من ( 0 ) الى ( 9 ) بالنظام العشرى " ديسمال .. بمعنى رقم ( صفر ) بالنظام العشرى = 63
السؤال هنا ما فائدة أن نعطى المصفوفه أرقام تبدأ من ( 0 ) الى ( 9 ) ؟
وأيضااا تلاحظ فى الكود أن بيتم تحويل القرأة القادمه من محول الإشارة ( ADC ) وأسنادها لمتغير أسمة
وبعدها نجرى عمليه ضرب وقسمة على القيمه المقروأة من محول الإشارة ( ADC ) وبعدها يتم اسناد الناتج الى المصفوفه .. وتعرض النتيجه بكل دقه على أربع شاشات 7سيجمينت ..
السؤال ؟
كيف تتم مجرى الأمور لأن الاحظ أن الشاشات تعرض الأرقام من بداية خانة الأحاد الى خانة اللألاف .. تصاعدى أو تنازلى .. حسب قيمة قرأة محول الإشارة ( ADC )
لاحظ الجزء من الكود وهو الخاص بالقرأة من محول الإشارة ( ADC ) وأجراء بعض الحسابات على القيمه وأسنادها للمصفوفة .. وعرضها على الأربع شاشات 7سيجمينت ..
كود:
void show_adc() {
adc_rd = ADC_Read(0);
tlong = (long)adc_rd * 5000;
tlong = tlong / 1023;
المهم لدى والخلاصه من الموضوع ...
هو اريد طريقة ما استطيع من خلالها اسناد قيمه للمصفوفه ومن ثم عرضها على شاشات ال 7 سيجمنت .. مهما كان الرقم من خانة الأحاد الى خانة اللألاف ..
وهنا كود يخأذ باقى القسمه ويضعها فى الخانة التاليه للمصفوفه ..
كود:
void show_number() {
////////////////////////////////////////////////////////////////////////////////
enable_1=0;enable_2=1;
enable_3=1;DP=1;
seg_data=seg_data&0x80|segment[tlong/1000];
delay_ms(1);
seg_data=0;
////////////////////////////////////////////////////////////////////////////////
enable_1=1;enable_2=0;
enable_3=1;
seg_data=seg_data&0x80|segment[tlong%1000/100];
delay_ms(1);
seg_data=0;
////////////////////////////////////////////////////////////////////////////////
enable_1=1;enable_2=1;
enable_3=0;
seg_data=seg_data&0x80|segment[tlong%1000%100/10];
delay_ms(1);
seg_data=0;
////////////////////////////////////////////////////////////////////////////////
enable_1=1;enable_2=1;
enable_3=1;
seg_data=seg_data&0x80|segment[tlong%1000%100%10];
delay_ms(1);
seg_data=0;
}
وهو ايضاا يعمل بنظام multiplexage لعرض جميع قيم المصفوفه على الأربع شاشات ..
أسف على الإطالة ويارب أكون قدرت أوصل سؤالى بشكل واضح .. وأسف على الإزعاج
شكرااا للجميع ..