Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 31.08.2011, 12:51   #1
Noelchuvak
Junior Member
 
Аватар для Noelchuvak
 
Регистрация: 31.08.2011
Адрес: Россия, Ставрополь
Возраст: 31
Сообщений: 7
Вес репутации: 100/0
Noelchuvak will become famous soon enoughNoelchuvak will become famous soon enough
Отправить сообщение для Noelchuvak с помощью ICQ
Question Переделка asm кода ЖКИ с 8 бит на 4 бита

Доброго времени суток.

Я начинающий в микроконтроллерах, поэтому прошу не судить строго и не пинать сильно)).3анимаюсь пока только пиками, на ассемблере.Слепил программатор.Пока сталкивался только с 16F84A,16F876A,16F877A. Мучаю программы в MPLAB IDE 7, потом проверяю в Proteus 7.6. но пока мои познания еще очень малы. АЦП,ШИМ, ЕЕПРОМ,ЮАРТ и другие прелести жизни пока мне не подвластны, но моргать светодиодами от кнопочек я уже умею
Хочу научиться выводить символы на ЖКИ HD47780 16х2 (Winstar WH1602 серия).Нашел прогу на 16F628A написана для 8-битного интерфейса.Выводит на ЖКИ буковку "R" по адресу 03h. Я ее вроде даже понял и разобрался куда и чего, поигрался, стал менять позиции символов, и сами символы. Вот рабочий код программы, полученный НЕХ
был вшит в контроллер в среде Proteus и все работало (E-RA0, RS-RA1, R/W-RA7, DB7-RB4, DB6-RB5, DB5-RB2, DB4-RB6, DB3-RB3, DB2-RB7, DB1-RA2, DB0-RA6):
list p = 16f628a
__config 03F30h ; 11111100110001 - защиты памяти нет, низковольтное программирование запрещено, сброс по питанию запрещен,
; RA5/-MCLR работает как -MCLR, таймер вкл-я питания включен, сторожевой таймер - выключен, генератор - внутренний
;********* Переменные ************************************
CBLOCK 0x20 ;Начальный адрес блока констант
T_ext ;таймер внешнего цикла
T_int ;таймер внутреннего цикла
T_n ;таймер начальной задержки
M_byte ;байт посылки
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
;******** ИНИЦИАЛИЗАЦИИЯ КОНТРОЛЛЕРА ************************************************** ******
;******** Установка направления работы порта A: RA7, RA6 - выходы, RA5, RA4, RA3 - входы, RA2, RA1, RA0 - выходы
;******** Установка направления работы порта B: RB7, RB6, RB5, RB4, RB3, RB2 - выходы, RB1, RB0 - входы ***
start movlw .7 ;
movwf Cmcon ; выключить компараторы и включить эти пины как цифровые входы/выходы
clrf PortA ; инициализация защелок порта А
clrf PortB ; инициализация защелок порта В
bsf Status,5 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status).
movlw .56 ; Записать конфигурацию порта A в аккумулятор (W). .56=00111000
movwf TrisA ; Скопировать конфигурацию порта А из W в регистр TrisA
movlw .3 ; Записать конфигурацию порта В в аккумулятор (W). .3=00000011
movwf TrisB ; Скопировать конфигурацию порта B из W в регистр TrisB.
bcf Status,5 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status).
;******** ИНИЦИАЛИЗАЦИЯ ЖКИ ************************************************** *************************
;******** Пауза более 30 мс + FUNCTION SET ************************************************** ************
movlw .56 ; DB7...DB0=00111000
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PortA, 1 ; RS=0
bcf PortA, 7 ; RW=0
call pause3
call zapis ;
;******** Пауза более 39 мкс ************************************************** ***************************
call pause1
;******** Продолжение инициализации DISPLAY ON/OFF MODE **************************************************
movlw .14 ; DB7...DB0=00001110
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
call zapis ;
;******** Пауза более 39 мкс ************************************************** ***************************
call pause1
;******** Продолжение инициализации 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...DB0=00000110
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
call zapis ;
;******** Пауза более 39 мкс ************************************************** ***************************
call pause1
;******** Инициализация дисплея закончена ************************************************** **************
;******** Вывод информации ************************************************** *****************************
;******** Set DDRAM ADDRESS ************************************************** ****************************
movlw .131 ; db7=1, address=03h
movwf M_byte
call in_port
call zapis
call pause1
;******** Вывод символа ************************************************** *******************************
movlw .82 ; symbol="R"
movwf M_byte
call in_port
bsf PortA,1 ; RS=1
call zapis
call pause1

;************************************************* ************************************************** ****
stop nop
goto stop
;
;
;******** Процедура записи в LCD ************************************************** ***********************
zapis bsf PortA, 0 ; E=1 - запись
nop ; 1 мкс - пауза для записи
nop ; 1 мкс - пауза для записи
bcf PortA,0 ; E=0 - выключить запись
return
;******** Процедура Паузы 1 (39 мкс) ************************************************** *******************
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 мс) ************************************************** ******************
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 мс) ************************************************** ******************
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
;******** Процедура записи байта сообщения в защелки портов *********************************************
in_port btfsc M_byte,7 ; если 7-й бит посылки = 0, то следующая команда пропускается
bsf PortB,4 ; DB7=1
btfss M_byte,7 ; если 7-й бит посылки =1, то следующая команда пропускается
bcf PortB,4 ; DB7=0
;------------------------------------
btfsc M_byte,6 ; если 6-й бит посылки = 0, то следующая команда пропускается
bsf PortB,5 ; DB6=1
btfss M_byte,6 ; если 6-й бит посылки =1, то следующая команда пропускается
bcf PortB,5 ; 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,6 ; DB4=1
btfss M_byte,4 ; если 4-й бит посылки =1, то следующая команда пропускается
bcf PortB,6 ; 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,6 ; DB0=1
btfss M_byte,0 ; если 0-й бит посылки =1, то следующая команда пропускается
bcf PortA,6 ; DB0=0
;------------------------------------
return
;************************************************* **********************************************
end
Но при переделке для 4-битного интерфейса ничего не работает. Насколько мне известно там разница с восьмибитным только в том что, для четырехбитного интерфейса при передаче первой команды инициализации "FUNCTION SET" надо сначала два раза передать старший полубайт, а потом младший полубайт.
Например для инициализации четырехбитного интерфейса, двухстрочного ЖКИ, размер символа 5х8 (0010 1000):
movlw .2 ; DB7...DB4= 0010 - старший полубайт
movwf M_byte ; записать это значение в переменную для передачи
call in_port ; процедура, которая устанавливает уровни на выходах МК, подключенных к линиям DB7..DB4 в соответствии
; со значениями, записанными в M_byte
bcf PortA, 1 ; RS=0
bcf PortA, 7 ; RW=0
call zapis ; передача в ЖКИ
call zapis ; передаем старший полубайт второй раз
movlw .8 ; DB7...DB4=1000 - младший полубайт
movwf M_byte ; записать это значение в переменную для передачи
call in_port ; процедура, которая устанавливает уровни на выходах МК, подключенных к линиям DB7..DB4 в соответствии

; со значениями, записанными в M_byte

call zapis ; выставляем E=1 на 2мкс (передача в ЖКИ)


А вот код переделанный для 4-битного интерфейса (E-RA0, RS-RA1, R/W-RA7, DB7-RB4, DB6-RB5, DB5-RB2, DB4-RB6):
list p = 16f628a
__config 03F30h ; 11111100110001 - защиты памяти нет, низковольтное программирование запрещено, сброс по питанию запрещен,
; RA5/-MCLR работает как -MCLR, таймер вкл-я питания включен, сторожевой таймер - выключен, генератор - внутренний
;********* Переменные ************************************
CBLOCK 0x20 ;Начальный адрес блока констант
T_ext ;таймер внешнего цикла
T_int ;таймер внутреннего цикла
T_n ;таймер начальной задержки
M_byte ;байт посылки
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
;******** ИНИЦИАЛИЗАЦИИЯ КОНТРОЛЛЕРА ************************************************** ******
;******** Установка направления работы порта A: RA7, RA6 - выходы, RA5, RA4, RA3 - входы, RA2, RA1, RA0 - выходы
;******** Установка направления работы порта B: RB7, RB6, RB5, RB4, RB3, RB2 - выходы, RB1, RB0 - входы ***
start movlw .7 ;
movwf Cmcon ; выключить компараторы и включить эти пины как цифровые входы/выходы
clrf PortA ; инициализация защелок порта А
clrf PortB ; инициализация защелок порта В
bsf Status,5 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status).
movlw .56 ; Записать конфигурацию порта A в аккумулятор (W). .56=00111000
movwf TrisA ; Скопировать конфигурацию порта А из W в регистр TrisA
movlw .139 ; Записать конфигурацию порта В в аккумулятор (W). .139=10001011
movwf TrisB ; Скопировать конфигурацию порта B из W в регистр TrisB.
bcf Status,5 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status).
;******** ИНИЦИАЛИЗАЦИЯ ЖКИ ************************************************** *************************
;******** Пауза более 30 мс + FUNCTION SET ************************************************** ************
movlw .3 ; DB7...DB4= 0011 - старший полубайт
movwf M_byte ; записать это значение в переменную для передачи
call in_port ; процедура, которая устанавливает уровни на выходах МК, подключенных к линиям DB7..DB4 в соответствии
; со значениями, записанными в M_byte
bcf PortA, 1 ; RS=0
bcf PortA, 7 ; RW=0
call zapis ; передача в ЖКИ
call zapis ; передаем старший полубайт второй раз
movlw .8 ; DB7...DB4=1000 - младший полубайт
movwf M_byte ; записать это значение в переменную для передачи
call in_port ; процедура, которая устанавливает уровни на выходах МК, подключенных к линиям DB7..DB4 в соответствии
; со значениями, записанными в M_byte
call zapis ; выставляем E=1 на 2мкс (передача в ЖКИ)
call zapis
;******** Пауза более 39 мкс ************************************************** ***************************
call pause1
;******** Продолжение инициализации DISPLAY ON/OFF MODE **************************************************
movlw .0 ; DB7...DB4=0000 major byte
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PortA, 1 ; RS=0
bcf PortA, 7 ; RW=0
call zapis ;
movlw .14 ;DB3-DB0 = 1110 minor byte
movwf M_byte
call in_port
call zapis
;******** Пауза более 39 мкс ************************************************** ***************************
call pause1
;******** Продолжение инициализации DISPLAY CLEAR ************************************************** ******
movlw .0 ; DB7...DB4=0000 major byte
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PortA, 1 ; RS=0
bcf PortA, 7 ; RW=0
call zapis ;
movlw .1 ;DB3-DB0=0001 minor byte
movwf M_byte
call in_port
call zapis
;******** Пауза более 1,53 мс ************************************************** **************************
call pause2
;******** Продолжение инициализации ENTRY MODE SET ************************************************** *****
movlw .0 ; DB7...DB0=00000110
movwf M_byte ; записать это значение в байт сообщения
call in_port ; запись в порт
bcf PortA, 1 ; RS=0
bcf PortA, 7 ; RW=0
call zapis
movlw .6
movwf M_byte
call in_port
call zapis ;
;******** Пауза более 39 мкс ************************************************** ***************************
call pause1
;******** Инициализация дисплея закончена ************************************************** **************
;******** Вывод информации ************************************************** *****************************
;******** Set DDRAM ADDRESS ************************************************** ****************************
movlw .8 ; db7=1, address=01h (.129=1000_0001)
movwf M_byte
call in_port
bcf PortA, 1 ; RS=0
bcf PortA, 7 ; RW=0
call zapis
movlw .1
movwf M_byte
call in_port
call zapis
call pause1
;******** Вывод символа ************************************************** *******************************
movlw .4 ; symbol="F" .70=0100_0110
movwf M_byte
call in_port
bcf PortA, 1 ; RS=0
bcf PortA, 7 ; RW=0
call zapis
movlw .6
movwf M_byte
call in_port
call zapis
bsf PortA,1 ; RS=1
call zapis
call pause1

;************************************************* ************************************************** ******
stop nop
goto stop
;
;
;******** Процедура записи в LCD ************************************************** ***********************
zapis bsf PortA, 0 ; E=1 - запись
nop ; 1 мкс - пауза для записи
nop ; 1 мкс - пауза для записи
bcf PortA,0 ; E=0 - выключить запись
return
;******** Процедура Паузы 1 (39 мкс) ************************************************** *******************
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 мс) ************************************************** ******************
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 мс) ************************************************** ******************
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
;******** Процедура записи байта сообщения в защелки портов *********************************************
in_port btfsc M_byte,7 ; если 7-й бит посылки = 0, то следующая команда пропускается
bsf PortB,4 ; DB7=1
btfss M_byte,7 ; если 7-й бит посылки =1, то следующая команда пропускается
bcf PortB,4 ; DB7=0
;------------------------------------
btfsc M_byte,6 ; если 6-й бит посылки = 0, то следующая команда пропускается
bsf PortB,5 ; DB6=1
btfss M_byte,6 ; если 6-й бит посылки =1, то следующая команда пропускается
bcf PortB,5 ; 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,6 ; DB4=1
btfss M_byte,4 ; если 4-й бит посылки =1, то следующая команда пропускается
bcf PortB,6 ; DB4=0

;------------------------------------
return
;************************************************* **********************************************
end
так вот собстенно вопрос:
В чем я накосячил, и что сделал не так?
Noelchuvak вне форума   Ответить с цитированием
Старый 31.08.2011, 13:04   #2
Industrialniy
Senior Member
 
Аватар для Industrialniy
 
Регистрация: 17.10.2007
Адрес: sdelal.net
Возраст: 38
Сообщений: 418
Вес репутации: 226/53
Industrialniy has a spectacular aura aboutIndustrialniy has a spectacular aura aboutIndustrialniy has a spectacular aura about
Отправить сообщение для Industrialniy с помощью ICQ
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Выводы DB0...DB3 нужно оставить в воздухе.
Industrialniy вне форума   Ответить с цитированием
Старый 31.08.2011, 13:10   #3
Noelchuvak
Junior Member
 
Аватар для Noelchuvak
 
Регистрация: 31.08.2011
Адрес: Россия, Ставрополь
Возраст: 31
Сообщений: 7
Вес репутации: 100/0
Noelchuvak will become famous soon enoughNoelchuvak will become famous soon enough
Отправить сообщение для Noelchuvak с помощью ICQ
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Цитата:
Сообщение от Industrialniy Посмотреть сообщение
Выводы DB0...DB3 нужно оставить в воздухе.
а у меня они были повешены на GND(по аналогии с традиционной цифровой схемотехникой). можно пояснить чем это поможет, пожалуйста?
Noelchuvak вне форума   Ответить с цитированием
Старый 31.08.2011, 13:13   #4
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,411
Вес репутации: 2524/84
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Цитата:
Сообщение от Industrialniy Посмотреть сообщение
Выводы DB0...DB3 нужно оставить в воздухе.
Не всегда так происходит, но бывает, что вывод висящий в воздухе воспринимается контроллером дисплея как 1 и его нет возможности перевести в 4 битный режим. Это редкость, но на такие грабли уже наступал. По-этому желательно висящие в воздух подтянуть к земле через резистор.
Рак вне форума   Ответить с цитированием
Старый 31.08.2011, 13:26   #5
Noelchuvak
Junior Member
 
Аватар для Noelchuvak
 
Регистрация: 31.08.2011
Адрес: Россия, Ставрополь
Возраст: 31
Сообщений: 7
Вес репутации: 100/0
Noelchuvak will become famous soon enoughNoelchuvak will become famous soon enough
Отправить сообщение для Noelchuvak с помощью ICQ
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Товарищи, а как насчет самой программы. дело ведь в ней,уже несколько дней бьюсь над этим
Noelchuvak вне форума   Ответить с цитированием
Старый 31.08.2011, 14:08   #6
AlexPv
Senior Member
 
Регистрация: 02.03.2009
Адрес: Russia
Сообщений: 1,800
Вес репутации: 565/65
AlexPv is a name known to allAlexPv is a name known to allAlexPv is a name known to allAlexPv is a name known to allAlexPv is a name known to allAlexPv is a name known to all
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Цитата:
Сообщение от Noelchuvak Посмотреть сообщение
Товарищи, а как насчет самой программы. дело ведь в ней,уже несколько дней бьюсь над этим
Так что именно не получается? Байт разбиваем на два полубайта и их передаем:
1 Установка команда/данные - линия RS
2 Выводим старший полубайт команды/данных
3 Строб
4 Выводим младший полубайт команды/данных
5 Строб
6 Ставим на линии шины высокий уровень

Да, и инициализацию LCD-контроллера произвести для четырёхбитной шины в точности как описано в даташите на контроллер дисплея!
AlexPv вне форума   Ответить с цитированием
Старый 31.08.2011, 16:04   #7
Industrialniy
Senior Member
 
Аватар для Industrialniy
 
Регистрация: 17.10.2007
Адрес: sdelal.net
Возраст: 38
Сообщений: 418
Вес репутации: 226/53
Industrialniy has a spectacular aura aboutIndustrialniy has a spectacular aura aboutIndustrialniy has a spectacular aura about
Отправить сообщение для Industrialniy с помощью ICQ
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Вот рабочий пример из проекта, сравни сам что не так.
Код:
        MOVLW        b'00000011'
        MOVWF        pc
        MOVF        pc,w
        MOVWF        PORTC
        CALL        LCD_STROB
        CALL        STOP_5m
        CALL        LCD_STROB
        CALL        STOP_250
        CALL        LCD_STROB
        BCF            pc,0
        MOVF        pc,w
        MOVWF        PORTC
        CALL        LCD_STROB
        CALL        STOP_5m
        MOVLW        028h                ; 4 bit mode, 1/16 duty, 5x8 font
        MOVWF        write
        CALL        LCD_WRITE
        CALL        STOP_5m
        MOVLW        08h                ; display off
        MOVWF        write
        CALL        LCD_WRITE    
        CALL        STOP_5m
        MOVLW        0ch                ; display on, blink cursor off
        MOVWF        write
        CALL        LCD_WRITE
        CALL        STOP_5m
        MOVLW        06h                ; entry mode
        MOVWF        write
        CALL        LCD_WRITE
        CALL        STOP_5m
        MOVLW        01h                ; clear
        MOVWF        write
        CALL        LCD_WRITE
        CALL        STOP_5m
По поводу DB0...DB3 - если чешутся руки куда-нибудь их подключить, то лучше подключать к питанию, ибо со стороны контроллера дисплея эти выводы подтянуты к питанию через резистора. Подключив их к массе увеличивается потребляемый ток и некоторые дисплеи не инициализируются в таком случае на 4 битный режим обмена.
Industrialniy вне форума   Ответить с цитированием
Старый 31.08.2011, 18:52   #8
Noelchuvak
Junior Member
 
Аватар для Noelchuvak
 
Регистрация: 31.08.2011
Адрес: Россия, Ставрополь
Возраст: 31
Сообщений: 7
Вес репутации: 100/0
Noelchuvak will become famous soon enoughNoelchuvak will become famous soon enough
Отправить сообщение для Noelchuvak с помощью ICQ
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Попробую разобраться с с этим фрагментом...

Касаемо DB0-DB3 исчерпывающий ответ, спасибо.
Noelchuvak вне форума   Ответить с цитированием
Старый 02.09.2011, 21:46   #9
Геннадий Ходячих
Senior Member
 
Регистрация: 25.01.2009
Адрес: Харьков, Украина
Возраст: 59
Сообщений: 433
Вес репутации: 219/48
Геннадий Ходячих has a spectacular aura aboutГеннадий Ходячих has a spectacular aura aboutГеннадий Ходячих has a spectacular aura about
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Найди пример AN587 у Микрочипа - там все прописано - и 8 бит, и 4 бита интерфейс
Геннадий Ходячих вне форума   Ответить с цитированием
Старый 02.09.2011, 22:02   #10
Noelchuvak
Junior Member
 
Аватар для Noelchuvak
 
Регистрация: 31.08.2011
Адрес: Россия, Ставрополь
Возраст: 31
Сообщений: 7
Вес репутации: 100/0
Noelchuvak will become famous soon enoughNoelchuvak will become famous soon enough
Отправить сообщение для Noelchuvak с помощью ICQ
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Цитата:
Сообщение от Геннадий Ходячих Посмотреть сообщение
Найди пример AN587 у Микрочипа - там все прописано - и 8 бит, и 4 бита интерфейс
спасибо,я в Майкрочипских примерах копался, уже многое перерыл и 587-й в том числе. Там код вроде как на С (судя по знакомым операторам "else" и "if"), со вставками на асм как я понимаю %), а с программированием на С я не дружу совсем(хотя наверное зря..). Зато я нашел прогу в чистом виде на асм для 2х16 дисплея на 4битный режим, для 16F84, собираюсь его поковырять
Noelchuvak вне форума   Ответить с цитированием
Старый 02.09.2011, 22:10   #11
Геннадий Ходячих
Senior Member
 
Регистрация: 25.01.2009
Адрес: Харьков, Украина
Возраст: 59
Сообщений: 433
Вес репутации: 219/48
Геннадий Ходячих has a spectacular aura aboutГеннадий Ходячих has a spectacular aura aboutГеннадий Ходячих has a spectacular aura about
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Цитата:
Сообщение от Noelchuvak Посмотреть сообщение
спасибо,я в Майкрочипских примерах копался, уже многое перерыл и 587-й в том числе. Там код вроде как на С (судя по знакомым операторам "else" и "if"), со вставками на асм как я понимаю %), а с программированием на С я не дружу совсем(хотя наверное зря..). Зато я нашел прогу в чистом виде на асм для 2х16 дисплея на 4битный режим, для 16F84, собираюсь его поковырять
чистый ассемблер. Написан на все случаи жизни. if, else, endif это команды для компилятора (надо познакомиться с ними)
Задав Four_bit, Data_HI - ты выберешь комбинацию 4 или 8 бит, старшая или младшая часть полубайта для передачи.
Геннадий Ходячих вне форума   Ответить с цитированием
Старый 02.09.2011, 22:21   #12
Noelchuvak
Junior Member
 
Аватар для Noelchuvak
 
Регистрация: 31.08.2011
Адрес: Россия, Ставрополь
Возраст: 31
Сообщений: 7
Вес репутации: 100/0
Noelchuvak will become famous soon enoughNoelchuvak will become famous soon enough
Отправить сообщение для Noelchuvak с помощью ICQ
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Цитата:
Сообщение от Геннадий Ходячих Посмотреть сообщение
чистый ассемблер. Написан на все случаи жизни. if, else, endif это команды для компилятора (надо познакомиться с ними)
Задав Four_bit, Data_HI - ты выберешь комбинацию 4 или 8 бит, старшая или младшая часть полубайта для передачи.
Хм, интересно, надо к нему вернуться и изучить.
кстати, как я понял тут еще проверка готовности ЖКИ (Busy_Check), обычно это дело обходят задержками, чтобы контроллер дисплея успел все переварить
Noelchuvak вне форума   Ответить с цитированием
Старый 02.09.2011, 22:29   #13
Геннадий Ходячих
Senior Member
 
Регистрация: 25.01.2009
Адрес: Харьков, Украина
Возраст: 59
Сообщений: 433
Вес репутации: 219/48
Геннадий Ходячих has a spectacular aura aboutГеннадий Ходячих has a spectacular aura aboutГеннадий Ходячих has a spectacular aura about
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Повторение - мать учения
Геннадий Ходячих вне форума   Ответить с цитированием
Старый 05.09.2011, 15:53   #14
Noelchuvak
Junior Member
 
Аватар для Noelchuvak
 
Регистрация: 31.08.2011
Адрес: Россия, Ставрополь
Возраст: 31
Сообщений: 7
Вес репутации: 100/0
Noelchuvak will become famous soon enoughNoelchuvak will become famous soon enough
Отправить сообщение для Noelchuvak с помощью ICQ
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Цитата:
Сообщение от Геннадий Ходячих Посмотреть сообщение
Повторение - мать учения
Решил сначала смоделировать этот пример 00587 и посмотреть как работает, и работает ли вообще программа. И сразу же появилась загвоздка в схемотехнике.Я никак не разберусь что и куда вешать на 16С64...
Noelchuvak вне форума   Ответить с цитированием
Старый 05.09.2011, 21:54   #15
Геннадий Ходячих
Senior Member
 
Регистрация: 25.01.2009
Адрес: Харьков, Украина
Возраст: 59
Сообщений: 433
Вес репутации: 219/48
Геннадий Ходячих has a spectacular aura aboutГеннадий Ходячих has a spectacular aura aboutГеннадий Ходячих has a spectacular aura about
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

В смысле? там в примере указано - где что подключать
Код:
	LIST P=16F84
;, F=INHX8M
;        ERRORLEVEL  -302
;
; This program interfaces to a Hitachi (LM032L) 2 line by 20 character display
; module. The program assembles for either 4-bit or 8-bit data interface, depending
; on the value of the 4bit flag. LCD_DATA is the port which supplies the data to
; the LM032L, while LCD_CNTL is the port that has the control lines ( E, RS, R_W ).
; In 4-bit mode the data is transfer on the high nibble of the port ( PORT<7:4> ).
;
;       Program = LM032L.ASM
;       Revision Date:   5-10-94
;                        12-12-95    Compatibility with MPASMWIN 1.30
;
;
       include <P16F84.INC>
       include <lm032l.h>
;
;Four_bit         EQU     FALSE       ; Selects 4- or 8-bit data transfers
;Data_HI          EQU     FALSE       ; If 4-bit transfers, Hi or Low nibble of PORT
;
LCD_DATA         EQU     PORTB
LCD_DATA_TRIS    EQU     TRISB
;
LCD_CNTL         EQU     PORTA
;
; LCD Display Commands and Control Signal names.
;
E	EQU	0	; LCD Enable control line
R_W	EQU	2	; LCD Read/Write control line
RS	EQU	1	; LCD Register Select control line
;
Геннадий Ходячих вне форума   Ответить с цитированием
Старый 05.09.2011, 22:10   #16
dosikus
Senior Member
 
Аватар для dosikus
 
Регистрация: 05.06.2007
Возраст: 48
Сообщений: 3,800
Вес репутации: 6357/149
dosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond repute
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Цитата:
Сообщение от Noelchuvak Посмотреть сообщение
Хм, интересно, надо к нему вернуться и изучить.
кстати, как я понял тут еще проверка готовности ЖКИ (Busy_Check), обычно это дело обходят задержками, чтобы контроллер дисплея успел все переварить
Ваша ошибка в том , что вы начали изучать МК по догмам пастера корабельникова . Раз.
Два. Более корявой работы с дисплеем я не знаю .
Три. В протеусе для модели этого дисплея есть вывод дебаг информации.
Четыре. Не все дисплеи( аналоги HD44780) одинаково инитятся (это вылезет в железе) ...
dosikus вне форума   Ответить с цитированием
Старый 26.12.2011, 00:52   #17
Sameman
Banned
 
Регистрация: 23.06.2011
Сообщений: 82
Вес репутации: 22/0
Sameman is on a distinguished road
Angry Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Здравствуте. Тоже возникла проблема, с переделкой С-кода. В большинстве приложений используется передача через линии 4-7, а так как у меня Ф630, мне приходится передавать через С0-С3, С4-РС, 5С-ЕН. Попробовал переделать оригинальный пример на С, ничего не выходит. Кто-нибудь поможет советом?
Было.
void
lcd_write(unsigned char c)
{
__delay_us(40);
LCD_DATA = ( ( c >> 4 ) & 0x0F );
LCD_STROBE();
LCD_DATA = ( c & 0x0F );
LCD_STROBE();
}
Сделал.
#define LCD_RS RC4
#define LCD_EN RC5
#define LCD_DATA PORTC
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
void
lcd_write(unsigned char c)
{
// asm("SWAPF с");
// asm("MOVWF c");
__delay_ms(1);
LCD_DATA &= 0x30; // High
LCD_DATA |= ( (c << 4) & 0x0F );
LCD_STROBE();
LCD_DATA &= 0x30; // Low
LCD_DATA |= ( c & 0x0F );
LCD_STROBE();
}
Sameman вне форума   Ответить с цитированием
Старый 26.12.2011, 01:29   #18
dosikus
Senior Member
 
Аватар для dosikus
 
Регистрация: 05.06.2007
Возраст: 48
Сообщений: 3,800
Вес репутации: 6357/149
dosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond repute
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Цитата:
Сообщение от Sameman Посмотреть сообщение
Было.
Код:
 void
 lcd_write(unsigned char c)
 {
     __delay_us(40);
     LCD_DATA = ( ( c >> 4 ) & 0x0F );
     LCD_STROBE();
     LCD_DATA = ( c & 0x0F );
     LCD_STROBE();
 }
У вас данные и так выводятся на 0-3 биты порта. А где вы переделали выводится чушь .
dosikus вне форума   Ответить с цитированием
Старый 26.12.2011, 07:36   #19
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 70
Сообщений: 2,215
Вес репутации: 1898/89
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Свмый простой совет - думайте!

А это означает задавайте себя вопросы: что именно и зачем я делаю то, делаю это, каков будет результат? Если этому вы еще не научились, тогда разрешить эти вопросы задать мне.
Код:
LCD_DATA |= ( (c << 4) & 0x0F );
???
Bill вне форума   Ответить с цитированием
Старый 26.12.2011, 08:32   #20
Sameman
Banned
 
Регистрация: 23.06.2011
Сообщений: 82
Вес репутации: 22/0
Sameman is on a distinguished road
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

Цитата:
Сообщение от dosikus Посмотреть сообщение
Ваша ошибка в том , что вы начали изучать МК по догмам пастера корабельникова . Раз.
Два. Более корявой работы с дисплеем я не знаю .
Три. В протеусе для модели этого дисплея есть вывод дебаг информации.
Четыре. Не все дисплеи( аналоги HD44780) одинаково инитятся (это вылезет в железе) ...
1.Ничего подобного, я начинал с АВР, корабельниковым там и не пахнет, я не знаю, кто это.
2.Может быть, а по сути есть что сказать, может предложите что-нибудь?
3. Посмотрю, не подумал об этой фишке.
4. Понятия не имею, при написании на Форте никаких проблем не было.
Sameman вне форума   Ответить с цитированием
Старый 26.12.2011, 08:40   #21
Sameman
Banned
 
Регистрация: 23.06.2011
Сообщений: 82
Вес репутации: 22/0
Sameman is on a distinguished road
По умолчанию Re: Свмый простой совет - думайте!

Цитата:
Сообщение от Bill Посмотреть сообщение
А это означает задавайте себя вопросы: что именно и зачем я делаю то, делаю это, каков будет результат? Если этому вы еще не научились, тогда разрешить эти вопросы задать мне.
Код:
LCD_DATA |= ( (c << 4) & 0x0F );
???
1. << Сдвигаю влево на четыре разряда.
2. & Маскирую ненужный ниббл.
3.| Восстанавливаю значение старших разрядов порта вывода.
4.= Присваиваю значение порту вывода.
Sameman вне форума   Ответить с цитированием
Старый 26.12.2011, 09:03   #22
Sameman
Banned
 
Регистрация: 23.06.2011
Сообщений: 82
Вес репутации: 22/0
Sameman is on a distinguished road
По умолчанию Re: Переделка asm кода ЖКИ с 8 бит на 4 бита

С | заработало. Ничего не понял, почему вправо сдвигать-то надо?
void
lcd_write(unsigned char c)
{
__delay_ms(1);
LCD_DATA &= 0x30; // High
LCD_DATA |= ( ( c >> 4 ) & 0x0F );
LCD_STROBE();
__delay_ms(1);
LCD_DATA &= 0x30; // Low
LCD_DATA |= ( c & 0x0F );
LCD_STROBE();
__delay_ms(1);
}
Sameman вне форума   Ответить с цитированием
Старый 26.12.2011, 09:49   #23
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 70
Сообщений: 2,215
Вес репутации: 1898/89
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Еще раз - думайте!

Цитата:
Сообщение от Sameman Посмотреть сообщение
1. << Сдвигаю влево на четыре разряда.
2. & Маскирую ненужный ниббл.
3.| Восстанавливаю значение старших разрядов порта вывода.
4.= Присваиваю значение порту вывода.
Код:
LCD_DATA |= ( (c << 4) & 0x0F );
Возьмите для примера c = 'D' (0x44), и проделайте эти операции вручную. Что получите в результате?
Bill вне форума   Ответить с цитированием
Старый 26.12.2011, 10:04   #24
Sameman
Banned
 
Регистрация: 23.06.2011
Сообщений: 82
Вес репутации: 22/0
Sameman is on a distinguished road
По умолчанию Re: Еще раз - думайте!

В калькуляторе 0х44 = 100 0100, получается 100 = 4(сдвигал на бумажке, незначащий ноль опустил). И чего вы хотели сказать, не понял?

Последний раз редактировалось Sameman; 26.12.2011 в 10:19.
Sameman вне форума   Ответить с цитированием
Старый 26.12.2011, 10:17   #25
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 70
Сообщений: 2,215
Вес репутации: 1898/89
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Господи!!! Неужели неполнятно?

Цитата:
Сообщение от Sameman Посмотреть сообщение
В калькуляторе 0х44 = 100 0100, получается 100 = 4. И чего вы хотели сказать, не понял?
Код:
LCD_DATA |= ( (c << 4) & 0x0F );
c = 'D' (0x44)
1. c << 4 = 0x40
2. 0x40 & 0x0F = 0
3 LCD_DATA | 0 = LCD_DATA
Зачем у вас в коде эти манипуляции, если в результате ничего не меняется?
Bill вне форума   Ответить с цитированием
Ответ

Метки
16х2, 4-бит, 8-бит, hd47780, жки


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MAX232 и USART, отсутствует сигнал на выходе. EviL_LaugH Общетехнические вопросы 15 31.01.2011 00:40
Проблема с прерыванием PIC 16F877A . chiraevevgenii Вопросы начинающих 8 13.01.2011 20:13
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00
Реализация целочисленного деления на 32 бита на 32 бита на dsPic kotlyara Продукция MICROCHIP 7 27.08.2007 16:42
эффективная передача бита на Си. Andrey Продукция MICROCHIP 4 21.05.2007 11:53


Часовой пояс GMT +3, время: 23:12.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot