C Atmega8 На Atmega16 (Wg12864A)

17-01-2014, 15:33 От: admin Посмотрели: 1269
Всем здрасте!



Ребят подскажите, я в Си не очень хорош, но так уж вышло что пришлось. Есть программа для графического ЖК, написана под atmega8. При компиляции на amega16 ошибок не выдает но и ничего не показывает.

Нужно для правильного перевода на atmega16? Танцы с бубном не помогают...я пробывал =)

Есть вариант что напутаны порты в\в даже глядя по схемам они разные, при исправлении портов в коде компилятор начинает ругатся на неизвестную функцию((((

Вот код.

#include <avr/io.h>
#include "symbol.h"

#define DI 0
#define RW 1
#define E 2
#define CS1 3
#define CS2 4
#define RST 5

void pause (unsigned int a)
{ unsigned int i;

for (i=a;i>0;i--)
;
}

void lcd_dat (unsigned char data)
{
PORTD=data; //Выводим данные
PORTB|=_BV(DI); //Говорим дисплею что передаются данные
asm("nop");
PORTB|= _BV(E); //Импульс записи
asm("nop");
PORTB&=~_BV(E);
PORTB&=~_BV(DI);
}

void lcd_com (unsigned char comm)
{
PORTD=comm; //Выводим команду
asm("nop");
PORTB|= _BV(E); // Импульс записи
asm("nop");
PORTB&=~ _BV(E);
}

void gotoxy (unsigned char x, unsigned char y)
{
if (x<64) PORTB|=_BV(CS1); //Если x<64 включаем CS1
else {
PORTB|=_BV(CS2); //else включаем CS2
x=x-64;
}
lcd_com(0x40+x); //Выставляем X координату
lcd_com(0xb8+y/8); //Выставляем Y координату
}

void clear_screen (void)
{ unsigned char i,j;

PORTB|=_BV(CS1)|_BV(CS2); //Включаем оба чипа
for (j=0;j<8;j++)
{
lcd_com(0xb8+j);
for (i=0;i<64;i++)
lcd_dat(0x00); //Очищаем
}
}

void wg12864_init(void)
{
DDRD=0xff; //PD0-7 как выхода
PORTD=0x00;
PORTB=_BV(RST)|_BV(CS1)|_BV(CS2); //Включаем оба чипа
DDRB=_BV(DI)|_BV(RW)|_BV(E)|_BV(CS1)|_BV(CS2)|_BV(RST); //PB0-5 как выхода
asm("nop");
lcd_com(0x3f); //Разрешаем отображение
lcd_com(0xc0); //Устанавливаем начало отображения
lcd_com(0x40); //Ставим X=0
lcd_com(0xb8); //Ставим Y=0
clear_screen();

PORTB&=~(_BV(CS1)|_BV(CS2));
}

void put_pixel (const unsigned char x, const unsigned char y, const unsigned char color)
{ unsigned char temp=0;

PORTB=_BV(RST);
if ( (x>128)||(y>64) ) return;

gotoxy (x,y);

PORTD=0xff;
DDRD=0x00; //PD0-7 как входа
PORTB|=(_BV(RW)|_BV(DI)); //Считываем данные
pause(1);

PORTB|= _BV(E);
asm("nop");
PORTB&=~_BV(E);
asm("nop");
PORTB|= _BV(E);
asm("nop");
temp=PIND;
PORTB&=~_BV(E);

if (color==1) temp|= _BV(y%8); //Выставляем/снимаем нужный нам бит
else temp&=~_BV(y%8);

PORTB&=~(_BV(RW)|_BV(DI));
DDRD=0xff; //PD0-7 как выхода
asm("nop");
gotoxy(x,y); //Переходим к X,Y
lcd_dat(temp); //Записываем данные
PORTB=_BV(RST);
}

int sign (int x)
{
if (x<0) return -1;
if (x>0) return 1;
return 0;
}

int abs (int x)
{
if (x<0) return -x;
else return x;
}

void line (unsigned char x1,unsigned char y1,unsigned char x2,
unsigned char y2,unsigned char color)
{ int dx,dy,i,sx,sy,check,e,x,y;

dx=abs(x1-x2);
dy=abs(y1-y2);
sx=sign(x2-x1);
sy=sign(y2-y1);
x=x1;
y=y1;
check=0;
if (dy>dx) {
dx=dx+dy;
dy=dx-dy;
dx=dx-dy;
check=1;
}
e=2*dy - dx;
for (i=0;i<=dx;i++)
{
put_pixel(x,y,color);
if (e>=0) {
if (check==1) x=x+sx;
else y=y+sy;
e=e-2*dx;
}
if (check==1) y=y+sy;
else x=x+sx;
e=e+2*dy;
}
}

void rectangle (unsigned char x1,unsigned char y1,unsigned char x2,
unsigned char y2,unsigned char color)
{
line (x1,y1,x2,y1,color);
line (x2,y1,x2,y2,color);
line (x2,y2,x1,y2,color);
line (x1,y2,x1,y1,color);
}

void put_char (unsigned char x0, unsigned char y0, unsigned char code, unsigned char mode)
{ unsigned char i,x,y;
x=x0;
y=y0;
PORTB=_BV(RST)|_BV(CS1);
if ( (x>128)||(y>64) ) return;
for (i=0;i<6;i++)
{
if (x>=64) { //Включить CS2
x=x-64;
PORTB|=_BV(CS2);
PORTB&=~_BV(CS1);
}
lcd_com(0x40+x); //Перейти X,Y
lcd_com(0xb8+y);

if (i<=4) { if (mode==1) lcd_dat(~sym[code][i]); //Пишем колонку
else lcd_dat (sym[code][i]); //Пишем инвертированную колонку
}
if (i==5) { if (mode==1) lcd_dat(0xff); //Рисуем разделитель
else lcd_dat(0x00); //Рисуем инвертированный разделитель
}
x=x+1;
}

}

int main(void)
unsigned char data2[8]={0x20,0x10,0x01,0x02,0x08,0x06,0x04,0x0a}; //"WG12864A"
unsigned char i;

pause(5000); //Задержка для включения ЖКИ
wg12864_init(); //Инициализация ЖКИ

rectangle(0,0,127,63,1); //Рисуем контур
line (127,0,0,63,1); //Рисуем линии
line (127,5,5,63,1);
line (127,10,10,63,1);
line (127,15,15,63,1);
line (127,20,20,63,1);
line (127,25,25,63,1);
line (127,30,30,63,1);
line (127,35,35,63,1);
line (127,40,40,63,1);
line (127,45,45,63,1);
line (127,50,50,63,1);
line (127,55,55,63,1);
line (127,60,60,63,1);

for (i=0;i<8;i++)
put_char (10+6*i,3,data2[i],0); //Пишем "WG12864A"

while (1)
;

return 1;
}



И схема на atmega8 к которой он написан.C Atmega8 На Atmega16 (Wg12864A)



==============================================



А вот схема atmega16 к которой надо запилить этот код..C Atmega8 На Atmega16 (Wg12864A)
Раздел: AVR

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления C Atmega8 На Atmega16 (Wg12864A) все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031