Тестирую в: 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 и даже не доходит до цикла while(1);
что бы убедиться в этом внутри цикла FOR поставил 2 команды
на вывод символа "0" и переход на следующую ячейку. Соответственно никакого перехода нету.cmd(0x80+a);
symbol(0x30);
Спойлер
Код: Выделить всё
line[i] = line[i] + mass[0][a]; // строка | столбец
if (a < 4)
line[i] = line[i] << 1; Хотя они даже никак не влияют на вывод символа ноль
Спойлер
Вообщем я не понимаю почему с ними ничего не работает
Вообще программа заключается не ввыводе ноликов на экран
Это небольшой пример проблемы.
- Вложения
-
- Proteus.rar
- (42.63 КБ) 146 скачиваний


