فلنبدأ بالشرح :
الكود:
كود:
// leeters address in the eeprom
// 74c595 pins
#define shiftp PORTb.F7
#define latchp PORTb.F6
#define dc PORTb.F5
//74hc595 functinon
#define latch latchp=1;latchp=0;
#define shift shiftp=1;shiftp=0;
//74hc164 functinon
#define ser porta.f6
#define clk porta.f7=1;porta.f7=0;
//some leds
#define led1 porta.f0
#define led2 porta.f1
//delay<s> :::
#define del delay_us(1);
//------------------------------------------------------------------------------
sbit Soft_I2C_Scl at Ra2_bit;
sbit Soft_I2C_Sda at Ra3_bit;
sbit Soft_I2C_Scl_Direction at TRISa2_bit;
sbit Soft_I2C_Sda_Direction at TRISa3_bit;
//------------------------------------------------------------------------------
unsigned char symbol,symbol2,symbol_1=32;
unsigned char ch[64],txt[5];
unsigned char addres,i2c_addres;
unsigned char eow; //end of the wtiteing
unsigned char speed; //scrolling speed
unsigned char bs; //buffer size
unsigned char arabic_e_letters=0;
//scrollingmode = 0 = from the left to the right (for the english words)
//scrollingmode = 1 = from the right to the left (for the arabic words)
//------------------------------------------------------------------------------
//senfing data to the 47hc595
void send(unsigned char _shiftdata){
unsigned char i=8;
while (i>0){
if (_shiftdata.F7==0) {dc = 1;}
else {dc = 0;}
_shiftdata = _shiftdata<<1;
shift;
i--; } //while
}//send595
//------------------------------------------------------------------------------
void column_num(char cn ){
ser=0;
for(eow=0;eow<64;eow++){clk;}
ser=1;clk;ser=0;
while(cn>0) {clk;
cn--;}
}
//------------------------------------------------------------------------------
void get_ch(){char llk=0xa0,temp,lc,fl=0;
unsigned char med;
if(symbol>'*'&&arabic_e_letters==0){
med=symbol;med=med-65;if(symbol>=91){fl=1;med=med+64;}; i2c_addres=med*8;llk=0xa2 ;}// if page 1
if(symbol<='*'&&arabic_e_letters==0){med=symbol;med=med-32; i2c_addres=med*8;llk=0xa0 ;}// if page 0
if(arabic_e_letters==1){
if(symbol_1=='v'||symbol_1==']'||symbol_1=='`'||symbol_1=='.'||symbol_1==','||symbol_1=='_'||symbol_1=='*'||symbol_1=='^'){symbol_1=32;}
if(symbol2=='_'||symbol2=='*'||symbol2=='^'){symbol2=32;};
switch (symbol) {
case 32:if(addres>4){arabic_e_letters=0;}break;
case '_':i2c_addres=0;llk=0xa0;break;
//-----------------------
case 'h':i2c_addres=16;llk=0xa4;break; //alef
case 'f':if(symbol2==32){i2c_addres=32;llk=0xa4;}
else{i2c_addres=24;llk=0xa4;}break;
case 'j': i2c_addres=40;llk=0xa4;if(symbol2==32){i2c_addres=48;llk=0xa4;} break;;
case 'e':i2c_addres=56;llk=0xa4;if(symbol2==32){addres=64;llk=0xa4;}break;;
case '[':i2c_addres=72;llk=0xa4;if(symbol2==32){i2c_addres=80;llk=0xa4;} break;;
case 'p':i2c_addres=88;llk=0xa4;if(symbol2==32){i2c_addres=96;llk=0xa4;} break;;
case 'o':i2c_addres=104;llk=0xa4;if(symbol2==32){i2c_addres=112;llk=0xa4;}break;;
case ']':i2c_addres=120;llk=0xa4;break;;
case '`':i2c_addres=128;llk=0xa4;break;
case 'v':i2c_addres=136;llk=0xa4;break;;
case '.':i2c_addres=144;llk=0xa4;break;;
case 's':
i2c_addres=152;llk=0xa4;
if(symbol2==32){i2c_addres=160;llk=0xa4;} break;
case 'a':i2c_addres=168;llk=0xa4;
if(symbol2==32){i2c_addres=176;llk=0xa4;} break;
case 'w':i2c_addres=184;llk=0xa4;
if(symbol2==32){i2c_addres=192;llk=0xa4;}break;
case 'q':i2c_addres=200;llk=0xa4;
if(symbol2==32){i2c_addres=208;llk=0xa4;} break;
case 39: i2c_addres=216;llk=0xa4;break;;// '
case '/':i2c_addres=224;llk=0xa4;break;;
case 'u':if(symbol_1==32){i2c_addres=232;llk=0xa4;}
else if(symbol2==32){i2c_addres=248;llk=0xa4;}
else{i2c_addres=240;llk=0xa4;}break;
case 'y':if(symbol2==32){i2c_addres=0;llk=0xa6;}
if(symbol_1==32){i2c_addres=8;llk=0xa0;}
else{i2c_addres=0;llk=0xa0;}break;
case 't':i2c_addres=8;llk=0xa6;
if(symbol2==32){i2c_addres=16;llk=0xa6;}break;;
case 'r':i2c_addres=24;llk=0xa6;
if(symbol2==32){i2c_addres=32;llk=0xa6;} break;
case ';': i2c_addres=40;llk=0xa6;
if(symbol2==32){i2c_addres=48;llk=0xa6;} break;
case 'g':i2c_addres=56;llk=0xa6;
if(symbol2==32){i2c_addres=64;llk=0xa6;} break;
case 'l':
i2c_addres=80;llk=0xa6;
if(symbol_1==32&&symbol2!=32){i2c_addres=152;llk=0xa6;}
if(symbol_1!=32&&symbol2!=32){i2c_addres=72 ;llk=0xa6;}
break;
case 'k': i2c_addres=88;llk=0xa6;
if(symbol2==32){i2c_addres=96;llk=0xa6;} break;
case 'i':
if(symbol_1==32&&symbol2==32){i2c_addres=144;llk=0xa6;}
if(symbol_1!=32&&symbol2==32){i2c_addres=112;llk=0xa6;}
if(symbol_1!=32&&symbol2!=32){i2c_addres=104;llk=0xa6;}
break;
case 'm':
if(symbol_1==32&&symbol2==32){i2c_addres=144;llk=0xa6;}
if(symbol_1!=32&&symbol2==32){i2c_addres=112;llk=0xa6;}
if(symbol_1!=32&&symbol2!=32){i2c_addres=104;llk=0xa6;}
break;
case ',':i2c_addres=120;llk=0xa6;break;
case 'd':i2c_addres=128;llk=0xa6;if(symbol2==32){i2c_addres=136;llk=0xa6;} break;
}//end of case
}//end if id arabic_englis
if(symbol=='3'&&symbol2=='>'){i2c_addres=160;llk=0xa6;}
//DUME WRITE
Soft_I2C_Start(); //start signal
Soft_I2C_Write(llk); //device addres
Soft_I2C_Write(i2c_addres);//start froma adress 0 to write
//real read
Soft_I2C_Start();//start signal
Soft_I2C_Write(llk+1);//eeprom adress page (adress)
for(lc=0;lc<8;lc++){
ch[lc]=Soft_I2C_Read(1); }
Soft_I2C_Read(0);
Soft_I2C_Stop();
if(fl==1){
for(lc=0;lc<8;lc++){
temp=ch[lc];
ch[lc].f7=temp.f0;
ch[lc].f6=temp.f1;
ch[lc].f5=temp.f2;
ch[lc].f4=temp.f3;
ch[lc].f3=temp.f4;
ch[lc].f2=temp.f5;
ch[lc].f1=temp.f6;
ch[lc].f0=temp.f7;
} fl=0;
}
}//get_ch
//------------------------------------------------------------------------------
//main
void main(){
char x,z,fre,s;
cmcon=0x07;
trisa.f0=0;trisa.f1=0;
trisa.f4=1;trisa.f6=0;
trisa.f7=0;
trisb.f0=0;trisb.f1=1;
trisb.f2=0;trisb.f3=0;
trisb.f4=0;trisb.f5=0;
trisb.f6=0;trisb.f7=0;
//init uart
UART1_Init(9600);
delay_ms(100);
UART1_Write(0x0d);
//get hc595 ready
send(255);latch;
//get leds ready
led1=0;led2=0;
addres=0;
UART1_Write('r');
UART1_Write(0x0d);
UART1_Write_Text("the screen is ready ");
UART1_Write(0x0d);
delay_ms(100);
//get buffer size
UART1_Write_Text( "input how many units : ");
UART1_Write(0x0d);
while(UART1_Data_Ready()==0){;}UART1_Write(0x0d);
bs=UART1_Read();
bs=bs*8+16;
//get scrrolling speed
UART1_Write_Text("input speed : ");
UART1_Write(0x0d);
delay_ms(100);
while(UART1_Data_Ready()==0){;} UART1_Write(0x0d);
speed=UART1_Read();
speed=speed-47;
UART1_Write_Text("input words: ");
UART1_Write(0x0d);
//receive words & store it in the internal eeprom
if(porta.f4==0){goto len;};
for(;;){
led1=0;
while(UART1_Data_Ready()==0){;}
led1=1;delay_ms(100);
fre= UART1_Read();
if(fre==0x0d){goto len;}
EEPROM_Write(addres,fre);
addres++;
eow=addres;
EEPROM_Write(127,1);
}
len:
delay_ms(100);
led2=1;led1=0;
addres=0;
//-------------------------
loop:
//getting symbol
symbol=EEPROM_Read(addres);
delay_ms(5);
symbol2=EEPROM_Read(addres+1);
if(symbol2==0xff){symbol2=32;}
if(addres>0){symbol_1=EEPROM_Read(addres-1);}
if(symbol_1=='*'){symbol_1=32;}
if(addres>eow){symbol=32;};
if(symbol==0xff){symbol=32;};
if(arabic_e_letters==0){
if(symbol=='*'&&symbol2=='*'){symbol_1=32;symbol2=32;arabic_e_letters=1;addres++;addres++;goto loop;} ;}
UART1_Write(symbol);
//------------------------------------------------------------------------------
get_ch();
for(z=0;z<8;z++){
s=speed;
while(s>0){
for(x=0;x<64;x++){
send(ch[x]);
latch;symbol=symbol-32;
send(0);
latch;
column_num(x);
};
s--;
} //while
for(x=63;x>0;x--){ch[x]=ch[x-1];} //move to right
} // for z
addres++;
goto loop;
;}
فلنبدأ من الدالة الرئيسية للبرنامج :
كود:
void main(){
char x,z,fre,s;
cmcon=0x07;
trisa.f0=0;trisa.f1=0;
trisa.f4=1;trisa.f6=0;
trisa.f7=0;
trisb.f0=0;trisb.f1=1;
trisb.f2=0;trisb.f3=0;
trisb.f4=0;trisb.f5=0;
trisb.f6=0;trisb.f7=0;
//init uart
UART1_Init(9600);
delay_ms(100);
UART1_Write(0x0d);
//get hc595 ready
send(255);latch;
//get leds ready
led1=0;led2=0;
كما يبدو واضحاً هنا نجد انني عرفت المداخل و المخارج و ابطلت الكومبارتور(لأني استخدم المتحكم pic16f628a) وقمت بتهيئة الusart1 الذي استخدمه بالتواصل مع الحاسوب الشخصي وهناك دالة send() التي سنشرحها بعد قليل, وستلاحظون اني كتبت led1=0 ; led2=0 ; وهذا لأني استخدمت دالة #define في بداية البرنامج وسترونها بعد قليل.
من ثم ننتقل الى :
كود:
addres=0;
UART1_Write('r');
UART1_Write(0x0d);
UART1_Write_Text("the screen is ready ");
UART1_Write(0x0d);
delay_ms(100);
//get buffer size
UART1_Write_Text( "input how many units : ");
UART1_Write(0x0d);
while(UART1_Data_Ready()==0){;}UART1_Write(0x0d);
bs=UART1_Read();
bs=bs*8+16;
//get scrrolling speed
UART1_Write_Text("input speed : ");
UART1_Write(0x0d);
delay_ms(100);
while(UART1_Data_Ready()==0){;} UART1_Write(0x0d);
speed=UART1_Read();
speed=speed-47;
وهنا ترون اني اقول للبيك ( المتحكم ) ان يرسل الى شاشة المستخدم عبر ال السريال جملة "input how many units" ومعناها ان يدخل المستخدم عدد الوحدات الموجودة في الماتركس امامه فمثلاً ان كانت الماتركس التي اشتراها مني بحجم 8*16 اي انها تتكون من وحدتين 8*8 بجانب بعضهما فسيكتب 2 وهي عدد وحدات ال8*8 الموجودة
قد يتسائل البعض لماذا اضفت هذا.
الحقيقة ان هذا ليس ضروري بس (فزلكة) ويمكن ان يفيدني في التطوير لاحقاً
فنحن كما نعلم نعرف عدد الاعمدة مسبقاًَ مثال char ch[عدد الأعمدة] ;
لهذا انا عرفت اكبر عدد ممكن من الاعمدة وعندها ان استخدمت ماتركس بحجم 8 اعمدة لن يوجد فرق عن استخدامي لماتركس 40 عامود من ناحية الكود اي يمكن في اي لحظة وصل الماتركس مع لي
دات اضافية ليتكون لدينا ماتركس اكبر بدون التعديل على الكود على ان لا يتجاوز عدد الاعمدة عدد المتغيرات المعرفة داخل الكود ( ولهذا عرفنا اكبر عدد ممكن)
ملاحظة : ان ارسلنا القيمة 0x0d باسيريال فسيتكون سطر جديد في شاشة الاستقبال ولهذا ارسل بعد كل جملة سطر جديد كي تتكوم الكتابات
----------------------------
الباقي في المنشورات القادمة ان شاء الله
///ان اعجبك المنشور فقط قم بالتفاعل ولو قليلا لأن هذا يسرني كثيراً\\\
***** عيد سعيد للجميع وكل عام وانتم بخير ****