Работа с ЖКИ на контроллере HD44780 и его аналогах

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Alexeyslav »

Ах, вы про это... да просто подчищают биты, чтобы потом на них положить нужные данные командой OR. Ведь если там будет мусор, а он там стопудов будет от предыдущих манипуляций, то данные просто исказятся.
Вообще, код пишут кто как может, поэтому могут встречаться и перлы и хаки... по хорошему так делать нельзя - надо сначала наложить маску на переменную, потом наложить туда данные и только потом это вывести в порт. То как это сделано здесь -съекономили одну ячейку памяти но порт будет постоянно дрыгать внешней ножкой - к примеру там была 1 и надо установить тоже 1 в предоставленном алгоритме порт мы сначала очистим - ножка пойдет в ноль, а потом выставим состояние "1" - ножка пойдет в +5В.
Serhio
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Serhio »

Спасибо! :) Да, именно об этом))). Теперь примерно понятен алгоритм вывода тетрады в порт - наложить маску на переменную, затем данные, потом выводим в порт. Буду писать свой код исходя из этого алгоритма. Дело в том, что приведенный код мне показался более менее понятным в сравнении с остальными, поэтому копался в нем :)
Serhio
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Serhio »

Возник еще такой вопрос: мы отправляем сначала один полубайт (старший), затем второй (младший). ЖКД сначала первые переданные ему 4 бита воспринимает как старшие, а вторые - как младшие? Или же перед отправкой мы сообщаем жкд, что вот тебе пошел старший полубайт, а вот к тебе пошел младший? :facepalm: ну или же как? Подскажите пожалуйста)))
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Alexeyslav »

Именно так, орн сам ведет подсчет когда идет старший когда младший. Сбрасывается этот счетчик по сигналу выбора индикатора.
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение nirq »

sklw35 писал(а):отображает только по 8 символов в каждой строке дальше непонятные потемнения... два LCD отображают только половину, до этого пару дней назад все ок... Фото0093.jpg
Подчеркнул то, которое как бы намекает.

Если оба "плохих" дисплея показывают одинаковые краказябры - о чём вопрос?
Ищем краказябры в таблице "прошитых" символов, не находим, вспоминаем про "пользовательские" символы.

Если краказябры на разных дисплеях разные, но/и частично совпадают с тем символом, который пытаемся вывести - тогда это резинка между стеклом и платой.
Можно разобрать, собрать, повторить, выбросить. Задача на везение.

А цифра 8 она очень такая характерная цифра, более того - она "круглая". В двоичном смысле.
И вот именно ровно по 8 знакомест сдохло на каждом из двух дисплеев... а остальные ровно 8 работают идеально... на обоих экземплярах... одинаково и ровно по 8 знакомест...
Serhio
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Serhio »

Alexeyslav писал(а):Именно так, орн сам ведет подсчет когда идет старший когда младший. Сбрасывается этот счетчик по сигналу выбора индикатора.


Благодарю. Сегодня ,наконец то, дописал код вывода на информационные выводы адреса символа (где и в какой он строке мне нужен) и код самого символа. Хочу для начала вывести один символ на жкд.
Serhio
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Serhio »

Подскажите пожалуйста, не могу разобраться до конца с инициализацией ЖКИ. Действую по следующему алгоритму:

В случае использования 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 бита и что они именно старшие?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение WiseLord »

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 и его аналогах

Сообщение Alexeyslav »

пауза в 200мкс между передачами половинок байта не нужна, регистр в дисплее аппаратный - половинки можно запихивать в него без задержки, это потом после запихивания второй половинки начинается выполнение команды которое требует времени.
Аватара пользователя
Михаил919
Родился
Сообщения: 19
Зарегистрирован: Вс дек 01, 2013 12:18:11

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Михаил919 »

Извините что не прочитал тему, возможно ответ в ней уже есть, но я все равно спрошу: WH1602 (2013 год) - дисплей с контроллером HD44780?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Аlex »

http://yandex.ru/yandsearch?text=wh1602 ... =9582&lr=2 Или банальная лень ?
Всего 2 слова в поисковике, за место многобуковак на форуме... Не поймёшь некоторых людей... :dont_know:
Аватара пользователя
Михаил919
Родился
Сообщения: 19
Зарегистрирован: Вс дек 01, 2013 12:18:11

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Михаил919 »

Вы меня не поняли. Я вводил этот дисплей, читал разные даташиты, но в них не было даты их составления. Поэтому появились подозрения, как сказано в Википедии (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 и его аналогах

Сообщение Alexeyslav »

Ты этот код впервые видишь? там нет ничего что относится к работе дисплея. Это можно было понять даже не зная языка...
Serhio
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Serhio »

WiseLord писал(а):Не нужно никаких пунктов, того что дальше - уже достаточно....
Спасибо большое - ответ очень развернутый))))!!! Но к сожалению не могу победить это в коде на асме. Пытаюсь промоделировать в протеусе 7.7 sp2. - никак не хочет работать.
Последний раз редактировалось ibiza11 Ср авг 27, 2014 10:47:27, всего редактировалось 1 раз.
Причина: 2.7 Запрещается бездумное вложенное цитирование, цитирование огромных объёмов текста без сокрытия его под спойлер, а так же полное, бессмысленное цитирование предыдущего поста.
Serhio
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Serhio »

Если кому не сильно затруднительно, посмотрите пожалуйста какие могут быть явные логические ошибки в коде :(
Как уже только не пробовал проводить инициализацию и вывод символа - в протеусе ни в какую не хочет работать


Спойлер

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

;***************************************************************************
;
;   ПРОГРАММА "ИНИЦИАЛИЗАЦИЯ И ВЫВОД СИМВОЛА "А" НА ЭКРАН ДВУХСТРОЧНОГО ЖИДКОКРИСТАЛИЧЕСКОГО ДИСПЛЕЯ (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].
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение levaclaus »

1 - одновременно на экране более 8 пользовательских символов быть не может?

2 - как вывести вертикальный прогресс бар?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Аlex »

1. Нет, не может.
2. Нарисовать его пользовательскими символами :)
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение levaclaus »

кэ(п)т :roll:

так я к чему и веду, есть к примеру массив

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. А дальше?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение Аlex »

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,
};

А где ещё 2 строки ? :)
Не стоит жалеть 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};

Ну а дальше математика. Делим число, которое болтается в переменной, на 8. Целое от деления - кол-во полностью заполненных столбиков (*char1), остаток - строка из массива ( *char0[x] ) - он же символ для следующего (выше) знакоместа. Все последующие выше - пустые.
Вот и вся математика :))

PS: char1 уже можно заменить на имеющийся в дисплее символ. В итоге, на дисплее имеем максимум 1 свой символ, ещё 7 в запасе :)
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Re: Работа с ЖКИ на контроллере HD44780 и его аналогах

Сообщение levaclaus »

Тогда что-то типо этого, только не на трасянке :)))
Ход мысли верен?

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

 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
Ответить

Вернуться в «Периферия»