Работа с ЖКИ на контроллере HD44780 и его аналогах
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Ах, вы про это... да просто подчищают биты, чтобы потом на них положить нужные данные командой OR. Ведь если там будет мусор, а он там стопудов будет от предыдущих манипуляций, то данные просто исказятся.
Вообще, код пишут кто как может, поэтому могут встречаться и перлы и хаки... по хорошему так делать нельзя - надо сначала наложить маску на переменную, потом наложить туда данные и только потом это вывести в порт. То как это сделано здесь -съекономили одну ячейку памяти но порт будет постоянно дрыгать внешней ножкой - к примеру там была 1 и надо установить тоже 1 в предоставленном алгоритме порт мы сначала очистим - ножка пойдет в ноль, а потом выставим состояние "1" - ножка пойдет в +5В.
Вообще, код пишут кто как может, поэтому могут встречаться и перлы и хаки... по хорошему так делать нельзя - надо сначала наложить маску на переменную, потом наложить туда данные и только потом это вывести в порт. То как это сделано здесь -съекономили одну ячейку памяти но порт будет постоянно дрыгать внешней ножкой - к примеру там была 1 и надо установить тоже 1 в предоставленном алгоритме порт мы сначала очистим - ножка пойдет в ноль, а потом выставим состояние "1" - ножка пойдет в +5В.
- Реклама
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Спасибо!
Да, именно об этом))). Теперь примерно понятен алгоритм вывода тетрады в порт - наложить маску на переменную, затем данные, потом выводим в порт. Буду писать свой код исходя из этого алгоритма. Дело в том, что приведенный код мне показался более менее понятным в сравнении с остальными, поэтому копался в нем 
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Возник еще такой вопрос: мы отправляем сначала один полубайт (старший), затем второй (младший). ЖКД сначала первые переданные ему 4 бита воспринимает как старшие, а вторые - как младшие? Или же перед отправкой мы сообщаем жкд, что вот тебе пошел старший полубайт, а вот к тебе пошел младший?
ну или же как? Подскажите пожалуйста)))
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Именно так, орн сам ведет подсчет когда идет старший когда младший. Сбрасывается этот счетчик по сигналу выбора индикатора.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Подчеркнул то, которое как бы намекает.sklw35 писал(а):отображает только по 8 символов в каждой строке дальше непонятные потемнения... два LCD отображают только половину, до этого пару дней назад все ок... Фото0093.jpg
Если оба "плохих" дисплея показывают одинаковые краказябры - о чём вопрос?
Ищем краказябры в таблице "прошитых" символов, не находим, вспоминаем про "пользовательские" символы.
Если краказябры на разных дисплеях разные, но/и частично совпадают с тем символом, который пытаемся вывести - тогда это резинка между стеклом и платой.
Можно разобрать, собрать, повторить, выбросить. Задача на везение.
А цифра 8 она очень такая характерная цифра, более того - она "круглая". В двоичном смысле.
И вот именно ровно по 8 знакомест сдохло на каждом из двух дисплеев... а остальные ровно 8 работают идеально... на обоих экземплярах... одинаково и ровно по 8 знакомест...
- Реклама
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Благодарю. Сегодня ,наконец то, дописал код вывода на информационные выводы адреса символа (где и в какой он строке мне нужен) и код самого символа. Хочу для начала вывести один символ на жкд.Alexeyslav писал(а):Именно так, орн сам ведет подсчет когда идет старший когда младший. Сбрасывается этот счетчик по сигналу выбора индикатора.
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Подскажите пожалуйста, не могу разобраться до конца с инициализацией ЖКИ. Действую по следующему алгоритму:
В случае использования 4-битного интерфейса инициализация выполняется аналогичным образом, только данные передаются в два приема по 4 бита, причем первыми идут старшие 4 бита.
Пункты 1...8 аналогичны предыдущему случаю.
9. RS = 0, R/W = 0, DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0 — выбран 4-битный интерфейс.
10. Пауза 200 мкс.
11.1. RS = 0, R/W = 0, DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0 — подтверждение выбора 4-битного интерфейса.
11.2. Пауза 200 мкс.
11.3. RS = 0, R/W = 0, DB3 = N, DB2 = F, DB1 = *, DB0 = * — выбор числа строк и размера матрицы символов.
12. Пауза 200 мкс.
13.1. RS = 0, R/W = О, DB7 = О, DB6 = О, DB5 = О, DB4 = 0.
13.2. Пауза 200 мкс.
13.3. RS = О, R/W = О, DB3 = 1, DB2 = О, DB1 = О, DB0 = 0 — дисплей выключен.
14. Пауза 200 мкс.
15.1. RS = О, R/W = О, DB7 = О, DB6 = О, DB5 = О, DB4 = 0.
15.2. Пауза 200 мкс.
15.3. RS = 0, R/W = 0,DB3= 1, DB2 = 1, DB1 =0, DB0 = 0 — дисплей включен.
16. Пауза 200 мкс.
17.1. RS = О, R/W = О, DB7 = О, DB6 = О, DB5 = О, DB4 = 0.
17.2. Пауза 200 мкс.
17.3. RS = О, R/W = О, DB3 = О, DB2 = 1, DB1 = l/D, DB0 = S — установка параметров отображения информации.
С 8ми битной инициализацией все понятно - указал все 8 бит, а вот с 4х - не совсем.
Возьмем 9й пункт:
"9. RS = 0, R/W = 0, DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0 — выбран 4-битный интерфейс."
Как мне правильно "объяснить" контроллеру, что ты, мол, возьми только 4 старшие бита для инициализации DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0 и все, остальные не трогай
. Ведь если я напишу b'0010', то мк воспримет эту запись как 0000 0010. Как мне дать понять, что использовать только 4 бита и что они именно старшие?
В случае использования 4-битного интерфейса инициализация выполняется аналогичным образом, только данные передаются в два приема по 4 бита, причем первыми идут старшие 4 бита.
Пункты 1...8 аналогичны предыдущему случаю.
9. RS = 0, R/W = 0, DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0 — выбран 4-битный интерфейс.
10. Пауза 200 мкс.
11.1. RS = 0, R/W = 0, DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0 — подтверждение выбора 4-битного интерфейса.
11.2. Пауза 200 мкс.
11.3. RS = 0, R/W = 0, DB3 = N, DB2 = F, DB1 = *, DB0 = * — выбор числа строк и размера матрицы символов.
12. Пауза 200 мкс.
13.1. RS = 0, R/W = О, DB7 = О, DB6 = О, DB5 = О, DB4 = 0.
13.2. Пауза 200 мкс.
13.3. RS = О, R/W = О, DB3 = 1, DB2 = О, DB1 = О, DB0 = 0 — дисплей выключен.
14. Пауза 200 мкс.
15.1. RS = О, R/W = О, DB7 = О, DB6 = О, DB5 = О, DB4 = 0.
15.2. Пауза 200 мкс.
15.3. RS = 0, R/W = 0,DB3= 1, DB2 = 1, DB1 =0, DB0 = 0 — дисплей включен.
16. Пауза 200 мкс.
17.1. RS = О, R/W = О, DB7 = О, DB6 = О, DB5 = О, DB4 = 0.
17.2. Пауза 200 мкс.
17.3. RS = О, R/W = О, DB3 = О, DB2 = 1, DB1 = l/D, DB0 = S — установка параметров отображения информации.
С 8ми битной инициализацией все понятно - указал все 8 бит, а вот с 4х - не совсем.
Возьмем 9й пункт:
"9. RS = 0, R/W = 0, DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0 — выбран 4-битный интерфейс."
Как мне правильно "объяснить" контроллеру, что ты, мол, возьми только 4 старшие бита для инициализации DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0 и все, остальные не трогай
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Не нужно никаких пунктов, того что дальше - уже достаточно.Serhio писал(а):Пункты 1...8 аналогичны предыдущему случаю.
Смотрите. Для установки режима дисплея в него нужно каким-то образом передать команду (0)(0)(1)(DL)(N)(F)(-)(-).
До начала инициализации дисплей находится по умолчанию в 8-битном режиме. Он воспринимает данные на всех 8-ми ножках. Поэтому, учитывая то, что ноги DB3-DB0 "висят" в воздухе, он, фактически, может считать с них любой "мусор". Но самый важный бит, (DL), в воздухе
не висит. Поэтому, самая первая посылка является, фактически, 8-битной. Поэтому, при инициализации 4-битного режима дисплей принимает следующие данные:
(0)(0)(1)(DL=0)(x)(x)(x)(x) - строб (ваш пункт 9).
То есть, дисплей по-любому переходит в 4-хбитный режим после этой команды с одним стробом. Но при этом может выбраться как однострочный, так и двухстрочный режим (N), как 8-битная высота символов, так и 11-битная (F). Из-за того, что младшие биты "висят" в воздухе. Поэтому, для уточнения настройки, команда инициализации повторяется. Но, поскольку дисплей _уже_ находится в 4-битном режиме, она, как и все последующие команды, передаётся уже за два такта:
(0)(0)(1)(DL=0) (x)(x)(x)(x) - строб (ваш пункт 11.1)
(N)(F)(-)(-) (x)(x)(x)(x) - строб (ваш пункт 11.3)
Вот и вся "хитрость". То есть, суть в том, что самая первая команда, по сути, передаётся в 8-битном режиме (с возможным мусором на DB3-DB0), а все остальные дисплей уже будет воспринимать как состоящие из двух полукоманд, с поочерёдно передающимися старшей и младшей тетрадами, с игнорированием состояния на входах DB3-DB0:
1) Команда 00100000 в 8-битном режиме:
DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0, DB3 = X, DB2 = X, DB1 = X, DB0 = x => строб => выбран 4-битный интерфейс.
2) Команда 00100000 в 4-битном режиме:
DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0 => строб => DB7 = 0, DB6 = 0, DB5 = 0, DB4 = 0 => строб => выбран 4-битный интерфейс, режим 1 строка высотой 8px.
3) Команда 00001100 в 4-битном режиме:
DB7 = 0, DB6 = 0, DB5 = 0, DB4 = 0 => строб => DB7 = 1, DB6 = 1, DB5 = 0, DB4 = 0 => строб => включили дисплей, выключили курсор и мигание
4) Команда 00000110 в 4-битном режиме:
DB7 = 0, DB6 = 0, DB5 = 0, DB4 = 0 => строб => DB7 = 0, DB6 = 1, DB5 = 1, DB4 = 0 => режим увеличения адреса, не сдвигаем экран.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
пауза в 200мкс между передачами половинок байта не нужна, регистр в дисплее аппаратный - половинки можно запихивать в него без задержки, это потом после запихивания второй половинки начинается выполнение команды которое требует времени.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Извините что не прочитал тему, возможно ответ в ней уже есть, но я все равно спрошу: WH1602 (2013 год) - дисплей с контроллером HD44780?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
http://yandex.ru/yandsearch?text=wh1602 ... =9582&lr=2 Или банальная лень ?
Всего 2 слова в поисковике, за место многобуковак на форуме... Не поймёшь некоторых людей...
Всего 2 слова в поисковике, за место многобуковак на форуме... Не поймёшь некоторых людей...
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Вы меня не поняли. Я вводил этот дисплей, читал разные даташиты, но в них не было даты их составления. Поэтому появились подозрения, как сказано в Википедии (https://ru.wikipedia.org/wiki/HD44780) "Контроллер HD44780 ... Эти контроллеры были фактически монополистами на рынке в 90-е годы. В настоящее время все активнее вытесняются контроллерами с SPI или I2C интерфейсами, а также контроллерами цветных дисплеев...." У меня дисплей 2013 года, есть подозрения что компания Winstar сменила контроллер. Плюс к этому где-то на форуме я нашел что 1 пользователь после составления программы, в которых была инициализация дисплея, говорил, что дисплей у него с инициализацией показывал черные квадраты из точек, ему посоветовали изменить инициализацию, он изменил, дисплей заработал. Пожалуйста, прочтите код на языке С и подскажите что следует изменить.
- Вложения
-
- ИT11.c
- (3.13 КБ) 286 скачиваний
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Ты этот код впервые видишь? там нет ничего что относится к работе дисплея. Это можно было понять даже не зная языка...
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Спасибо большое - ответ очень развернутый))))!!! Но к сожалению не могу победить это в коде на асме. Пытаюсь промоделировать в протеусе 7.7 sp2. - никак не хочет работать.WiseLord писал(а):Не нужно никаких пунктов, того что дальше - уже достаточно....
Последний раз редактировалось ibiza11 Ср авг 27, 2014 10:47:27, всего редактировалось 1 раз.
Причина: 2.7 Запрещается бездумное вложенное цитирование, цитирование огромных объёмов текста без сокрытия его под спойлер, а так же полное, бессмысленное цитирование предыдущего поста.
Причина: 2.7 Запрещается бездумное вложенное цитирование, цитирование огромных объёмов текста без сокрытия его под спойлер, а так же полное, бессмысленное цитирование предыдущего поста.
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Если кому не сильно затруднительно, посмотрите пожалуйста какие могут быть явные логические ошибки в коде
Как уже только не пробовал проводить инициализацию и вывод символа - в протеусе ни в какую не хочет работать
Как уже только не пробовал проводить инициализацию и вывод символа - в протеусе ни в какую не хочет работать
Спойлер
Код: Выделить всё
;***************************************************************************
;
; ПРОГРАММА "ИНИЦИАЛИЗАЦИЯ И ВЫВОД СИМВОЛА "А" НА ЭКРАН ДВУХСТРОЧНОГО ЖИДКОКРИСТАЛИЧЕСКОГО ДИСПЛЕЯ (LCD)"
;
; НАЗНАЧЕНИЕ ВЫВОДОВ МИКРОКОНТРОЛЛЕРА PIC16F876A
;****************************************************************
;вывод * использование * описание
;****************************************************************
; 1 * RA2 *
; 2 * RA3 *
; 3 * RA4 *
; 4 * MCLR * Сброс
; 5 * Vss * GND
; 6 * RB0 * D7 LCD индикатор
; 7 * RB1 * D6 LCD индикатор
; 8 * RB2 * D5 LCD индикатор
; 9 * RB3 * D4 LCD индикатор
; 10 * RA0 * E LCD индикатор
; 11 * RA1 * RS LCD индикатор
; 12 * RA2 ---- * RW LCD индикатор
; 13 * RB7 *
; 14 * Vdd * +5V
; 15 * OSC2 * Кварц 4 МГц
; 16 * OSC1 * Кварц 4 МГц
; 17 * RA0 *
; 18 * RA1 *
;****************************************************************
;==========
; Конфигурация микроконтроллера
;==========
LIST P=16F876A.INC
#Include <P16F876A.inc>
;#Include <Delay.h>
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _CP_OFF
;E equ .4 ;сигнал Е RA0
;RS equ .1 ;сигнал RS RA1
;RW equ .7 ;сигнал RW RA7
;==========
; Макроопределения
;==========
_BANK_0 macro
BCF STATUS,RP0
BCF STATUS,RP1
endm
_BANK_1 macro
BSF STATUS,RP0
BCF STATUS,RP1
endm
_BANK_2 macro
BCF STATUS,RP0
BSF STATUS,RP1
endm
_BANK_3 macro
BSF STATUS,RP0
BSF STATUS,RP1
endm
;list p = 12f629
; __config 03F30h
;*** Переменные *****************************************
CBLOCK 0x20 ; Начальный адрес блока пользовательской памяти
T_ext ;таймер внешнего цикла
T_int ;таймер внутреннего цикла
T_n ;таймер начальной задержки
M_byte ;байт посылки 7-й бит = DB7, 6-й бит = DB6 и т.д.
ENDC
;**** Константы / Адреса регистров **********************
Cr1 equ .50 ;длительность 1-й задержки 50 циклов
Cr2 equ .25 ;длительность 2-й задержки 25х50 циклов
Cr3 equ .200 ;длительность 3-й задержки 200х50 циклов
;Status equ 03h ; выбор банка
;TrisA equ 05h ; выбор направления работы выводов порта А
;TrisB equ 06h ; выбор направления работы выводов порта В
;PortA equ 05h ; управление защелками порта А
;PortB equ 06h ; управление защелками порта В
;Cmcon equ 1Fh ; вкл/выкл компараторов
;********************************************************
; org 0
;==========
;НАЧАЛО ПРОГРАММЫ 100%
;==========
org 0x0000
goto Start
org 0x0005
;====================
;*** ИНИЦИАЛИЗАЦИИЯ КОНТРОЛЛЕРА НАЗНАЧЕНИЕ ПОРТОВ******** 100%
;====================
Start ;movlw .7
;movwf Cmcon ; выключить компараторы
clrf PORTA ; инициализация защелок порта А
clrf PORTB ; инициализация защелок порта В
bsf STATUS,5 ; Перейти в 1-й банк
movlw .56 ; Записать конфигурацию порта A в аккумулятор.
movwf TRISA ; Скопировать конфигурацию порта А из W в регистр TrisA
movlw .0 ; Записать конфигурацию порта В в аккумулятор.
movwf TRISB ; Скопировать конфигурацию порта B из W в регистр TrisB
bcf STATUS,5 ; Перейти в 0-й банк
;*** ИНИЦИАЛИЗАЦИЯ ЖКИ **********************************
;*** Пауза более 30 мс + FUNCTION SET *******************
movlw b'00100000' ; DB7-4= 0010 4-битный интерф.
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PORTA, 1 ; RS=0
bcf PORTA, 2 ; RW=0
call pause3
call zapis ; передача в ЖКИ
;*** Пауза более 39 мкс *********************************
call pause1
;*** Подтверждение 4-х битного режима *******************
movlw b'0010' ; DB7-4= 0010 4-битный интерф. СТАРШИЙ полубайт
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PORTA, 1 ; RS=0
bcf PORTA, 2 ; RW=0
call pause3
call zapis ; передача в ЖКИ
;*** Пауза более 39 мкс *********************************
call pause1
movlw b'1000' ; DB7-4= 1000 4-битный интерф. МЛАДШИЙ полубайт выбрано 2 строки. 5х7 пикселей
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PORTA, 1 ; RS=0
bcf PORTA, 2 ; RW=0
call pause3
call zapis ; передача в ЖКИ
;*** Пауза более 39 мкс *********************************
call pause1
;***Включаем дисплей, выключаем курсор и мигание*********
movlw b'0000' ; СТАРШИЙ полубайт
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PORTA, 1 ; RS=0
bcf PORTA, 2 ; RW=0
call pause3
call zapis ; передача в ЖКИ
;*** Пауза более 39 мкс *********************************
call pause1
movlw b'1100' ; МЛАДШИЙ полубайт
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PORTA, 1 ; RS=0
bcf PORTA, 2 ; RW=0
call pause3
call zapis ; передача в ЖКИ
;*** Пауза более 39 мкс *********************************
call pause1
;*** Режим увеличения адреса, не сдвигаем экран**********
movlw b'0000' ; СТАРШИЙ полубайт
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PORTA, 1 ; RS=0
bcf PORTA, 2 ; RW=0
call pause3
call zapis ; передача в ЖКИ
;*** Пауза более 39 мкс *********************************
call pause1
movlw b'0110' ; МЛАДШИЙ полубайт
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PORTA, 1 ; RS=0
bcf PORTA, 2 ; RW=0
call pause3
call zapis ; передача в ЖКИ
;*** Пауза более 39 мкс *********************************
call pause1
;*** Продолжение инициализации DISPLAY ON/OFF MODE ******
; movlw .14 ; DB7-0=00001110 - вкл.дисплей,вкл.курсор,выкл.мерцание
; movwf M_byte ; на RS и R/W уже установл. нужные уровни,т.к. с прошлой
; call in_port ; передачи они не изменились - заново их устан-ть не надо
; call zapis ; передача в ЖКИ
;*** Пауза более 39 мкс *********************************
; call pause1
;*** Продолжение инициализации DISPLAY CLEAR ************
movlw b'0000' ; СТАРШИЙ полубайт
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PORTA, 1 ; RS=0
bcf PORTA, 2 ; RW=0
call pause3
call zapis ; передача в ЖКИ
movlw b'0001' ; МЛАДШИЙ полубайт
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PORTA, 1 ; RS=0
bcf PORTA, 2 ; RW=0
call pause3
call zapis ; передача в ЖКИ
;*** Продолжение инициализации DISPLAY CLEAR ************
; movlw .1 ; DB7...DB0=00000001
; movwf M_byte ; записать это значение в байт сообщения
; call in_port ; запись в порт
; call zapis ; передача в ЖКИ
;*** Пауза более 1,53 мс ********************************
; call pause2
;*** Продолжение инициализации ENTRY MODE SET ***********
; movlw .6 ; DB7-0=00000110 - автосдв. курсора вправо,сдв.диспл.выкл.
; movwf M_byte ; записать это значение в байт сообщения
; call in_port ; запись в порт
; call zapis ; передача в ЖКИ
;*** Пауза более 39 мкс *********************************
; call pause1
;*** Инициализация дисплея закончена ******************
;=====================
;*** ВЫВОД СИМВОЛА "А" С АДРЕСОМ 0100 0001**************** 100%
;=====================
;*** Set DDRAM ADDRESS 1000 0011 (4-я позиция первой строки ЖКИ)
bcf PORTA, 1 ; RS=0
bcf PORTA, 2 ; R/W=0
movlw .8 ; 1000 - старший полубайт
movwf M_byte
call in_port
call zapis
movlw .3 ; 0011 - младший полубайт
movwf M_byte
call in_port
call zapis
;*** Пауза >39 мкс ***
call pause1
;*** Вывод символа (для записи в RAM надо установить RS=1, R/W=0)
;*** Пишем символ под номером "А" (0100 0001)
bsf PORTA,1 ; RS=1, R/W уже сброшен в 0, его не трогаем
movlw .4 ; 0100
movwf M_byte
call in_port
call zapis
movlw .1 ; 0001
movwf M_byte
call in_port
call zapis
;*** Пауза >43 мкс ***
call pause1
stop
nop
goto stop
;=====================
;*** ПРОЦЕДУРЫ ******************************************
;=====================
;*** Процедура записи в LCD ***************************** 100%
;=====================
zapis bsf PORTA,0 ; E=1 - запись
nop ; 1 мкс - пауза для записи
nop ; 1 мкс - пауза для записи
bcf PORTA,0 ; E=0 - выключить запись
return
;=====================
;*** Процедура Паузы 1 (>39 мкс) ************************ 100%
;=====================
pause1
movlw Cr1
movwf T_int ; загрузить значение таймера для паузы в T_int
cikl1 nop
nop
nop
nop
nop
nop
decfsz T_int,1
goto cikl1
return
;=====================
;*** Процедура Паузы 2 (>1.53 мс) *********************** 100%
;=====================
pause2
movlw Cr2
movwf T_ext ; загрузить значение для внешнего цикла
cikl2 movlw Cr1
movwf T_int ; загрузить значение для внутреннего цикла
cikl3 decfsz T_int,1
goto cikl3 ; внутренний цикл
decfsz T_ext,1
goto cikl2 ; внешний цикл
return
;=====================
;*** Процедура Паузы 3 (>30 мс) ************************* 100%
;=====================
pause3
movlw Cr3
movwf T_n ; загрузить значение для внешнего цикла
cikl4 movlw Cr1
movwf T_int ; загрузить значение для внутреннего цикла
cikl5 nop
decfsz T_int,1
goto cikl5 ; внутренний цикл
decfsz T_n,1
goto cikl4 ; внешний цикл
return
;=====================
;*** Процедура записи байта сообщения в защелки портов ** 100%
;=====================
in_port
btfsc M_byte,7 ; если 7-й бит посылки = 0, - следующ. команда пропуск-ся
bsf PORTB,0 ; DB7=1
btfss M_byte,7 ; если 7-й бит посылки =1, - следующ. команда пропуск-ся
bcf PORTB,0 ; DB7=0
;------------------------------------
btfsc M_byte,6 ; если 6-й бит посылки = 0, - следующ. команда пропуск-ся
bsf PORTB,1 ; DB6=1
btfss M_byte,6 ; если 6-й бит посылки =1, - следующ. команда пропуск-ся
bcf PORTB,1 ; DB6=0
;------------------------------------
btfsc M_byte,5 ; если 5-й бит посылки = 0, - следующ. команда пропуск-ся
bsf PORTB,2 ; DB5=1
btfss M_byte,5 ; если 5-й бит посылки =1, - следующ. команда пропуск-ся
bcf PORTB,2 ; DB5=0
;------------------------------------
btfsc M_byte,4 ; если 4-й бит посылки = 0, - следующ. команда пропуск-ся
bsf PORTB,3 ; DB4=1
btfss M_byte,4 ; если 4-й бит посылки =1, - следующ. команда пропуск-ся
bcf PORTB,3 ; DB4=0
;------------------------------------
btfsc M_byte,3 ; если 3-й бит посылки = 0, - следующ. команда пропуск-ся
bsf PORTB,3 ; DB3=1
btfss M_byte,3 ; если 3-й бит посылки =1, - следующ. команда пропуск-ся
bcf PORTB,3 ; DB3=0
;-----------------------------------
btfsc M_byte,2 ; если 2-й бит посылки = 0, - следующ. команда пропуск-ся
bsf PORTB,7 ; DB2=1
btfss M_byte,2 ; если 2-й бит посылки =1, - следующ. команда пропуск-ся
bcf PORTB,7 ; DB2=0
;------------------------------------
btfsc M_byte,1 ; если 1-й бит посылки = 0, - следующ. команда пропуск-ся
bsf PORTA,2 ; DB1=1
btfss M_byte,1 ; если 1-й бит посылки =1, - следующ. команда пропуск-ся
bcf PORTA,2 ; DB1=0
;------------------------------------
btfsc M_byte,0 ; если 0-й бит посылки = 0, - следующ. команда пропуск-ся
bsf PORTA,1 ; DB0=1
btfss M_byte,0 ; если 0-й бит посылки =1, - следующ. команда пропуск-ся
bcf PORTA,1 ; DB0=0
;------------------------------------
return
end
Последний раз редактировалось ibiza11 Ср авг 27, 2014 10:50:19, всего редактировалось 1 раз.
Причина: 2.5 Длинные тексты и рисунки следует оформлять в виде приложения к ответу. Длинные тексты необходимо убирать под спойлер, тег - [spoiler] Код обрамляется тегами [code].
Причина: 2.5 Длинные тексты и рисунки следует оформлять в виде приложения к ответу. Длинные тексты необходимо убирать под спойлер, тег - [spoiler] Код обрамляется тегами [code].
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
1 - одновременно на экране более 8 пользовательских символов быть не может?
2 - как вывести вертикальный прогресс бар?
2 - как вывести вертикальный прогресс бар?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
1. Нет, не может.
2. Нарисовать его пользовательскими символами
2. Нарисовать его пользовательскими символами
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
кэ(п)т
так я к чему и веду, есть к примеру массив
flash byte char0[48]={
0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000,
};
2 символа сохранили. Дисплей 4 строки, того 32 варианта (33 если с нулем).
Поимели int pointa; в котором болтается число 0-32.
рисуем второй массив где болтаются номера символов в знакогенераторе
flash byte digtable[9]={
{0},//0
{111},//1 (если не ошибаюсь)
{1},//2
{2},//3
{3},//4
{4},//5
{5},//6
{6},//7
{255},//8
};
вопрос как это все теперь опрелить в столбик
? как вариант перевести pointa в 8х систему. получится красиво 40. А дальше?
так я к чему и веду, есть к примеру массив
flash byte char0[48]={
0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000,
};
2 символа сохранили. Дисплей 4 строки, того 32 варианта (33 если с нулем).
Поимели int pointa; в котором болтается число 0-32.
рисуем второй массив где болтаются номера символов в знакогенераторе
flash byte digtable[9]={
{0},//0
{111},//1 (если не ошибаюсь)
{1},//2
{2},//3
{3},//4
{4},//5
{5},//6
{6},//7
{255},//8
};
вопрос как это все теперь опрелить в столбик
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
А где ещё 2 строки ?levaclaus писал(а):есть к примеру массив
flash byte char0[48]={
0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000,
};
Не стоит жалеть 16 байт флеша, наживая себе геморрой с вычислениями и выдирая уже имеющиеся символы
Код: Выделить всё
flash byte char0[8][8]={
0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000,
};
flash byte char1[8]={0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
Вот и вся математика
PS: char1 уже можно заменить на имеющийся в дисплее символ. В итоге, на дисплее имеем максимум 1 свой символ, ещё 7 в запасе
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Тогда что-то типо этого, только не на трасянке
Ход мысли верен?
Ход мысли верен?
Код: Выделить всё
flash byte char0[8][8]={
0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000,
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000,
};
flash byte digtable[8]={
{0},//0
{111},//1 (если не ошибаюсь)
{1},//2
{2},//3
{3},//4
{4},//5
{5},//6
{6},//7
};
(0;0);
если целое от pointa/8 >3,
то символ = 255
если целое от pointa/8 =3,
то символ = остаток от pointa%8,
если целое от pointa/8 <3,
то символ = 0
путчар(символ)
(0;1)
если целое от point/8 >2,
то символ = 255
если целое от pointa/8 =2,
то символ = остаток от pointa%8,
если целое от pointa/8 <2,
то символ = 0
(0;2)
если целое от pointa/8 >1,
то символ = 255
если целое от pointa/8 =1,
то символ = остаток от pointa%8,
если целое от pointa/8 <1
то символ = 0
(0;3)
если целое от pointa/8 <1
то символ = pointa,
иначе символ = 255

