ألسلام عليكم
أريد كتابة رسالة طويلة على LCD
كود:
lcd_out(1,1,"AZERTYUIOPQSDFGHJKLWXCVBN");
ولكن يظهر كما في الصورة

ألا يوجد طريقة ليكمل بقية الرسالة في السطر الثاني بدون وضع
كود:
lcd_out(2,1,"xxxxxxxxxx")
|
السلام عليكم
تفضل اخي كريم
http://arabsh.com/files/0c33424b6cf4...-text-rar.html
هذا ه كود
كود:
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
unsigned char x,y, kk , count;
char text_lcd[16];
const char txt[]=" Hello ....How is my friend .. I apologize for being late ";
void main()
{
cmcon=7;
Lcd_Init();
lcd_cmd(_LCD_CURSOR_OFF);
lcd_cmd(1);
while(1)
{
kk=sizeof(txt);// calcaulate size of txt
for(x=0;x<16;x++)
{
text_lcd[x]=txt[x+y]; // 15+42
}
lcd_out(1,1,text_lcd);
count++;
delay_ms(10);
if(count==10)// to reducing time
{
y++;
if(y==kk-15)y=0;
count=0;
}
}
}
الكود بلون احمر مهمته هو تقليل زمن لزياده متغير y وسبب في ذلك اذا كان لديك ضمن عرض رساله سويجات مثلا تريد عند ضغط عليها تنفذلك امر ما اذا كتب امر delay_ms(250 سيكون مايكرو مشغول بتنفيذ هذا الامر
ولكن يمكن تقليله وبتالي نستطيع تنفيذ الاوامر خلال هذا الزمن كيف ذلك نقلل زمن الى مثلا 5ms او 10ms ثم نضع متغير اخر مثلا countيزداد عند كل تنفيذ امر ديلي 10ms ولما يصبح count=10 يعني زمن أصبح=200ms وبتالي نخبره نفذ الاوامر التي نريد تنفيذها بعد هذا زمن
طبعا متغير count هو لايساوي 10 لماذا لاننا أهملنا زمن تنفيذ اوامر لذا انت تتحكم بقيمه count الى ان ترى حركه نص مناسب وبالطبع اذا كنت تريد زمن تأخيري 250ms وانت قللت الزمن الى 10ms فأن count<25
بالنسبه للكيفيه تزحيف النص
انظر
هذا كود يرجعلي عدد البايتات في مصفوفه طبعا يرجعلي عدد عناصر لان sizeof(txt يرجع عدد البايتات ولان مصفوفه من نوع char اذن قيمه sizeof(txt هي نفسها طول مصفوفه واذا كانت مصفوفه من نوع int اذن نضرب النتيجه في 2
كود:
for(x=0;x<16;x++)
{
text_lcd[x]=txt[x+y]; // 15+42
}
هذا هو كود مهم حلقه تكرار الى 16 لان ابعاد الشاشه هي 16
لما y=0 راح نخزن اول 16 حرف في مصفوفه text_lcd بعد ذلك نقم بعرضها ثم ننتظر فتره زمنيه ولتكن 250ms طبعا شرحنا كيف نجعل مايكرو غير مشغول بتنفيذ امر delay عن طريق نقصان زمن الى 5 او 10ms ثم نضع متغير يعد كل تنفذ هذا زمن وعند أكتمال زمن 250ms مثلا نخبره نفذ كذا
هذه طريقه مهمه في حاله لديك مثلا سويجات أكيد ستجد مايكرو مشغول ولن ينفذ اي امر ولكن بالطريقه سابقه سيقوم بتنفيذ اوامر بكل سهوله
طبعا اكو شغله مهمه جدا جدا
تلاحظ text_lcd[x]=txt[
x+y
مصفوفه txt لها أبعاد معينه لنفترض لها 50 عنصر ماذا يحصل لو قلنا قم بخزن البيانات بتداءا من عنصر 55 سيظهر رساله تخبرك stack over
يعني متى أصير هذه حاله
لما y=35 اذن x سوف تتكرر من 0 الى 15 يعني 16
اذن البيانات راح تنخزن بــ[35] text_lcd =txt الى [50] text_lcd =txt
هنا لاتوجد مشكله ولكن بعد ما تصبح y=36 اذن
اذن البيانات راح تنخزن بــ[36] text_lcd =txt الى [51] text_lcd =txt
هنا سبحث مايكرو عن عنصر الي رقم 51 بالمصفوفه text_lcd فلا يجده عندها تظهر مشكله ويبدأ مايكرو يخربط في عمله وفي بروتيس يخبرك stack over flow
ماهو الحل
لاحظ الكود
كود:
if(count==10)// to reducing time
{
y++;
if(y==kk-15)y=0;
count=0;
}
أخبرناه نقص من طول رساله 15 على حسب طول شاشه طبعا لم أقل 16 لاني بدءت من 0 الى 15 و 0 لايؤثر لماذا هذه خطوه
لان لو أفترضنا طول رساله =50
اذا y اقصى قيمه يصل اليها هي 35
وبتالي
اذن البيانات راح تنخزن بــ[35] text_lcd =txt الى [50] text_lcd =txt
وبتالي تم أكتمال عمليه خزن الرساله وبتالي تم أكتمال عرضها وزياده على ذلك لافائده منها لعدم وجود البيانات ولن نحصل سوى اخراج مايكرو عن مسار عمله
وايضا أنصحك بمتابعه أفكار الاخوه الذين شاركوك بالحل لاستفاده من افكار
تحياتي