Ах, вы про это... да просто подчищают биты, чтобы потом на них положить нужные данные командой OR. Ведь если там будет мусор, а он там стопудов будет от предыдущих манипуляций, то данные просто исказятся. Вообще, код пишут кто как может, поэтому могут встречаться и перлы и хаки... по хорошему так делать нельзя - надо сначала наложить маску на переменную, потом наложить туда данные и только потом это вывести в порт. То как это сделано здесь -съекономили одну ячейку памяти но порт будет постоянно дрыгать внешней ножкой - к примеру там была 1 и надо установить тоже 1 в предоставленном алгоритме порт мы сначала очистим - ножка пойдет в ноль, а потом выставим состояние "1" - ножка пойдет в +5В.
Спасибо! Да, именно об этом))). Теперь примерно понятен алгоритм вывода тетрады в порт - наложить маску на переменную, затем данные, потом выводим в порт. Буду писать свой код исходя из этого алгоритма. Дело в том, что приведенный код мне показался более менее понятным в сравнении с остальными, поэтому копался в нем
Возник еще такой вопрос: мы отправляем сначала один полубайт (старший), затем второй (младший). ЖКД сначала первые переданные ему 4 бита воспринимает как старшие, а вторые - как младшие? Или же перед отправкой мы сообщаем жкд, что вот тебе пошел старший полубайт, а вот к тебе пошел младший? ну или же как? Подскажите пожалуйста)))
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
отображает только по 8 символов в каждой строке дальше непонятные потемнения... два LCD отображают только половину, до этого пару дней назад все ок... Фото0093.jpg
Подчеркнул то, которое как бы намекает.
Если оба "плохих" дисплея показывают одинаковые краказябры - о чём вопрос? Ищем краказябры в таблице "прошитых" символов, не находим, вспоминаем про "пользовательские" символы.
Если краказябры на разных дисплеях разные, но/и частично совпадают с тем символом, который пытаемся вывести - тогда это резинка между стеклом и платой. Можно разобрать, собрать, повторить, выбросить. Задача на везение.
А цифра 8 она очень такая характерная цифра, более того - она "круглая". В двоичном смысле. И вот именно ровно по 8 знакомест сдохло на каждом из двух дисплеев... а остальные ровно 8 работают идеально... на обоих экземплярах... одинаково и ровно по 8 знакомест...
Именно так, орн сам ведет подсчет когда идет старший когда младший. Сбрасывается этот счетчик по сигналу выбора индикатора.
Благодарю. Сегодня ,наконец то, дописал код вывода на информационные выводы адреса символа (где и в какой он строке мне нужен) и код самого символа. Хочу для начала вывести один символ на жкд.
Как мне правильно "объяснить" контроллеру, что ты, мол, возьми только 4 старшие бита для инициализации DB7 = 0, DB6 = 0, DB5 = 1, DB4 = 0 и все, остальные не трогай . Ведь если я напишу b'0010', то мк воспримет эту запись как 0000 0010. Как мне дать понять, что использовать только 4 бита и что они именно старшие?
Не нужно никаких пунктов, того что дальше - уже достаточно.
Смотрите. Для установки режима дисплея в него нужно каким-то образом передать команду (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 => режим увеличения адреса, не сдвигаем экран.
пауза в 200мкс между передачами половинок байта не нужна, регистр в дисплее аппаратный - половинки можно запихивать в него без задержки, это потом после запихивания второй половинки начинается выполнение команды которое требует времени.
Вы меня не поняли. Я вводил этот дисплей, читал разные даташиты, но в них не было даты их составления. Поэтому появились подозрения, как сказано в Википедии (https://ru.wikipedia.org/wiki/HD44780) "Контроллер HD44780 ... Эти контроллеры были фактически монополистами на рынке в 90-е годы. В настоящее время все активнее вытесняются контроллерами с SPI или I2C интерфейсами, а также контроллерами цветных дисплеев...." У меня дисплей 2013 года, есть подозрения что компания Winstar сменила контроллер. Плюс к этому где-то на форуме я нашел что 1 пользователь после составления программы, в которых была инициализация дисплея, говорил, что дисплей у него с инициализацией показывал черные квадраты из точек, ему посоветовали изменить инициализацию, он изменил, дисплей заработал. Пожалуйста, прочтите код на языке С и подскажите что следует изменить.
Не нужно никаких пунктов, того что дальше - уже достаточно....
Спасибо большое - ответ очень развернутый))))!!! Но к сожалению не могу победить это в коде на асме. Пытаюсь промоделировать в протеусе 7.7 sp2. - никак не хочет работать.
Последний раз редактировалось ibiza11 Ср авг 27, 2014 10:47:27, всего редактировалось 1 раз.
2.7 Запрещается бездумное вложенное цитирование, цитирование огромных объёмов текста без сокрытия его под спойлер, а так же полное, бессмысленное цитирование предыдущего поста.
Если кому не сильно затруднительно, посмотрите пожалуйста какие могут быть явные логические ошибки в коде Как уже только не пробовал проводить инициализацию и вывод символа - в протеусе ни в какую не хочет работать
Спойлер
Код:
;*************************************************************************** ; ; ПРОГРАММА "ИНИЦИАЛИЗАЦИЯ И ВЫВОД СИМВОЛА "А" НА ЭКРАН ДВУХСТРОЧНОГО ЖИДКОКРИСТАЛИЧЕСКОГО ДИСПЛЕЯ (LCD)" ;
;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 ;*** Инициализация дисплея закончена ******************
;===================== ;*** Процедура Паузы 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].
Ну а дальше математика. Делим число, которое болтается в переменной, на 8. Целое от деления - кол-во полностью заполненных столбиков (*char1), остаток - строка из массива ( *char0[x] ) - он же символ для следующего (выше) знакоместа. Все последующие выше - пустые. Вот и вся математика
PS: char1 уже можно заменить на имеющийся в дисплее символ. В итоге, на дисплее имеем максимум 1 свой символ, ещё 7 в запасе
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения