Подключение LCD 1602 по I2C интерфейсу | RadioLaba.ru
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#include <P16F628A.INC>
LIST p=16F628A
__CONFIG H’3F10′ ;Конфигурация микроконтроллера
errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге
Sec equ 0020h ;вспомогательные регистры счета
Sec1 equ 0021h ;
Sec2 equ 0022h ;
scetbit equ 0024h ;вспомогательный регистр счета кол-ва бит
perem equ 0025h ;вспомогательный регистр приема/передачи байта по интерфейсу
tmp equ 0026h ;вспомогательный регистр счетчик
;
lcd_tmp equ 0027h ;вспомогательный регистр передачи инструкций
;
adr_i2c equ 0028h ;регистры подпрограммы передачи данных по интерфейсу
tmp_i2c equ 0029h ;
slave_adr equ 002Ah ;
data_i2c equ 002Bh ;
;
flag equ 007Fh ;регистр флагов
#DEFINE sda PORTB,0 ;линия sda
#DEFINE scl PORTB,1 ;линия scl
#DEFINE sda_io TRISB,0 ;линия направления sda
#DEFINE scl_io TRISB,1 ;линия направления scl
#DEFINE knp_led PORTB,2 ;кнопка вкл/выкл подсветки
#DEFINE led PORTB,3 ;светодиод ошибки передачи данных по интерфейсу
;flag,2 – флаг состояния подсветки (0 – выключена, 1 – включена)
;flag,3 – флаг передачи команда/данные (0 – команда, 1 – данные)
;flag,4 – флаг направления передачи (0 – чтение, 1 – запись)
;flag,5 – флаг окончания приема данных от ведомого
;flag,6 – флаг ошибки передачи по интерфейсу I2C (отсутствие подтверждения от ведомого)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0000h ;начать выполнение программы с адреса 0000h
goto Start ;переход на метку Start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Основная программа
Start movlw b’00000000′ ;установка значений выходных защелок порта B
movwf PORTB ;
;
movlw b’00000111′ ;выключение компараторов
movwf CMCON ;
;
bsf STATUS,RP0 ;выбрать 1-й банк
movlw b’11110111′ ;настройка линий ввода\вывода порта B
movwf TRISB ;RB3 – на выход, остальные на вход
bcf STATUS,RP0 ;выбрать 0-й банк
;
clrf flag ;сброс регистра флагов
;
call lcd_led_on ;вызов подпрограммы включения подсветки
;
call init_lcd ;вызов подпрограммы инициализации дисплея
call err_prov ;проверка ошибки
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movlw 0x02 ;установка адреса DDRAM памяти (1-я строка 3-я позиция)
call lcd_adr ;вызоа подпрограммы передачи адреса DDRAM
movlw ‘R’ ;Вывод надписи RadioLaba.ru
call lcd_dat ;
movlw ‘a’ ;
call lcd_dat ;
movlw ‘d’ ;
call lcd_dat ;
movlw ‘i’ ;
call lcd_dat ;
movlw ‘o’ ;
call lcd_dat ;
movlw ‘L’ ;
call lcd_dat ;
movlw ‘a’ ;
call lcd_dat ;
movlw ‘b’ ;
call lcd_dat ;
movlw ‘a’ ;
call lcd_dat ;
movlw ‘.’ ;
call lcd_dat ;
movlw ‘r’ ;
call lcd_dat ;
movlw ‘u’ ;
call lcd_dat ;
;
call paus ;пауза 1 сек
;
movlw 0x43 ;установка адреса DDRAM памяти (2-я строка 4-я позиция)
call lcd_adr ;вызоа подпрограммы передачи адреса DDRAM
;
movlw ‘L’ ;Вывод надписи LCD 1602A
call lcd_dat ;
movlw ‘C’ ;
call lcd_dat ;
movlw ‘D’ ;
call lcd_dat ;
movlw ‘ ‘ ;
call lcd_dat ;
movlw ‘1’ ;
call lcd_dat ;
movlw ‘6’ ;
call lcd_dat ;
movlw ‘0’ ;
call lcd_dat ;
movlw ‘2’ ;
call lcd_dat ;
movlw ‘A’ ;
call lcd_dat ;
;
call paus ;пауза 1 сек
call paus ;пауза 1 сек
;
movlw .16 ;сдвиг экрана влево на 16 позиций
movwf tmp ;
met_1 movlw b’00011000′ ;команда сдвига экрана влево
call lcd_comm ;вызов подпрограммы передачи команды
decfsz tmp,F ;
goto met_1 ;
movlw 0x13 ;установка адреса DDRAM памяти (1-я строка 20-я позиция)
call lcd_adr ;вызоа подпрограммы передачи адреса DDRAM
movlw ‘P’ ;Вывод надписи PCF8574AT
call lcd_dat ;
movlw ‘C’ ;
call lcd_dat ;
movlw ‘F’ ;
call lcd_dat ;
movlw ‘8’ ;
call lcd_dat ;
movlw ‘5’ ;
call lcd_dat ;
movlw ‘7’ ;
call lcd_dat ;
movlw ‘4’ ;
call lcd_dat ;
movlw ‘A’ ;
call lcd_dat ;
movlw ‘T’ ;
call lcd_dat ;
;
call paus ;пауза 1 сек
;
movlw 0x54 ;установка адреса DDRAM памяти (2-я строка 21-я позиция)
call lcd_adr ;вызоа подпрограммы передачи адреса DDRAM
;
movlw ‘I’ ;Вывод надписи I2C bus
call lcd_dat ;
movlw ‘2’ ;
call lcd_dat ;
movlw ‘C’ ;
call lcd_dat ;
movlw ‘ ‘ ;
call lcd_dat ;
movlw ‘b’ ;
call lcd_dat ;
movlw ‘u’ ;
call lcd_dat ;
movlw ‘s’ ;
call lcd_dat ;
;
call paus ;пауза 1 сек
call paus ;пауза 1 сек
;
sdvig movlw .16 ;сдвиг экрана вправо на 16 позиций с одновременным опросом кнопки подсветки
movwf tmp ;с частотой 10 Гц
sdvig_1 movlw b’00011100′ ;команда сдвига экрана вправо
call lcd_comm ;вызов подпрограммы передачи команды
call knp_opros ;вызов подпрограммы опроса кнопки подсветки
movlw .100 ;
call paus_lcd ;пауза 100 мс
decfsz tmp,F ;
goto sdvig_1 ;
movlw .20 ;пауза 2 сек с опросом кнопки подсветки с частотой 10 Гц
movwf tmp ;
sdvig_2 call knp_opros ;вызов подпрограммы опроса кнопки подсветки
movlw .100 ;
call paus_lcd ;пауза 100 мс
decfsz tmp,F ;
goto sdvig_2 ;
movlw .16 ;сдвиг экрана влево на 16 позиций с одновременным опросом кнопки подсветки
movwf tmp ;с частотой 10 Гц
sdvig_3 movlw b’00011000′ ;команда сдвига экрана влево
call lcd_comm ;вызов подпрограммы передачи команды
call knp_opros ;вызов подпрограммы опроса кнопки подсветки
movlw .100 ;
call paus_lcd ;пауза 100 мс
decfsz tmp,F ;
goto sdvig_3 ;
movlw .20 ;пауза 2 сек с опросом кнопки подсветки с частотой 10 Гц
movwf tmp ;
sdvig_4 call knp_opros ;вызов подпрограммы опроса кнопки подсветки
movlw .100 ;
call paus_lcd ;пауза 100 мс
decfsz tmp,F ;
goto sdvig_4 ;
goto sdvig ;переход на метку sdvig
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
knp_opros btfsc knp_led ;Подпрограмма опроса кнопки подсветки дисплея
return ;кнопка не нажата: выход из подпрограммы
call paus_knp ;кнопка нажата, ожидание отжатия
btfss knp_led ;
goto $-2 ;
;
btfsc flag,2 ;опрос флага состояния подсветки
goto knp_1 ;
call lcd_led_on ;подсветка выключена: вызов подпрограммы включения подсветки
return ;выход из подпрограммы
;
knp_1 call lcd_led_off ;подсветка включена: вызов подпрограммы выключения подсветки
return ;выход из подпрограммы
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
err_prov btfss flag,6 ;проверка ошибок передачи данных
return ;нет ошибок: выход из подпрограммы
err_1 bsf led ;ошибка: включить светодиод led
goto err_1 ;переход на метку err_1: зацикливание программы
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Подпрограмма включения/выключения подсветки дисплея
lcd_led_on movlw b’00001000′ ;Команда включения подсветки 3-й бит в 1
movwf adr_i2c ;
bsf flag,2 ;установка флага включенного состояния подсветки
goto lcd_led_1 ;
lcd_led_off movlw b’00000000′ ;Команда выключения подсветки 3-й бит в 0
movwf adr_i2c ;
bcf flag,2 ;установка флага выключенного состояния подсветки
lcd_led_1 movlw b’01111110′ ;
movwf slave_adr ;запись адреса микросхемы PCF8574AT в регистр slave_adr
clrf tmp_i2c ;
call write_i2c ;вызов подпрограммы записи по интерфейсу i2c
return ;выход из подпрограммы
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Подпрограмма инициализации дисплея LCD 1602
init_lcd movlw .15 ;пауза 15 мс
call paus_lcd ;
movlw b’00110000′ ;Передача команды 0011 (старший полубайт)
call lcd_comm_1 ;вызов подпрограммы передачи полубайта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
movlw .5 ;пауза 5 мс
call paus_lcd ;
movlw b’00110000′ ;Передача команды 0011 (старший полубайт)
call lcd_comm_1 ;вызов подпрограммы передачи полубайта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
movlw .1 ;пауза 1 мс
call paus_lcd ;
movlw b’00110000′ ;Передача команды 0011 (старший полубайт)
call lcd_comm_1 ;вызов подпрограммы передачи полубайта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
;Передача команды 0010 (старший полубайт)
movlw b’00100000′ ;Установка 4-х битного режима
call lcd_comm_1 ;вызов подпрограммы передачи полубайта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
;Передача команды 00101000
movlw b’00101000′ ; 4-х битный режим, использовать 2 строки дисплея, шрифт 5×8
call lcd_comm ;вызов подпрограммы передачи байта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
;Передача команды 00001000
movlw b’00001000′ ;выключить дисплей, выключить курсор, выключить мигание курсора
call lcd_comm ;вызов подпрограммы передачи байта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
movlw b’00000001′ ;Передача команды очистки дисплея 00000001
call lcd_comm ;вызов подпрограммы передачи байта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
;Передача команды 00000110
movlw b’00000110′ ;направление движения курсора- вправо (инкремент адреса), запретить сдвиг экрана
call lcd_comm ;вызов подпрограммы передачи байта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
;Передача команды 00001100
movlw b’00001100′ ;включить дисплей, выключить курсор, выключить мигание курсора
call lcd_comm ;вызов подпрограммы передачи байта команды на дисплей
return ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Подпрограмма передачи полубайта команды на дисплей
lcd_comm_1 movwf lcd_tmp ;
movlw b’01111110′ ;
movwf slave_adr ;запись адреса микросхемы PCF8574AT в регистр slave_adr
movlw b’11110000′ ;Передача старшего полубайта, бит E=1
andwf lcd_tmp,W ;
movwf adr_i2c ;
movlw b’00000100′ ;
iorwf adr_i2c,F ;
btfsc flag,2 ;опрос флага состояния подсветки
bsf adr_i2c,3 ;флаг подсветки=1, включение подсветки
movlw data_i2c ;установка первого регистра приема/передачи
movwf FSR ;
movlw b’11110000′ ;Передача старшего полубайта, бит E=0
andwf lcd_tmp,W ;
movwf INDF ;
btfsc flag,2 ;опрос флага состояния подсветки
bsf INDF,3 ;флаг подсветки=1, включение подсветки
movlw .1 ;передача 1-го байта
movwf tmp_i2c ;
call write_i2c ;вызов подпрограммы записи по интерфейсу i2c
return ;выход из подпрограммы
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Подпрограмма передачи команды или данных на дисплей (1 байт)
lcd_adr movwf lcd_tmp ;Команда записи адреса
bsf lcd_tmp,7 ;установка 7-го бита,
bcf flag,3 ;сброс флага, передача команды
goto lcd_met_1 ;
lcd_cgram movwf lcd_tmp ;Команда установки адреса CGRAM памяти
bcf lcd_tmp,7 ;сброс 7-го бита, установка 6-го бита
bsf lcd_tmp,6 ;
bcf flag,3 ;сброс флага, передача команды
goto lcd_met_1 ;
lcd_dat movwf lcd_tmp ;Подпрограмма записи данных в дисплей
bsf flag,3 ;установка флага, передача данных
goto lcd_met_1 ;
lcd_comm movwf lcd_tmp ;Подпрограмма передачи команды на дисплей
bcf flag,3 ;сброс флага, передача команды
lcd_met_1 movlw b’01111110′ ;
movwf slave_adr ;запись адреса микросхемы PCF8574AT в регистр slave_adr
movlw b’11110000′ ;Передача старшего полубайта, бит E=1
andwf lcd_tmp,W ;если передается команда бит RS=0
movwf adr_i2c ;если передаются данные бит RS=1
btfsc flag,3 ;
movlw b’00000101′ ;
btfss flag,3 ;
movlw b’00000100′ ;
iorwf adr_i2c,F ;
btfsc flag,2 ;опрос флага состояния подсветки
bsf adr_i2c,3 ;флаг подсветки=1, включение подсветки
movlw data_i2c ;установка первого регистра приема/передачи
movwf FSR ;
movlw b’11110000′ ;Передача старшего полубайта, бит E=0
andwf lcd_tmp,W ;если передается команда бит RS=0
movwf INDF ;если передаются данные бит RS=1
btfss flag,3 ;
goto lcd_met_2 ;
movlw b’00000001′ ;
iorwf INDF,F ;
lcd_met_2 incf FSR,F ;инкремент регистра FSR
swapf lcd_tmp,F ;меняем местами полубайты
movlw b’11110000′ ;Передача младшего полубайта, бит E=1
andwf lcd_tmp,W ;если передается команда бит RS=0
movwf INDF ;если передаются данные бит RS=1
btfsc flag,3 ;
movlw b’00000101′ ;
btfss flag,3 ;
movlw b’00000100′ ;
iorwf INDF,F ;
incf FSR,F ;инкремент регистра FSR
movlw b’11110000′ ;Передача младшего полубайта, бит E=0
andwf lcd_tmp,W ;если передается команда бит RS=0
movwf INDF ;если передаются данные бит RS=1
btfss flag,3 ;
goto lcd_met_3 ;
movlw b’00000001′ ;
iorwf INDF,F ;
lcd_met_3 btfss flag,2 ;опрос флага состояния подсветки
goto lcd_met_4 ;флаг подсветки=0, подсветка выключена, биты не меняем
movlw data_i2c ;установка первого регистра приема/передачи
movwf FSR ;
bsf INDF,3 ;флаг подсветки=1, включение подсветки
radiolaba.ru
Знакосинтезирующие ЖК-модули 1602A-1 и Wh2602B. Краткое описание
Знакосинтезирующие ЖК-модули 1602A-1 и Wh2602B. Краткое описание
26.12.17
Введение
Как уже́ упоминал ранее, на протяжении нескольких лет я использовал в своих устройствах знакосинтезирующие ЖКИ на базе контроллеров KS0066 (HD44780 и т.д.) типоразмера 85х36мм с двухрядным расположением точек подключения. Однако, в последнее время оные характеризуются довольно херовой доставаемостью, да и цена на них стала – мое почтение. В связи с этим было решено переехать на гораздо более распространенные индикаторы с однорядным расположением точек подключения, типа таких:
При этом минусы подобного переезда мною, конечно, отлично осознавались. Основным здесь было то, что у конторы «МЭЛТ» не существует индикаторов, конструктивно совместимых с выбранным вариантом (что, вообще говоря, довольно странно). В связи с этим можно было сразу попрощаться с аппаратной поддержкой русских шрифтов. Конечно, это не такая уж большая проблема, однако факт остается фактом. Второй минус – невозможность (без танцев с бубном) использования плоского шлейфа и разъемов IDC для подключения ЖКИ, вынесенного с «материнской платы» на панель. Но скажу честно – широкое распространение «однорядных» индикаторов выбранного типа (продаются буквально в каждой конторе с электрозапчастями), перекрывает все эти минусы просто на раз. К тому же из-за того, что данные ЖКИ пользуются большим спросом, ловкорукие китайцы начали их клепать просто в планетарных масштабах. Ну а такая массовость вполне закономерно привела к ощутимому снижению цены.
В моей любимой конторе «Чип-НН» есть две модели индикаторов с однорядным расположением точек подключения: «фирменный» WinStar-овский ЖКИ Wh2602B и китайский 1602A-1, проходящий под кодовым названием «ЖКИ LCD1602». Внешний вид обоих дисплеев приведен на рисунке в начале заметки. Отмечу, что лично я предпочитаю китайский вариант, ибо есть у него несколько неоспоримых преимуществ:
• красота: белые символы на голубом фоне однозначно смотрятся прикольней, чем черные символы на зеленом фоне;
• низкая стоимость: в «Чип-НН» китайца 1602A-1 отдают всего за 145р. против 330р. за «фирменный» индикатор Wh2602B. Двукратная разница в цене как бы говорит сама за себя. Ну а на eBay вполне возможно найти 1602A-1 и вовсе дешевле сотки;
• возможность полноценной работы индикатора при напряжении питания +3,3В;
• малое потребление тока при хорошей светимости подсветки;
• бо́льшая компактность.
Про первые два преимущества всё понятно – первое из них сугубо субъективное, а второе, как было отмечено выше, обусловлено массовостью и китайскостью производства. А вот чтобы понять, откуда берутся остальные плюсы 1602A-1, необходимо вкратце рассмотреть основные характеристики обоих индикаторов, ибо эти плюсы – прямое их следствие.
Геометрические характеристики выбранных моделей ЖКИ
Как Wh2602B, так и 1602A-1 представляют собой знакосинтезирующие ЖКИ размером 80х36мм, позволяющие отображать на своем экране 2 строки по 16 символов в каждой:
Расстояние между крепежными отверстиями у них совпадает (в отличие от, например, ранее использовавшихся MT-16S2D и Wh2602C) и составляет 75х31мм. При этом диаметр крепежной дырки у Wh2602B равен 2,5мм, а у 1602A-1 – все 3,2мм. Поскольку я для крепления ЖКИ на панель устройств использую исключительно стойки с метрической резьбой М3, нетрудно догадаться: с этой точки зрения лично для меня предпочтительней китайский индикатор, поскольку в нем не надо будет дополнительно рассверливать дырки до Ø3,2мм. Вдобавок ко всему, 1602A-1 немного компактней своего фирменного собрата, т.к. у него экран возвышается над платой всего на 7,0мм, в то время как у Wh2602B эта величина составляет 8,6мм:
Конечно, разница в 1,6мм не особо велика, однако в портативных устройствах с плотной компоновкой элементов даже эта мелочь может сыграть большую роль. Ну и последнее в плане геометрии – размеры экрана, ра́вно как и его положение относительно крепежных отверстий, у 1602A-1 и у Wh2602B слегка отличаются (см. предпоследний рисунок). Поэтому в том случае, когда вы хотите разметить/изготовить универсальную переднюю панель, на которую могут быть установлены индикаторы обоих типов, данный факт следует учитывать. В качестве примера могу привести вариант разметки «универсальной» передней панели (верхний рисунок) и наклейки на нее (нижний рисунок), которыми пользуюсь лично я:
Напряжение питания выбранных моделей ЖКИ
Как и подавляющее большинство знакосинтезирующих жидкокристаллических индикаторов, Wh2602B и 1602A-1 состоят, условно говоря, из трех основных частей. Первая часть – это ЖК-панель, на которой отображается вся выводимая информация. Вторая часть – это мозги индикатора, которые управляют панелью и говорят, что именно на ней нужно отобразить. И третья часть – это подсветка, позволяющая гораздо лучше увидеть информацию, выведенную на панель, даже на большом расстоянии:
Здесь важно отметить, что каждая из этих трех частей имеет свое отдельное питание, выведенное на точки подключения модуля. Мозг питается напряжением «V DD–VSS», ЖК-панель – напряжением «VDD–V0», а подсветка – напряжением «А–К»:
И именно данный факт определяет диапазон напряжений питания, при которых ЖК-модуль может полноценно работать. Вообще говоря, индикаторы Wh2602B и 1602A-1 относятся к обширному семейству 5В-вых дисплеев, т.е. в соответствии с документацией напряжение питания у них может лежать в диапазоне +4,5В…+5,5В. Однако, если подойти к вопросу с пониманием внутренней структуры ЖК-модуля, то и для работы с 3,3В-вой логикой данные модели вполне сгодятся.
Итак, мозги рассматриваемых индикаторов состоят из двух микросхем: контроллера точечной ЖК-матрицы и специализированного драйвера сегментов. Именно с контроллером общается пользователь посредством управляющих сигналов DB0…DB7, R/W, RS и E, и именно контроллер рулит выводом символов на ЖК-панель индикатора. Отметим, что используемые в моделях Wh2602B и 1602A-1 контроллеры могут и сами зажигать/тушить нужные точки на ЖК-панели, однако их возможностей хватает только на 16 символов, а нам бы их надо 16х2=32 штуки. Для увеличения количества отображаемых символов на платы ЖКИ вкупе с основным контроллером устанавливаются специальные сегментные драйверы, выступающие, грубо говоря, обычным «расширителем» выводов.
У индикаторов Wh2602B в качестве основного контроллера выступает знаменитый HD44780U, у 1602A-1 – менее известный ST7066U. Насчет драйвера сегментов всё несколько сложнее – напрямую его модель указана только для китайца 1602A-1 (ST7065C):
Но, думаю, это не принципиально, ибо у всех известных мне ЖКИ используемые микросхемы аналогичны друг другу. Так вот, и у HD44780U, и у ST7066U, и у ST7065C, и вообще у всех подобных чипов напряжение питания может составлять от +2,7В до +5,5В, поэтому:
• мозги 5В-вого индикатора не будут испытывать никаких проблем при работе ЖК-модуля от +3,3В (VDD=+3,3В; VSS=0В).
Переходим к рассмотрению ЖК-панели. Питается она немного хитро – на ее «плюс» подается потенциал VDD, а вот «минус» панели сидит не на земле (VSS), а на потенциале V0. Сделано так потому, что для четкого и контрастного отображения выводимых символов напряжение питания ЖК-панели обычно требуется подстраивать под конкретное значение VDD. Вдобавок ко всему, такая подстройка необходима и при изменении температуры окружающей среды. Отметим, что при напряжении питания ЖК-панели VLCD=VDD–V0 ниже оптимального значения (VOPT
Для того, чтобы иметь возможность регулировки напряжения питания ЖК-панели, обычно используют подстроечный резистор. Типовая схема включения этой части индикатора и типовые же значения напряжения питания VLCD=VDD–V0 для Wh2602B приведены ниже (для 1602A-1 они будут примерно такими же):
Отметим, что показанное включение подстроечного резистора позволяет менять напряжение питания ЖК-панели от VLCD=0В (при крайнем верхнем по схеме положении движка) до V LCD=VDD (при крайнем нижнем положении движка). Также обратите внимание на то, что все приведенные типовые значения VLCD не превышают +5,2В. Поэтому при «стандартном» напряжении питания модуля (VDD=+5,0В) мы заведомо сможем настроить питание ЖК-панели на оптимальное значение (по крайней мере, для плюсовых температур окружающей среды, на работу в которых и рассчитаны индикаторы Wh2602B и 1602A-1). А вот если нам нужно запитать модуль от «пониженного» напряжения (VDD=+3,3В), то даже при нижнем положении движка подстроечного резистора питание ЖК-панели не превысит +3,3В, а нам надо бы +3,8В (для комнатной температуры). Отсюда следует, что при той схеме включения ЖКИ, которая приведена на последнем рисунке, символы на дисплее будут отображаться как минимум нечетко (ну а в реальности их просто тупо не будет видно).
Решение данной проблемы, в принципе, элементарно. Для того, чтобы напряжение питания ЖК-панели поднялось до требуемых +3,8В, достаточно нижний по схеме вывод подстроечника подключить не к земле, а к источнику отрицательного напряжения V
Если свободных выводов МК нет, то в качестве генератора прямоугольных импульсов можно применить другие схемотехнические решения – таймер, мультивибратор и т.д. Возможно, в некоторых случаях будет оправданным даже использование специализированных преобразователей напряжения на переключаемых конденсаторах (например, LM2664 или ICL7660S). Главное здесь то, что:
• ЖК-панель 5В-вого индикатора вполне может работать при напряжении питания дисплея VDD=+3,3В (пусть и с небольшими дополнительными плясками с бубном).
Отметим, что всё вышесказанное в полной мере относится как к индикатору Wh2602B, так и к индикатору 1602A-1. Т.е. у обеих моделей нет никаких принципиальных ограничений на работу мозгов и ЖК-панели при напряжении питания модуля VDD=+3,3В. В этом плане рассматриваемые дисплеи схожи (разве что максимально допустимое питание экрана VLCD(MAX) у 1602A-1 чуть ниже, чем у Wh2602B – +10,0В против +13,0В). А вот подсветка китайского индикатора уделывает Wh2602B просто в хлам.
Давайте я сразу вылью ушат говна на «фирменный» ЖКИ, а уж пото́м разберу каждый пункт более подробно. При этом следует иметь ввиду, что WinStar-овскими индикаторами серии Wh2602 я пользовался лет 7-8 и до знакомства с 1602A-1 был вполне ими доволен. Но вот после знакомства… да. Короче, с технической точки зрения ЖКИ Wh2602B проигрывает китайцу 1602A-1 в плане подсветки по следующим пунктам:
• адское потребление тока;
• херовая «светимость»;
• принципиальная невозможность работы при VDD=+3,3В;
• обязательное использование токоограничивающего резистора.
Подсветка обычного жидкокристаллического индикатора в большинстве случаев является светодиодной, и для того, чтобы не спалить светодиод, ток через него необходимо чем-то ограничивать. Как известно, наиболее простым и при этом эффективным способом ограничения тока является использование обычного резистора. Так вот, в индикатор 1602A-1 данный ограничитель уже́ встроен (используется резистор типоразмера 1206 с сопротивлением R1602A-1=100 Ом ± 5%), а вот в дисплее Wh2602B его нет – на точки подключения №№15, 16 («А» и «К») просто тупо выведена «голая» подсветка. Поэтому ничто не мешает без особых ухищрений спалить подсветку «фирменного» индикатора, подав на нее по дури (или просто по забывчивости) ничем не ограниченные +5,0В. Лично для меня данное решение выглядит, мягко говоря, странно, тем более, что место под токоограничивающий резистор на плате ЖКИ Wh2602B есть (даже под два):
В общем, при использовании индикатора модели Wh2602B наличие дополнительного токоограничивающего резистора обязательно. В документации на ЖКИ приводятся рекомендуемые параметры этого резистора: RWh2602B=4,7 Ом ± 5% с допустимой мощностью рассеяния не менее 0,5Вт. Полватта на какую-то сраную подсветку, Карл! Сразу понятно, насколько экономичным является использование индикатора Wh2602B. Ну и, собственно, проведенные опыты полностью подтверждают данное опасение:
На данной картинке приведено токопотребление подсветки (IB/L) и падение напряжения на ней (VB/L) для рассматриваемых моделей индикаторов при разных номиналах токоограничивающего резистора (в Омах). Слева показаны результаты для Wh2602B, справа – для 1602A-1. Напряжение питания подсветки вместе с резистором было взято равным +4,9В (тут я просто забыл выставить красивую цифру на источнике). И еще одно – для обоих индикаторов указывается номинал резистора, добавленного именно мной, поэтому в случае 1602A-1 сюда надо приплюсовывать еще и «родные» 100 Ом.
Собственно говоря, особо комментировать тут нечего – и так всё ясно. Если у китайского индикатора при токе IB/L=20,5мА (т.е. при максимуме, который вообще может быть) подсветка сияет как начищенный пятак, то у Wh2602B при почти том же токе еще только становится понятно, что подсветка на дисплее вообще есть. Ну и пожирание светодиодом почти 70мА для достижения более-менее путной яркости тоже не особо радует. Поэтому здесь единственный аргумент в пользу использования Wh2602B может быть таким: данный индикатор, в отличие от 1602A-1, позволяет работать вообще без подсветки и при этом довольно сносно различать информацию на экране:
При этом общее токопотребление дисплея минимизируется, ибо без подсветки оба индикатора жрут немного (в районе 1,0мА…1,5мА, т.к. кормить надо только мозги). Данный факт может быть весьма и весьма важен при выборе элементной базы для автономных (батарейных) устройств. Но с другой стороны, в китайском модуле подсветка вполне достойно светит даже при токе IB/L=1,0мА…2,0мА (см. предпоследний рисунок). Поэтому с учетом емкости современных литий-ионных аккумуляторов даже для автономных поделок лично я предпочел бы использовать индикаторы 1602A-1, т.к. с подсветкой (пусть и тусклой) информация на экране выглядит намного разборчивее, чем без нее.
Ну и последний вывод, который можно сделать из предпоследнего рисунка: нормальная работа подсветки индикатора Wh2602B при ее питании ниже +3,7В…+3,8В невозможна в принципе. Как нетрудно догадаться, это следует из величины падения напряжения на желто-зеленой подсветке, составляющей около +3,7В даже в том случае, когда яркость свечения светодиодов практически равна нулю. В реальности же более-менее приемлемой яркости будет соответствовать падение от +3,9В и выше (и это еще без учета того, что на токоограничивающем резисторе тоже должно упасть хоть что-то). Ну а для китайского индикатора 1602A-1 таких проблем не существует – максимальное падение напряжения на его подсветке в проведенном эксперименте составило всего +2,85В, чего с запасом достаточно для питания +3,3В даже с учетом 5%-го допуска на этот номинал. Поэтому со всей ответственностью можно сказать:
• подсветка 5В-вого индикатора 1602A-1 вполне может полноценно работать при напряжении питания +3,3В;
• подсветка 5В-вого индикатора Wh2602B принципиально не может работать при напряжении питания +3,3В.
Управление выбранными моделями ЖКИ. Таблицы символов.
Под занавес несколько слов хотелось бы сказать и о «микроконтроллерной» части выбранных моделей индикаторов. Собственно, говорить здесь о самой программе для микроконтроллера (МК), при помощи которой на ЖКИ можно вывести ту или иную информацию, думаю, бессмысленно – это решается подключением к проекту одной из десятков соответствующих библиотек, доступных в Интернете, и какую из них выберете именно вы – мне неведомо. А вот про некие общие моменты сказать нужно.
Как известно, знакоситезирующие ЖКИ могут работать как в 4-х битном режиме обмена данными, так и в 8-ми битном:
При этом для 8-ми битного обмена требуется максимум 11 управляющих выводов микроконтроллера, а именно:
Вывод ЖКИ | Направление | Назначение и описание |
RS | Вход | Адресный сигнал: выбор между передачей данных (High) и команд управления (Low) |
R/W | Вход | Выбор режима записи (Low) или чтения (High) |
E | Вход | Разрешение обращений к индикатору (а также строб данных) |
DB0 | Вход/выход | Шина данных (8-ми битный режим) (младший бит в 8-ми битном режиме) |
DB1 | Вход/выход | Шина данных (8-ми битный режим) |
DB2 | Вход/выход | Шина данных (8-ми битный режим) |
DB3 | Вход/выход | Шина данных (8-ми битный режим) |
DB4 | Вход/выход | Шина данных (8-ми и 4-х битные режимы) (младший бит в 4-х битном режиме) |
DB5 | Вход/выход | Шина данных (8-ми и 4-х битные режимы) |
DB6 | Вход/выход | Шина данных (8-ми и 4-х битные режимы) |
DB7 | Вход/выход | Шина данных (8-ми и 4-х битные режимы) (старший бит) |
Для 4-х битного же режима нужно всего лишь семь линий: «R/W», «RS», «E», «DB7», «DB6», «DB5», «DB4» (т.е. здесь сигналы «DB3»-«DB0» не используются). При этом преимущество 8-ми битного режима состоит только в том, что данные на ЖКИ будут передаваться несколько быстрее, чем при 4-х битном режиме. Ну а поскольку жидкий индикатор сам по себе далеко не быстродействующее устройство, то как-то так исторически повелось, что для экономии выводов МК обычно используется 4-х битный режим обмена данными с ЖКИ.
Отметим, что есть способ сэкономить еще один вывод микроконтроллера. Как отмечалось выше, рассматриваемые индикаторы могут как принимать данные от МК, так и выдавать их наружу. Например, они могут рассказать камню, в какой позиции в данный момент находится курсор, и какой символ в этой позиции записан. Кроме того, при помощи функции чтения данных можно считать флаг занятости ЖКИ, что позволяет несколько сократить время вывода символов на экран. Таким образом, рассматриваемые индикаторы позволяют организовать полномасштабное общение микроконтроллера с дисплеем, однако в реальной жизни чтение данных из индикатора обычно не используется – гораздо проще организовать процесс общения с ЖКИ на тупых задержках, а на флаг занятости попросту забить (тем более, такой подход вполне разрешается и документацией на ЖК-модуль).
Как видно из последней таблицы, за тип обмена инфой (чтение/запись) отвечает вывод «R/W» ЖКИ. Если на этом выводе присутствует логическая единица, то производится чтение данных с индикатора, а если логический нуль, то данные в индикатор записываются. А поскольку мы условились, что индикатор нами используется только для вывода информации (т.е. только в режиме записи), то и управлять выводом «R/W» нам, по большому счету, не нужно – достаточно его просто заземлить. Таким образом, экономится еще один вывод МК, т.е. для управления жидкокристаллическим индикатором со стороны камня достаточно будет всего шести выводов.
Ну и в завершении приведем таблицы символов рассматриваемых индикаторов. Здесь хотелось бы сказать несколько добрых слов в адрес модели Wh2602B. В отличие от китайца, «фирменный» индикатор из «Чип-НН» имеет возможность вывода на экран русских символов, недостающих в английском алфавите:
При этом на вывод данных символов не нужно затрачивать дополнительные ресурсы (память и машинное время) микроконтроллера, т.к. буквы эти создаются знакогенератором в само́м ЖКИ. Китайский индикатор 1602A-1 не может похвастаться данной фичей, поскольку его таблица символов выглядит так:
Однако, справедливости ради сто́ит отметить, что проблема с выводом русских (да и любых других) букв на экран ЖКИ элементарно решается при помощи тех же символов пользователя (т.е. с использованием CGRAM). Ну или можно вообще все свои дывайсы делать англоязычными, т.е. не использовать русские буквы ни на панели, ни в меню устройства. Я, кстати, в итоге на этом варианте и остановился, как на наиболее универсальном, но здесь, конечно, всё зависит от заказчика – позволит ли он использовать исключительно латиницу.
Вот, пожалуй, и все общие сведения об основных моделях ЖКИ, которые я использую в своих поделках (еще раз отмечу – лично мне больше по душе китайский модуль 1602A-1). Конечно, в зависимости от конкретного проекта могут использоваться индикаторы «разрешением» и 4 строки по 40 символов, и 2 строки по 8 символов, и разные другие. Но в основном мной юзаются именно такие ЖКИ, о которых шла речь в данной заметке – их возможностей в большинстве случаев вполне хватает.
А на сегодня всё. Желаю удачи при работе с ЖКИ!
Обсудить эту заметку можно здесь
Ссылки по теме, документация
Возможные варианты использования рассмотренных ЖКИ:
• LCD-1602A1-M3SS.h20-4;
• LCD-1602A1-M3SN.h20-4.
Документация на рассмотренные модели ЖКИ (полный вариант):
• 1602A-1;
• Wh2602B.
Чисто для справки – документация на контроллеры, применяемые в рассмотренных моделях ЖКИ:
• HD44780U ;
• ST7066U.
kmpu.ru
Символьный ЖКИ(LCD) Wh2602A datasheet документация
Для отображения информации, работающего устройства можно использовать светодиод, светодиодный семисегментный индикатор, символьный жидкокристаллический индикатор или графический ЖКИ. Wh2602A – то символьный ЖКИ. В названии Wh2602A зашифровано количество символов в строке: 16, количество строк: 2.
Символьный ЖКИ Wh2602A построен на основе контроллера HD44780 компании Hitachi. ЖКИ Wh2602A имеет несколько вариантов цвета подсветки, мне встречались: синий, зеленый, оранжевый. Так же говорят что есть трехцветная подсветка RGB, но я не видел в живую такой вариант исполнения. Хотя думаю было бы круто! Так как можно этими тремя цветами отобразить большое количество оттенков. В последнее время стоимость Wh2602A поднялась почти в два раза, потому для простых экспериментальных устройств советую применять однострочные символьные ЖКИ, цена ниже, а возможности практически такие же.
Wh2602A очень широко применяется радиолюбителями в своих поделках, так как в принципе это универсальный индикатор режима работы устройства или процесса выполнения операции устройством. На Wh2602A доступно сделать своеобразную простенькую анимацию, выполняющую например роль заставки при включении устройства или после выполнения определенной операции. На нашем сайте очень много статей требуют наличия в проекте символьного ЖКИ Wh2602A, так же есть пример библиотеки для работы с данным ЖКИ.
Скачать Wh2602A datasheet
Аналоги: BL1602
Для отображения информации, работающего устройства можно использовать светодиод, светодиодный семисегментный индикатор, символьный жидкокристаллический индикатор или графический ЖКИ. Wh2602A – то символьный ЖКИ. В названии Wh2602A зашифровано количество символов в строке: 16, количество строк: 2.
Символьный ЖКИ Wh2602A построен на основе контроллера HD44780 компании Hitachi. ЖКИ Wh2602A имеет несколько вариантов цвета подсветки, мне встречались: синий, зеленый, оранжевый. Так же говорят что есть трехцветная подсветка RGB, но я не видел в живую такой вариант исполнения. Хотя думаю было бы круто! Так как можно этими тремя цветами отобразить большое количество оттенков. В последнее время стоимость Wh2602A поднялась почти в два раза, потому для простых экспериментальных устройств советую применять однострочные символьные ЖКИ, цена ниже, а возможности практически такие же.
Wh2602A очень широко применяется радиолюбителями в своих поделках, так как в принципе это универсальный индикатор режима работы устройства или процесса выполнения операции устройством. На Wh2602A доступно сделать своеобразную простенькую анимацию, выполняющую например роль заставки при включении устройства или после выполнения определенной операции. На нашем сайте очень много статей требуют наличия в проекте символьного ЖКИ Wh2602A, так же есть пример библиотеки для работы с данным ЖКИ.
Скачать Wh2602A datasheet
Аналоги: BL1602
avrlab.com
LCD дисплей 1602 или “каша из топора” возвращается.
В общем решил сделать себе тоже приборчик.
Лирическое отступление.Прибор я собрался делать по схеме Маркуса — страничка проекта, а еще точнее по ее дополненному варианту от Карла (Karl-Heinz K¨ubbeler)- страничка проекта.
Но когда решил собирать, то столкнулся с проблемой слишком большого количества информации.
Некоторая часть информации взята отсюда и отсюда.
Но так как прибор постоянно видоизменяется, дорабатывается и переделывается, то пришлось потратить некоторое время, что бы получить то, что я хочу.
В этой части обзора я хочу собрать все воедино и предложить моим читателям версию прибора для самостоятельного изготовления. Надеюсь что у меня это получится.
Делать я решил прибор с питанием от литиевого аккумулятора, в почти максимальной версии (нет входа частотомера и валкодера, но их при желании можно добавить).
Применен контроллер Atmega328, на плате присутствует схема заряда аккумулятора с индикацией, преобразователь питания с 3.7 до 5 Вольт (эта часть взята с моего обзора аккумуляторов), преобразователь для проверки стабилитронов.
Сама плата сделана по размерам обозреваемого дисплея и сама конструкция сделана так, что дисплей одевается на контакты разъема, образуя единое целое.
На плате размещен разъем под стандартный джек 3.5, причем разведен так, что при использовании режима генератора используется общий разъема и контакт левого канала.
Так же на плате есть тестовые площадки, так как использовать их при такой высоте индикатора не очень удобно, то я решил потом добавить плату с тестовыми площадками, когда пойму как мне будет удобно их расположить.
Прошивка была скомпилирована под этот прибор, но он вполне работает и с базовой прошивкой, я только изменил порог индикации разряда батареи, включил автоотключение после 5 измерений и отключил последовательный вывод данных.
Прибор может определять цоколевку и параметры полевых и биполярных транзисторов, диодов, конденсаторов (с измерением ESR), симисторов, резисторов, стабилитронов (до 33 Вольт), индуктивностей, работать как генератор частот.
Прибор включается кнопкой Тест, выключение автоматическое либо принудительное из меню.
Схема прибора, вид печатной платы и список примененных компонентов.
Принципиальная схема и трассировка

R1 2.2k Задает ток заряда аккумулятора, настроено на 450мА
R2 510 Ohm Ограничение тока светодиода индикации заряда
R3 30k Делитель индикации разряда аккумулятора L6920DB
R4 20k Делитель индикации разряда аккумулятора L6920DB
R5 470 Ohm Ограничение тока светодиода индикации разряда
R6 1 Ohm Датчик тока МС34063
R7 180 Ohm Ограничение базового тока силового транзистора МС34063
R8 5.6k Делитель ОС МС34063 Настроено на 35 Вольт
R9 81k Делитель ОС МС34063 Настроено на 35 Вольт
R10 2.2k Резистор для закрытия VT1
R11 180 Ohm Ограничение тока заряда затвора VT1
R12 5.6k ограничение тока базы VT2
R13 180 Ohm Защита от КЗ перемычки к кнопке Тест
R14 5.6k ограничение тока базы VT3
R15 22k Резистор для закрытия VT3
R16 10K Делитель ОС измерения напряжения батареи питания прибора
R17 3.3K Делитель ОС измерения напряжения батареи питания прибора
R18 5.6K Подтяжка коллектора VT3, блокировка МС34063
R19 3.3K Регулировка контрастности дисплея, требует подбора
R20 5.6K Подтяжка вывода reset процессора
R21 2.2K Питание источника опорного напряжения 2.5 Вольта
R22 180K Делитель измерения напряжения пробоя стабилитрона
R23 20K Делитель измерения напряжения пробоя стабилитрона
R24 6.2K Токоограничивающий резистор проверки стабилитронов
R25 470K Измерительный резистор
R26 680 Ohm Измерительный резистор
R27 470K Измерительный резистор
R28 680 Ohm Измерительный резистор
R29 470K Измерительный резистор
R30 680 Ohm Измерительный резистор
R31 22K Резистор для закрытия VT2
8pcs 0R Перемычка 1206
2pcs 0R Перемычка 0805
C1 1uF Керамический 0805
C2 47uF 16V Танталовый TAJC476K016RNJ-AVX
C3 1uF Керамический 0805
C4 47uF 16V Танталовый TAJC476K016RNJ-AVX
C5 1uF Керамический 0805
C6 1uF Керамический 0805
C7 22uF 16V Танталовый TAJC226K016RNJ-AVX
C8 470pF Керамический 1206
C9 47uF 50V Низкоимпедансный EZV470M50RC8
C10 1uF Керамический 0805
C11 22pF Керамический 1206
C12 22pF Керамический 1206
C13 100nF Керамический 1206
C14 1nF Керамический 0805
C15 100nF Керамический 0805
VT1 IRLML5203TRPBF
VT2 BC817
VT3 BC817
VD1 1N4148 1206
VD2 1N4148 1206
VD3 1N4148 1206
VD4 SS24T3G
IC1 STC4054GR
IC2 L6920DB
IC3 MC34063ABD-TR
IC4 ATmega328P-AUR
IC5 TL431BQDBZR
HL1 green color LED
HL2 red color LED
L1 CDRH73NP-100MC
L2 CDRH64BNP-331MC
quartz KX-3HT 8.0 MHz
Разъемы
3.5jack ST-11M-030-00-0
PB-06S 2шт
PLS-20
Кнопка SWT-3/10 (длину штока подобрать под свой корпус).
Резисторы, выделенные жирным шрифтом лучше применить точные (1%), при этом особое внимание надо уделить резисторам R25-R30, их лучше подобрать максимально точными, в идеале купить 0.1 или 0.5%, или купить менее точные и отобрать.
Схема прибора немного отличается от базовой схемы, но отличия небольшие. например выключение преобразователя 35 Вольт производится подачей 5 Вольт на управляющий вход микросхемы преобразователя МС34063. Регулировка контрастности производится не двумя резисторами, а одним, между входом регулировки и общим проводом схемы. В качестве ИОН применена TL431B точность 0.5%. немного изменена схема управления питанием.
По этой схеме (хотя правильнее сказать наоборот, по трассировке рисовалась схема) подобраны детали, что-то покупалось, что то выпаяно откуда то.
Плату я делал в обзоре бумаги, но ее пришлось отложить, так как на ней была ошибка, контакты индикатора были сдвинуты на 2мм, можно было припаять используя обрезки выводом компонентов и изогнуть, но я решил сделать новую плату. если для сборки прибора по уже существующей схеме проблем нет, то отлаживать схему в таком варианте было бы неудобно. Оставшуюся плату скорее всего подарю кому нибудь.
На фото оба варианта платы, внизу с дефектом, вверху исправленная.
Спаянная и проверенная плата, к слову заработала без проблем, потребовалось только откалибровать и подстроить резистор контрастности индикатора. На фото аккумулятор от старого навигатора, там он уже нормально не работает, а здесь просто отлично прижился.
С обратной стороны платы расположились перемычки, это расплата за то, что плата односторонняя.
В собранном виде выглядит весьма компактно.
И при этом еще и работает.
Измерение параметров транзистора
И первого попавшегося конденсатора.
Материалы для скачивания
Схема, трассировка (все элементы подписаны), прошивка (английский язык)и биты конфигурации, Ponyprog с поддержкой AtMega328, инструкция на русском языке. Скачать
Дополнительно. WinAVR для компиляции своих настроек и исходники из которых я компилировал прошивку, инструкция по компиляции. — Скачать.
Описания на примененные компоненты — Скачать.
В дальнейшем в планах изготовить или подобрать корпус, подобрать маленький и максимально емкий аккумулятор, который влез бы между платой и дисплеем.
В общем я старался максимально собрать информацию для повторения прибора в одном месте, очень надеюсь что у меня получилось.
mysku.ru