Страница 1 из 1

Дисплей MT-10S1: управление по LPT

Добавлено: Вт июл 17, 2007 01:30:25
Артур
Здравствуйте! Нуждаюсь в вашей помощи.
Подключил этот дисплей к LPT порту
Для вывода информации в порт использовал inpout32.dll
Пробовал разные варианты но не могу запустить девайс
То что он сам рабочий знаю на 100% (проверял спец. прогой)
Помогите пожалуйста найти ошибку
Вот сам код

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

#include "iostream.h"
#include "conio.h"
#include "stdlib.h"
#include "h.h"
#include "windows.h"
#include <stdio> 

int Data=888,Control=890;//Port Lpt
int x;
main()
{
//Инициализация дисплея согласно документации
    Out32(Data,48);//DB=00110000
    Sleep(10);
    Out32(Control,2);//E=1
    Sleep(10);
    Out32(Control,3);//E=0
Sleep(10);
    Out32(Data,48);//DB=00110000
    Sleep(10);
    Out32(Control,2);//E=1
    Sleep(10);
    Out32(Control,3);//E=0
Sleep(1);
    Out32(Data,48);//DB=00110000
    Sleep(10);
    Out32(Control,2);//E=1
    Sleep(10);
    Out32(Control,3);//E=0
Sleep(100);	
    Out32(Data,56);//Function_Set
    Sleep(10);
    Out32(Control,2);//E=1
    Sleep(10);
    Out32(Control,3);//E=0
Sleep(100);
    Out32(Data,56);//Function_Set
    Sleep(10);
    Out32(Control,2);//E=1
    Sleep(10);
    Out32(Control,3);//E=0
Sleep(100);
    Out32(Data,1);//Clear_Display
    Sleep(10);
    Out32(Control,2);//E=1
    Sleep(10);
    Out32(Control,3);//E=0
Sleep(4);
    Out32(Data,6);
    Sleep(10);
    Out32(Control,2);//E=1
    Sleep(10);
    Out32(Control,3);//E=0
//конец инициализации
//запись в дисплей символа 5 по адресу 0
//выбор адреса памяти
    x=0;
    Out32(Data,128+x);//Set_DDRAM_Address
    Out32(Control,2);//E=1
    Sleep(10);
    Out32(Control,3);//E=0
Sleep(4);
//вывод символа	
    Out32(Data,53);//символ 5
Sleep(4);
    Out32(Control,223);//Write_Data_to_RAM
return(0);
}

Добавлено: Вт июл 17, 2007 16:39:25
Барсик
Я не работал с inpout32.dll и не знаю, как работает Out32(...,...), но, похоже, когда Вы выводите данные в порт, то изменяете другие биты. А надо устанавливать (или сбрасывать) только определённый бит, а остальные не трогать!
Вот пример, как делал я, когда дёргал индикатор через LPT порт.
(это было из-под DOS-а. компилятор Borland C++ 3,0)

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

// bit 0, line 1 "Strobe"

void lcd_set_e() // Установить строб
{
    extern lpt_base; //base address of LPT port
    extern unsigned char control_byte;
    // устанавливаем в 0 только bit 0,
    // остальные не трогаем!
    control_byte = (control_byte & 254);
    outportb(lpt_base+2, control_byte);
}

void lcd_clear_e() // сбросить строб
{
    extern lpt_base; //base address of LPT port
    extern unsigned char control_byte;
    // устанавливаем в 1 только bit 0,
    // остальные не трогаем!
    control_byte = (control_byte | 1);
    outportb(lpt_base+2, control_byte);
}
И вообще, Вы пробовали своей программой просто помигать светодиодиками через LPT, прежде, чем подключать к нему индикатор?

Добавлено: Вт июл 17, 2007 17:55:16
ARV
Попробуй для управления линиями LPT использовать мою программку Hardware Control
Для того, чтобы разобраться с алгоритмом работы собственно индикатора ее возможностей более чем достаточно. А когда разберешься - напишешь свою прогу, на нормальном языке программирования :)

Добавлено: Ср июл 18, 2007 12:56:50
Артур
Барсик, ARV - Спасибо вам! Проблема решена! :)

Добавлено: Ср июл 18, 2007 15:21:02
ARV
Хоть бы рассказал, в чем дело было, как нашел, как справился...

Добавлено: Ср июл 18, 2007 18:12:35
Артур
При записи символа надо было делать так:

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

//Очистка дисплея и перемещение курсора влево
Out32(Data,1);//Clear_Display
Out32(Control,2);//E=1
Sleep(1);
Out32(Control,3);//E=0
//Запись символа 
Out32(Data,65);//символ "А"
Out32(Control,7);//E=0 ,AO=1
Out32(Control,6);//E=1 ,AO=1
Sleep(1);
Out32(Control,7);//E=0 ,AO=1
Если вдруг кому нужен рабочий код - выкдадываю, но надо будет почитать о применении библиотеки inpout32.dll

Добавлено: Чт июл 19, 2007 03:10:22
Артур
Еще вот сама библиотека со справкой по использованию
Предлагаю закрыть тему!