МК "AT89C51" и LCD "LM016L". Не могу разобраться с кодом.

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 5
Зарегистрирован: Пт янв 26, 2018 04:13:28

Сообщение Denzell »

Код пишу в: Kell uVision
Тестирую в: PROTEUS
Исходники все ниже

Ни как не могу понять почему код не работает на МК хотя спокойно компилируется.
На сколько я понял код просто зависает на одном из циклов и не движется дальше.

Сам код: (Урезанный немного)
Спойлерsbit P1_0 = 0x90;
sfr P0 = 0x80;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TH0 = 0x8C;
sfr Data = 0xA0;
sbit TF0 = 0x8D;
sbit TR0 = 0x8C;
sbit RS = 0xB5;
sbit RW = 0xB6;
sbit E = 0xB7;

timer()
{
TMOD = 0x01;
TH0 = 60136 >> 8;
TL0 = 60136;
TR0=1;
while(!TF0);
TF0=0;
}

cmd(char command)
{
RS=0;
RW=0;
E=1;
Data=command;
E=0;
timer();
}

symbol(char command)
{
RS=1;
RW=0;
E=1;
Data=command;
E=0;
timer();
}

intilization()
{
int i;
for (i = 0; i < 3; i++)
{
timer();
RS = 0;
RW = 0;
Data = 0x30;
}
timer();
cmd(60); // начальные установки
cmd(14); // Курсор
cmd(1); // Отчистка дисплея
cmd(6); // Режим ввода
}

//***********************************************
//***********************************************


int mass[8][5] = {
{1,0,0,0,1,},
{0,0,0,0,0,},
{0,1,1,1,0,},
{0,1,0,1,0,},
{0,1,0,1,0,},
{0,1,1,1,0,},
{0,0,0,0,0,},
{1,0,0,0,1,}};

void video();
void main(void)
{
P1_0 = 0; // Погасить лампочки
intilization(); // Инцилизация дисплея
cmd(0x01); // отчистка дисплея

video(); // Вывод масива на экран

// cmd(0x40); // Установка адреса
// cmd(0x80); // превод на 0 позицию.
// cmd(0xC0); // Перевод на другую строку
while(1);
}



void video() // Вывод масива на экран
{
int line[8] = {0}; // Делим весь массив на строчки
int i,a,p = 0, y = 0;

for (i = 0; i < 8; i++) // Переписываем весь двумерный массив в массив line
{
for(a = 0; a < 5; a++) // Пробегаемся по каждым 5 битам
{
cmd(0x80+a);symbol(0x30); // По идее должны написаться 5 подряд нулей.
line = line + mass[y][a]; // строка | столбец
if (a < 4)
line = line << 1; // записываем все в 1 ячейку

}
while(1);
y++; // С каждым циклом переходим на строку ниже
}
for (i = 0; i < 8;i++) // Добавляем бит (10 000) каждому значению в массив line
{
line = line + 512;
}
// Тест.
cmd(0x40); // Команда Установка адреса CGRAM
for (i = 0; i < 8; i++)
{
symbol(line); // Запись в CGRAM
}

cmd(0x80); // Установка курсора на 1 строку
symbol(0x00); // Вывод первого символа
while(1);
}

Насколько я понял, ошибка появляется именно в этом цикле:

Код: Выделить всё

for (i = 0; i < 8; i++)				// Переписываем весь двумерный массив в массив line
	{
		for(a = 0; a < 5; a++)			// Пробегаемся по каждым 5 битам
		{	
			cmd(0x80+a);symbol(0x30);	   // По идее должны написаться 5 подряд нулей.
			line[i] = line[i] + mass[0][a];   // строка | столбец
			if (a < 4)
				line[i] = line[i] << 1;			// записываем все в 1 ячейку
				 
		} 
		while(1);
		y++;									// С каждым циклом переходим на строку ниже
	}
после цикла FOR ниже специально поставил бесконечный цикл Что бы проверить остановится ли весь процесс
НО получается так что он почему то бесконечно бегает внутри цикла FOR и даже не доходит до цикла while(1);
что бы убедиться в этом внутри цикла FOR поставил 2 команды
cmd(0x80+a);
symbol(0x30);
на вывод символа "0" и переход на следующую ячейку. Соответственно никакого перехода нету.
СпойлерИзображение
А если убрать две строки:

Код: Выделить всё

		line[i] = line[i] + mass[0][a];   // строка | столбец
			if (a < 4)
				line[i] = line[i] << 1;	
То все работает как нужно!
Хотя они даже никак не влияют на вывод символа ноль
СпойлерИзображение
...
Вообщем я не понимаю почему с ними ничего не работает

Вообще программа заключается не ввыводе ноликов на экран :))
Это небольшой пример проблемы.
Вложения
Proteus.rar
(42.63 КБ) 146 скачиваний
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Этот участок кода
Спойлер

Код: Выделить всё

	// Тест.
	cmd(0x40);						// Команда Установка адреса CGRAM									
	for (i = 0; i < 8; i++)
	{
		symbol(line[i]);			// Запись в CGRAM
	}
Изменить на
Спойлер

Код: Выделить всё

	// Тест.
for (i = 0; i < 8; i++)
	{
	cmd(0x40+i);            // Команда Установка адреса CGRAM
        symbol(line[i]);		// Запись в CGRAM
	}
Реклама
Родился
Сообщения: 5
Зарегистрирован: Пт янв 26, 2018 04:13:28

Сообщение Denzell »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3293158#p3293158"]Этот участок кода
Спойлер

Код: Выделить всё

	// Тест.
	cmd(0x40);						// Команда Установка адреса CGRAM									
	for (i = 0; i < 8; i++)
	{
		symbol(line[i]);			// Запись в CGRAM
	}
Изменить на
Спойлер

Код: Выделить всё

	// Тест.
for (i = 0; i < 8; i++)
	{
	cmd(0x40+i);            // Команда Установка адреса CGRAM
        symbol(line[i]);		// Запись в CGRAM
	}
[/uquote]

Какой смысл? Если код не может дойти даже до этого участка.
Он застревает в обычном цикле FOR и повторяется в нем бесконечно.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Попробуйте так
Спойлер

Код: Выделить всё

char mass_2 [7] = {0x11,0x00,0x0E,0x0A,0x0E,0x00,0x11};

void zagrus_mass_2 (void) {
 char i;
    for (i = 0; i < 8; i++)
	{
         cmd(0x40+i);
         symbol(mass_2[i]);			// Запись в CGRAM
	}
} 


zagrus_mass_2();
	cmd(0x80);				// 
	symbol(0x00);			 // Вывод первого символа
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 5
Зарегистрирован: Пт янв 26, 2018 04:13:28

Сообщение Denzell »

Код пишу в: Kell uVision
Тестирую в: PROTEUS
МК "AT89C51"
LCD "LM016L".

Столкнулся с одной интересной проблемой которая мне мешает дальше что то делать.
Собственно сам код:

Код: Выделить всё

void main(void)
{	
	int AA[5] = {1,0,0,0,1};	// Массив пикселей.
	int S = 0;	

	intilization();	 	// Инцилизация дисплея
	cmd(0x01);  		// отчистка дисплея
	S = S + AA[0];	 		// 0 + 1 = 1
	cmd(0x40); 			// Установка адреса CGRAM
	symbol(512+S);		// Прибавляем биты 10 000
	symbol(512);
	cmd(0x80);		   	// Установка адреса на 1 ячейку
	symbol(0x00);		// Вывод символа 
	while(1);
}
и результат:
СпойлерИзображение
По идее должен загореться 1 пиксель на экране.
НО если в строчке S = S + AA[0]; заменить АА прпосто на значение 1 то все работает.
СпойлерИзображение
Я не понимаю просто почему так происходит. Ведь значение элемента массива AA[0] и так равно 1.
Вложения
Proteus.rar
(38.8 КБ) 151 скачивание
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

symbol() какой параметр обрабатывает? Приведите эту функцию.
Docendo discimus
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Denzell, зачем плодите темы, состоящие из нескольких постов и одинаковые по смыслу ?
Перенёс сообщения из другой темы сюда.

PS: И не цитируйте полностью предыдущие сообщения, иначе отправлю читать правила.
Контактная информация:
Ответить

Вернуться в «AVR»