Сообщение от Dorgx7
|
Получилось запустить дисплей от LPT и программой LCDSmartie проблемма была в сопротивлении на подсветке в определенном положении инициализация почему то не проходила (так и не понел почему ) Вложение 14431
буду пробовать запускать от ATmega16
|
Ссылочку на LCDSmartie pls.
Хочу попробовать и я проверить свои LCD запустить от LPT.
Вот уже второй день пытаюсь "оживить" свой WH1602A от ATmega16 ничего не получается, где-то "собака зарыта", а где найти не могу.
Думал уже что-то с LCD, купил аналог китайский TM162A но и он не хочет запускаться. На обоих дисплеях высвечивается один ряд блоков (на одном почему-то верхний ряд на WH1602 а на втором нижний).
В Proteus e написанный мной (на ассемблере) код работает, в реале не хочет.
Аппаратно всё проверил перепроверил, шина данных в порядке сигналы управления ОК. С задержками как только не извращался, увеличивал до неприличия ничего не помогает. Контрастность выбрал делителем (R1-1k, на корпус, R2-10k на Vdd +5V) Подсветки на обоих экземплярах нет.
Если пытаешься контролировать флаг BF от дисплея, то в Proteus e это не работает, хотя в реале пробовал и это, всё равно неудачно.
Вот и хочу от LPT еще попробовать
Вот код на асме, может кто ткнет пальцем чего тут не так?
* Created: 27.04.2013 14:44:11
* Author: Administrator
*/
;=========== LCD Define ================================================== ================
.equ DATA_PORT = PORTA ; LCD Data Port Все ноги данных подключены к порту "А"
.equ DATA_PIN = PINA
.equ DATA_DDR = DDRA
.equ CMD_PORT = PORTC ; LCD Control Port Управление на порту "С" линии 0,1,2 см ниже
.equ CMD_PIN = PINC
.equ CMD_DDR = DDRC
.equ E = 0
.equ RW = 1
.equ RS = 2
;================================================= ========================================
.cseg
.org 0
;Настройка стека
InitStack: ldi R16, Low (RAMEND) ;для дальнейшей загрузки в младший регистр Стека
ldi R17, high (RAMEND);для дальнейшей загрузки в старший регистр Стека
out spl, R16
out sph, R17
ldi R16, 1‹‹ACD ;готовим выключение аналогового компаратора
out ACSR, R16 ; выключаем аналоговый компаратор
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++
; Т Е Л О П Р О Г Р А М М Ы
;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++
CLI ; На всякий случай заблокируем все прервыания
; Ждать реакции дисплея не будем из-за усложнения программы. Будем просто выдавать данные и команды, обеспечивая
; заведомо большую задержку. Поэтому оба порта "А" и "С" все ноги настроем на "ВЫВОД". И установим на них нули.
; Как известно, для выбора направления данных через порт используются регистры DDR если в регистре 1, то порт на ВЫВОД
start: ldi R16, 0xff
out DDRA, R16
out DDRC, R16 ; Оба порта "А" и "С" на ВЫВОД, теперь запишем в них нули
out DDRB, R16 ; Порт "В" вспомогательный , на него навешан светодиод для "моргания" и тем самым, контроля за работой МК
ldi R16, 0x00
out PORTA, R16
out PORTC, R16
out PORTB, R16
; В результате этой процедуры на ноге RW управляющего порта 0, поскольку будем только "отправлять" данные к дисплею
; а "считывать" не будем этот потенциал можно и не менять.
;--------------ИНИЦИАЛИЗАЦИЯ--------дисплея-----------------------------------------------------------------------------------
; По даташиту, после включения питания надо ждать не менее 20 ти миллисекунд, для входа устройства в нормальный режим.
; Даём такую задержку (8 тактов за одну микросекунду, значит нам надо 8000 х 20 = 160 000 тактов).
ldi R16, 10
M2: rcall M2mls
dec R16
BRNE M2
ldi R16, 10
M3: rcall M2mls
dec R16
BRNE M3
ldi R16, 10
M4: rcall M2mls
dec R16
BRNE M4
; выждали 60 миллисекунд (даже более), теперь можно инициализировать дисплей
SYKL: SBI CMD_DDR,RS
SBI CMD_DDR,E ; Дёргаем линии для проверки просто
; R17 служит регистром данных или команды при записи в дисплей
ldi R17, 0b00111100
rcall CMD_WR
ldi R17, 0b00111100
rcall CMD_WR
ldi R17, 0b00111100
rcall CMD_WR
ldi R17, 0b00001100 ; Включаем дисплей
rcall CMD_WR
ldi R17, 0b00000001 ; Очистка дисплея
rcall CMD_WR
rcall M2mls
ldi R17, 0b00000110 ; Курсор двигаем вправо
rcall CMD_WR
ldi R16, 0xFF ; Пауза 256 миллисекунд
M7: rcall M1mls
dec R16
BRNE M7
ldi R17, 'O'
rcall DATA_WR
ldi R17, 'K'
rcall DATA_WR
ldi R17, 0b11000000 ;Курсор на вторую строку 1я позиция
rcall CMD_WR
ldi R17, 'O'
rcall DATA_WR
ldi R17, 'K'
rcall DATA_WR
ldi R16,0xFF
out PORTB, R16 ; Включаем контрольный светодиод
ldi R16, 0xFF ; Пауза 256 миллисекунд
M5: rcall M1mls
dec R16
BRNE M5
ldi R16,0
out PORTB, R16 ; Выключаем контрольный светодиод
ldi R16, 0xFF ; Пауза 256 миллисекунд
M6: rcall M1mls
dec R16
BRNE M6
rjmp SYKL
;-----ПОДПРОГРАММЫ--------------
delay1us:
; задержка повышенной точности в 1 микросекунду c учетом длительности RCALL и RET
; rcall (им вызываем эту задержку) дает 3 + 1 nop + 4 ret = 8 - 1 микросекунда при 8МГц
; не использует никаких регистров
; для низкой тактовой частоты, возможно, придется заменить на несколько NOP-ов
nop
ret
delay10us:
; задержка повышенной точности в 10 микросекунд, основана на delay1us
; rcall (им вызываем эту задержку) дает 3 + 12 команды вне цикла +
; (5*(8+1+2)+8+1+1)=55 дает сам цикл = 80 тактов = 10 микросекунд
push R16
ldi R16, 6
delay10us_loop:
rcall delay1us
dec R16
brne delay10us_loop
pop R16
nop
nop
nop
ret
M2mls: push R16
ldi R16, 200
M1: rcall delay10us
dec R16
BRNE M1
pop R16
ret
M1mls: push R16
ldi R16, 100
M10: rcall delay10us
dec R16
BRNE M10
pop R16
ret
;================================================= ========================================
; Запись команды в дисплей. Код команды в R17
CMD_WR: CBI CMD_PORT,RS
RJMP WR_END
;-----------------------------------------------------------------------------------------
; Запись данных в дисплей. Код данных в R17
DATA_WR:
SBI CMD_PORT,RS
WR_END: CBI CMD_PORT,RW
ldi R16, 0xFF
out DDRA, R16 ; Порт данных на ВЫВОД
rcall delay10us
SBI CMD_PORT,E
rcall delay10us
OUT DATA_PORT,R17
RCALL delay10us
CBI CMD_PORT,E
rcall M2mls
ldi R16,0x00
out DDRA, R16 ; Порт данных на ВВОД (на всякий случай).
LDI R16,0xFF ; Установить подтяжку
OUT DATA_PORT,R16
RET