Здравствуйте. Про инициализацию LCD очень много можно найти в мире. Лучше смотреть DataSheet. Если Вы не видите ничего на экране, то возможно у Вас не правильно подано напряжение на драйвер LCD (регулировка контраста Vo). Некоторые индикаторы требуют подачи отрицательного напряжения на этот вывод. Если при подаче питания крутить движок потенциометра туда-сюда, то на экране должны появляться-исчезать знакоместа. Надеюсь с подключением у Вас все ОК.
Теперь инициализация. Писал программки давно. Кому интересно берите. Все работает.
8-бит подключение. Два индикатора
Возможно Вам придется изменить синтаксис. Это написано под старый x8051.exe
.CHIP 8052
.LLCHAR _
;******Блок констант******
FOSC .EQU 11059 ;Частота кварцевого резонатора
;***Назначение выводов****
;DB0..DB7 LCD на P0
RSLCD: REG P3.4 ;Выбор регистра LCD
RWLCD: REG P3.5 ;Выбор операции LCD
ELCD1: REG P3.6 ;Выбор кристалла LCD1
ELCD2: REG P3.7 ;Выбор кристалла LCD2
;
;ПП Delay_ms - задержка на мс без использования таймера
; -› A - Длительность задержки в мс
Delay_ms:
CLR C ;Очистить С для правильного вычитания
_C2: PUSH A ;Сохраним для последующих обращений
MOV A,#‹((FOSC/12-7)/
;Константа задержки на 1 мс
_C1: NOP ;
NOP ;
NOP ;Задержка
NOP ;на
NOP ;1 мс
NOP ;
DJNZ A,_C1 ;
POP A ;Восстановить кол-во оставшихся мс
DJNZ A,_C2 ;Если не конец, то повторить
RET ;выход
;
;--------------Работа с LCD--------------
;
;
;ПП GETBSFLCD - Проверка флага занятости LCD
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
; ‹- C - Флаг занятости LCD (0-готов 1-занят)
GETBSFLCD:
CLR RSLCD ;Адрес регистра управления LCD
MOV P0,#0FFH ;Настроить порт на ввод
SETB RWLCD ;Операция чтения
JB F0,_1 ;Если LCD2, то строб2
SETB ELCD1 ;Выставить строб1
SJMP _2 ;Обход
_1: SETB ELCD2 ;Выставить строб2
NOP ;Задержка
_2: NOP
MOV C,P0.7 ;Читать флаг занятости LCD
CLR ELCD1 ;Снять строб
CLR ELCD2 ;чтения
CLR RWLCD ;Операция записи
RET ;выход
;
;ПП WRLCD_NB - Запись данных в LCD без проверки занятости
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
; C - 0-команда 1-данные
; A - команда/данные
WRLCD_NB:
MOV RSLCD,C ;Адрес регистра LCD
CLR RWLCD ;Операция записи
MOV P0,A ;Выставит данные
JB F0,_1 ;Если LCD2, то строб2
SETB ELCD1 ;Выставить строб1
SJMP _2 ;Обход
_1: SETB ELCD2 ;Выставить строб2
NOP ;Задержка
_2: NOP
CLR ELCD1 ;Снять строб
CLR ELCD2 ;записи
NOP
MOV P0,#0FFH
RET ;выход
;
;ПП WRLCD - Запись данных в LCD
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
; C - 0-команда 1-данные
; A - команда/данные
; ‹- LCD_ERR - 1-ошибка (нет готовности)
WRLCD: PUSH PSW ;Сохранить слово состояния
PUSH A ;Сохранить A
MOV ‹T0INC,#0 ;Таймер ожидания готовности
_W1: MOV A,‹T0INC ;Если вышло время
CJNE A,#5,_1 ;ожидания готовности,
SETB LCD_ERR ;Установить флаг ошибки
SJMP _2 ;Закончить запись
_1: CALL GETBSFLCD ;Проверить занятость LCD
JC _W1 ;Ждать готовность
_2: POP A ;Восстановить A
POP PSW ;Восстановить слово состояния
CALL WRLCD_NB ;Запись данных
RET ;выход
;
;ПП LCD_Reset - Инициализация LCD
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
; ‹- LCD_ERR - 1-ошибка (нет готовности)
LCD_Reset:
MOV A,#37H ;Режим работы 8бит 1строка 5х10
CLR C ;Команда
CALL WRLCD_NB ;Записать
MOV A,#5 ;5 мс
CALL Delay_ms ;задержка
MOV A,#37H ;Режим работы 8бит 1строка 5х10
CLR C ;Команда
CALL WRLCD_NB ;Записать
MOV A,#5 ;5 мс
CALL Delay_ms ;задержка
MOV A,#37H ;Режим работы 8бит 1строка 5х10
CLR C ;Команда
CALL WRLCD_NB ;Записать
MOV A,#37H ;Режим работы 8бит 1строка 5х10
CLR C ;Команда
CALL WRLCD ;Записать
MOV A,#08H ;Отображение выкл. курсоры выкл.
CLR C ;Команда
CALL WRLCD ;Записать
MOV A,#01H ;Очистка экрана
CLR C ;Команда
CALL WRLCD ;Записать
MOV A,#06H ;Инкремент курсора без сдвига экрана
CLR C ;Команда
CALL WRLCD ;Записать
MOV A,#0EH ;Включить отображение и курсор
CLR C ;Команда
CALL WRLCD ;Записать
RET ;выход
;
;ПП CursResto - Включить курсор
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
CursResto:
MOV A,#0EH ;Вкл. отображение, вкл. курсор
CLR C ;Команда
CALL WRLCD ;Записать
RET ;выход
;
;ПП CursKill - Выключить курсор
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
CursKill:
MOV A,#0CH ;Вкл. отображение, выкл. курсор
CLR C ;Команда
CALL WRLCD ;Записать
RET ;выход
;
;ПП ClrScr - Очистить экран
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
ClrScr: MOV A,#01H ;Очистка экрана
CLR C ;Команда
CALL WRLCD ;Записать
RET ;выход
;
;ПП GotoBegLine - Перевести курсор в начало строки
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
GotoBegLine:
MOV A,#80H ;Установка счетчика адреса в 0
CLR C ;Команда
CALL WRLCD ;Записать
RET ;выход
;
;ПП LCDOUT_Chr - Вывод символа
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
; A - код ASCII символа
LCDOUT_Chr:
JBC A.7,_RUS ;Если русский алфавит, то обработать
_OUT: SETB C ;Данные
CALL WRLCD ;Запись кода символа в LCD
RET ;выход
_RUS: CJNE A,#30H,_1 ;Если буквы от А до п,
_1: JC _DECODE ;то декодировать
SUBB A,#30H ;Вычесть символы псевдографики
CJNE A,#30H,_2 ;Если символ псевдографики,
_2: JC _SP ;то вывести пробел
CJNE A,#46H,_3 ;Если символ от р до ё,‹›^y
_3: JC _DECODE ;то декодировать,
_SP: MOV A,#20H ;Иначе код пробела
SJMP _OUT ;вывести
_DECODE:
ADD A,#(TABLCD-$-3) ;Загрузить
MOVC A,@A+PC ;код из таблицы
SJMP _OUT ;Вывод
TABLCD: .BYTE 041H,0A0H,042H,0A1H,0E0H,045H,0A3H,0A4H ;А..З
.BYTE 0A5H,0A6H,04BH,0A7H,04DH,048H,04FH,0A8H ;И..П
.BYTE 050H,043H,054H,0A9H,0AAH,058H,0E1H,0ABH ;Р..Ч
.BYTE 0ACH,0E2H,0ADH,0AEH,0ADH,0AFH,0B0H,0B1H ;Ш..Я
.BYTE 061H,0B2H,0B3H,0B4H,0E3H,065H,0B6H,0B7H ;а..з
.BYTE 0B8H,0B9H,0BAH,0BBH,0BCH,0BDH,06FH,0BEH ;и..п
.BYTE 070H,063H,0BFH,079H,0E4H,078H,0E5H,0C0H ;р..ч
.BYTE 0C1H,0E6H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H ;ш..я
.BYTE 0A2H,0B5H,0DBH,0DCH,0D9H,0DAH ;Ё,ё,‹,›,^,y
;
;ПП LCDOUT_Str - Вывод строки символов, очистка до конца строки
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
; R0 - адрес строки ( CR_terminate) в памяти данных
LCDOUT_Str:
CALL GotoBegLine ;Перевести курсор в начало строки
PUSH 1 ;Сохранить R1
MOV R1,#MAX_X ;Счетчик символов
_C1: CJNE @R0,#0DH,_CH ;Если не конец строки, то вывод символа,
MOV A,# ;иначе вывод пробелов
SJMP _OUT ;до конца строки
_CH: MOV A,@R0 ;Загрузить символ в акк.
INC R0 ;Указатель на след. символ
_OUT: CALL LCDOUT_Chr ;Вывести символ
DJNZ R1,_C1 ;Повторить до конца строки
POP 1 ;Восстановит R1
RET ;выход
;
;ПП LCDOUT_Str_Const - Вывод строки символов из памяти программ
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
; DPTR - адрес строки ( CR_terminate) в памяти программ
LCDOUT_Str_Const:
CALL GotoBegLine ;Перевести курсор в начало строки
PUSH 1 ;Сохранить R1
MOV R1,#MAX_X ;Счетчик символов
_C1: CLR A ;Загрузить
MOVC A,@A+DPTR ;символ в акк.
CJNE A,#0DH,_CH ;Если не конец строки, то вывод символа,
MOV A,# ;иначе вывод пробелов
SJMP _OUT ;до конца строки
_CH: INC DPTR ;Указатель на след. символ
_OUT: CALL LCDOUT_Chr ;Вывести символ
DJNZ R1,_C1 ;Повторить до конца строки
POP 1 ;Восстановит R1
RET ;выход
;
;ПП SetCustomChar - Определяет собственный символ
; -› F0 - Номер LCD (0-LCD1 1-LCD2)
; A - Адрес символа в LCD
; DPTR - Таблица (8 байт) данных знакогенератора
SetCustomChar:
MOV B,#8 ;Вычислить адрес
MUL AB ;в памяти знакогенератора
ORL A,#40H ;Добавить код команды
CLR C ;Команда
CALL WRLCD ;Записать команду
MOV B,#8 ;Количество байт в таблице
_C1: CLR A ;Загрузить данные
MOVC A,@A+DPTR ;из таблицы
SETB C ;Данные
CALL WRLCD ;Записать в память знакогенератора LCD
INC DPTR ;Указатель на следующий байт
DJNZ B,_C1 ;Если не все данные, то повторить
RET ;выход