Vladimir Ljaschko (10.09.2013 03:55 - 04:18, просмотров: 108) ответил Юра на Выкиньте свой компилер - это первое. Чтоб не пропускал такие вещи как ';' в декларации размера массива. (Даю наводку: уберите точку с запятой из дифайнов). Во-вторых - зачем одели массивы в структуры? Вы их копировать что ли хотите? Можно же
обращаться пора уже с помощью printf и SetLcdPos, иначе никаких преимуществ по сравнению с ассемблером он не получит. И тогда проще иметь одномерный массив, с переносом в putchar. И вообще массив не нужен. Только для обновления экрана в случае помех, сбивающих сам экран.
__no_init char lcd_buf[MaxX*MaxY];
__no_init char x,y; // current position can be modified by any function here
void ClrScr(void)
{ char i;
WriteLcdControl(0x01);
Delay(2);
for (i=0; i<MaxX*MaxY; i++)
lcd_buf[i]=0x20;
x=1;
y=1;
}
void SetLcdPos(char new_x, char new_y)
{ x=new_x; y=new_y;
if (new_y==1)
WriteLcdControl(0x80+(x-1));
else
WriteLcdControl(0x80+39+x);
}
void InitLcd(void)
{ char i;
for (i=0; i<MaxX*MaxY; i++)
lcd_buf[i]=0x20;
InitLcdWithoutBuffer();
}
void InitLcdWithoutBuffer(void)
{
зависит от дисплея :
WriteLcdControl( 0x39 ); // 8 bit, 2 line, instruction table 1
WriteLcdControl( 0x14 ); // bias 1/5
SetContrast ( 0x18 ); // set contrast to 011000b
WriteLcdControl( 0x6d ); // Fon=1, Rab2=1, Rab0=1
WriteLcdControl( 0x06 ); // autoincrement on, shift off
WriteLcdControl( 0x80 ); // set DDRAM = 0
WriteLcdControl( 0x0c ); // display on, cursor off, position off
ClrScr();
}
void UpdateScreen(void)
{ char i;
SetLcdPos(1,1);
for (i=0;i<MaxX; i++)
WriteLcdData(lcd_buf[i]);
SetLcdPos(1,2);
for (i=MaxX;i<MaxX*2; i++)
WriteLcdData(lcd_buf[i]);
}
void ClearLine(char line)
{ SetLcdPos(1,line);
printf("%s"," ");
SetLcdPos(1,line);
}
int putchar(int c)
{
WriteLcdData(с);
if ((x>=1)&&(x<=MaxX)&&(y>=1)&&(y<=MaxY))
lcd_buf[(x-1)+MaxX*(y-1)]=с;
x++;
if(x>MaxX)
{ x=1;
y++;
if (y>MaxY)
y=1;
SetLcdPos(x,y);
}
return(c);
}