|
السلام عليكم
فكره جميله جدا تسلم أخي
اذن هي تشبه عمليه matrix ولكن ممكن تشرح لنا فكره لتعم الفائده للجميع
تحياتي الطيبه لكم
|
وعليكم السلام ورحمة الله وبركاته
نعم اخي حسن هذه الطريقة تشبه الطريقة المستخدمة في الماتركس ذات الاحجام الكبيرة وهذا الشرح ارجو ان يكون واضحا تم اختصار السوتشات بسوتش واحد
كود:
#include <mega8.h>
#include <delay.h>
///////////////////////////////////////
#define SH PORTB.0
#define DS PORTB.1 //اعادة تسمية لاقطاب المايكرو
#define ST PORTB.2
#define SH1 PORTB.3
#define DS1 PORTB.4
#define ST1 PORTB.5
//////////////////////////////////////
unsigned char DATA[]= { //تعريف مصفوفة الالرقام اللتي سوف نرسلها
1,5,2,3,4,5,6,7,
2,9,5,4,5,6,2,3,
3,8,7,9,5,1,1,5,
4,3,2,1,0,7,9,8,
5,7,4,8,7,1,2,3,
6,5,6,1,2,8,4,5,
7,5,4,7,8,9,5,6,
};
unsigned char seg0=192,seg1=249,seg2=164,seg3=176,seg4=153, //متغيرات تحوي الارقام كما يجب ان
seg5=146,seg6=130,seg7=248,seg8=128,seg9=144; //74hc595 تظهر على خرج ال
unsigned char segmant,segmant1[7], //متغيرات عامة سوف نستخدمها داخل البرنامج
X=0,Y=0,Z=0,M1=0,W=0;
////////////////////////////////////////////////////////////////
void main(void)
{
PORTB=0x00; //تعريف البوابة كخرج
DDRB=0xFF;
while (1)
{
//هنا نقوم بنقل الداتا الى هذه المتغيرات الداتا رقم صفر يعني الاول وضعناه
//في المتغير الاخيرسيغمانت7 ونقوم بنقل الداتا رقم ثمانية الى المتغير سيغمانت 6
//وهكذا الى نهاية الارقام اي كل اول رقم من كل سطر في المصفوفة
//وسنقوم بارسال هذه الداتا تسلسليا من اول رقم في السطر الاخير الى اول رقم
//في السطر الاول لان اول رقم سوف نرسله سوف يظهر في الاخير لاننا نقوم بعمل ازاحة للارقام
//(M1) هذا المتغير سوف نزيده في كل مرة بعد عرض الارقام الثمانية الاولى ثم الثانية الى ان
// ننتهي من عرض كامل الارقام نقوم بعدها بتصفيره من اجل اعادة العرض يعني بهل حالة كانه
// عندي ماتريكس من ثمانية اعمدة
segmant1[0]=DATA[M1+48];
segmant1[1]=DATA[M1+40];
segmant1[2]=DATA[M1+32];
segmant1[3]=DATA[M1+24];
segmant1[4]=DATA[M1+16];
segmant1[5]=DATA[M1+8];
segmant1[6]=DATA[M1];
M1++;
if(M1==8)M1=0;
/////////////////////////////////////////////////////////////////////////////
//هذه السوتشات من اجل فحص الرقم الموجود في المتغير وارساله كما يجب ان يظهر على خرج مسجل الازاحة
for (W=0;W<7;W++)
{
switch (segmant1[W])
{
case 0: segmant=seg0;
for (X=0;X<8;X++)
{
DS1=segmant&0b10000000; SH1=1;SH1=0; segmant=segmant<<1;
}; break;
case 1: segmant=seg1;
for (X=0;X<8;X++)
{
DS1=segmant&0b10000000; SH1=1;SH1=0; segmant=segmant<<1;
};break;
case 2: segmant=seg2;
for (X=0;X<8;X++)
{
DS1=segmant&0b10000000; SH1=1;SH1=0; segmant=segmant<<1;
};break;
case 3: segmant=seg3;
for (X=0;X<8;X++)
{
DS1=segmant&0b10000000; SH1=1;SH1=0; segmant=segmant<<1;
};break;
case 4: segmant=seg4;
for (X=0;X<8;X++)
{
DS1=segmant&0b10000000; SH1=1;SH1=0; segmant=segmant<<1;
};break;
case 5: segmant=seg5;
for (X=0;X<8;X++)
{
DS1=segmant&0b10000000; SH1=1;SH1=0; segmant=segmant<<1;
};break;
case 6: segmant=seg6;
for (X=0;X<8;X++)
{
DS1=segmant&0b10000000; SH1=1;SH1=0; segmant=segmant<<1;
};break;
case 7: segmant=seg7;
for (X=0;X<8;X++)
{
DS1=segmant&0b10000000; SH1=1;SH1=0; segmant=segmant<<1;
};break;
case 8: segmant=seg8;
for (X=0;X<8;X++)
{
DS1=segmant&0b10000000; SH1=1;SH1=0; segmant=segmant<<1;
};break;
case 9: segmant=seg9;
for (X=0;X<8;X++)
{
DS1=segmant&0b10000000; SH1=1;SH1=0; segmant=segmant<<1;
};break;
};
};
ST1=1;ST1=0; //بعد ازاحة جميع البيانات الموجودة في المتغيرات نعطي امر لاخراجها
// دفعة واحدة على خرج مسجلات الازاحة
/////////////////////////////////////////////////////////
if(Y==0){DS=1;SH=1;SH=0;DS=0;ST=1;ST=0;} //بعد اخراج البيانات نقوم بتفعيل اقطاب السفن سكمنت
if(Y<8&&Y!=0){SH=1;SH=0;ST=1;ST=0;} //المشتركة لكي تضيئ وكل ثماني ازاحات للصفر نقوم بوضع واحد
Y++; //وهكذا ستعمل كل ثماني قطع من السفن سيكمنت دفعة واحدة
if(Y==8)Y=0; //وننتظر 2 ميلي ثانية وهي فترة كافية لاضائة وحدات العرض
delay_ms(2); //ولعرض كامل الارقام هنا سيلزم 16 ميلي ثانية وهي كافية لان
//نرى جميع الارقام بدون رجفة
/////////////////////////////////////////////////////////
for (Z=0;Z<56;Z++) //هذه من اجل اطفاء وحدات الاظهار لفترة صغيرة
// لكي لايحدث تداخل في الارقام عند عمل الازاحة
{
DS1=1;
SH1=1;
SH1=0;
};
ST1=1;ST1=0;
////////////////////////////////////////////////////////////
}
}