החלטתי לנסות ללמוד קצת על בקרים, ולשם כך הגדרתי לעצמי מספר מטרות. את הראשונה (להפעיל מנוע צעד) הצלחתי בצורה חלקית. את השניה להפעיל מסך LCD אני מנסה. להלן הקוד שרשמתי, אני די חדש בתחום וזו בין התוכניות הראשונות שאני רושם. מישהו יכול להגיד לי מה הבעיה? אני לא בודק את דגל הbusy אלה שם השהיה בין פעולה לפעולה. החיבור הוא פורט D מחובר ל8 חיבורי השליטה של הLCD - DB0-DB7 . פורט השליטה מחובר ל
RS-portb0, r/w-portb1,e-portb2.
אני משתמש בpic 18f4520.
אני מצפה מהקוד הבא לכתוב את האות A על המסך בכתובת השמאלית העליונה. אבל לא קורה כלום, למעשה התצוגה רק מראה ריבועים שחורים.
עוד משהו אני שולט ע"י הדק שלישי על קונטרסט של התצוגה, אבל זה עובד כך שהקונטרסט של השורה הראשונה עולה עד הסוף ורק אז מתחיל להתשנות הקונטרסט של השורה השניה. האם כך זה אמור להיות?
נ.ב אני לא מצליח לישר את הקוד לשמאל, איך עושים את זה?
הקוד:
- קוד: בחר הכל
#include <pic18.h> // header file
#include <hitech.h> // header file
void delay_l(void); //DECLARE FUNCTION delay()- long delay
void delay_s(void); //DECLARE FUNCTION delay()- short delay
void delay_vl(void); //DECLARE FUNCTION delay()- very long delay
main()
{
while (1){
ADCON1=0xff; //set all port as digital
TRISC=0x00; //port c as output
TRISD=0x00; //port d as output
TRISB=0x00; //port b as output
//////////////////////
// Initialization //
//////////////////////
// 8 bit mode
unsigned int k;
for(k=0;k<0x04;k++){
PORTB=0x00;
delay_s();
PORTB=0x04; // enable "1"
delay_s();
PORTD=0x30;
delay_s();
PORTB=0x00; // enable "0"
delay_l();
}
// 2 lines, font 5*7, 8 bit
PORTB=0x04; // enable "1"
delay_s();
PORTD=0x38;
delay_s();
PORTB=0x00; // enable "0"
delay_l();
// turn off display
PORTB=0x04;// enable "1"
delay_s();
PORTD=0x08;
delay_s();
PORTB=0x00; // enable "0"
delay_l();
// clear display
PORTB=0x04; // enable "1"
delay_s();
PORTD=0x01;
delay_s();
PORTB=0x00; // enable "0"
delay_l();
// entry mode, no shift, decrement
PORTB=0x04; // enable "1"
delay_s();
PORTD=0x07;
delay_s();
PORTB=0x00; // enable "0"
delay_l();
// display on, cursor on, blink on
PORTB=0x04; // enable "1"
delay_s();
PORTD=0x0f;
delay_s();
PORTB=0x00; // enable "0"
delay_l();
///////////////
// Writing //
///////////////
// set DDRAM adress to 00
PORTB=0x04; // enable "1"
delay_s();
PORTD=0x80;
delay_s();
PORTB=0x00; // enable "0"
delay_l();
// write 'A' on screen
PORTB=0x04; // enable "1"
delay_s();
PORTD=0x41;
delay_s();
PORTB=0x00; // enable "0"
delay_l();
delay_vl();
}
return;
}
// Delay function
void delay_l(void)
{
unsigned int i;
for(i=0;i<0x7fff;i++);
}
void delay_s(void)
{
unsigned int j;
for(j=0;j<0x7fff;j++);
}
void delay_vl(void)
{
unsigned int a;
unsigned int b;
for(a=0;a<0x7fff;a++);
for(b=0;b<0x7fff;b++);
}



