Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

4-bit LCD Interface problem
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=417
Страница 1 от 1

Автор:  PIC [ Пон Фев 21, 2005 12:33 pm ]
Заглавие:  4-bit LCD Interface problem

Здравейте, виждам че се разисква тема за HD44780.
Аз използвам KS0066U и се появява много странен проблем.
Работи с 4-битов интерфейс , като на портВ 4-7 са данните ,
а на портА 0-2 са управляващите битове. Така работи , но при
смяна - управляващите битове от портА 0-2 към портВ 1-3 нищо не става ??? Идеята ми е да използвам само портВ при управлението на модула /така съм предвидил и платката/ но работи само по горе описания начин. Естествено съм проверил подреждането на изводите на ЛСД спрямо порта на пик-а и в програмата съм ги предефинирал правилно , а проблема остава?
Използвам пик16Ф84А може би проблема идва от това , че всичко е на един порт?

Автор:  ToHu [ Пон Фев 21, 2005 1:01 pm ]
Заглавие: 

Не,не е от това проблема, някъде в програмата ти е. кай да видим процедурите за управление ан дисплея, инициалзация и т.н. ... и м-у другото, като позлваш порт b надявам се си забранил LVP функцията . не помня тоя имаше лия, но ако я има трябва да е забранена, иначе B.3 няма да функционира нормално.

Автор:  PIC [ Пон Фев 21, 2005 1:34 pm ]
Заглавие: 

Това е примерна програма за въртящо се съобщение на дисплея
която е работеща в този случай. При предефиниране на битовете RS , R/W и E към портВ абсолютно нищо не излиза на
дисплея. Не знам какво е LVP функция /ще съм благодарен ако обясниш/, но при този процесор не съм я срещал никъде. А и друго! Значи при работеща програма използвам изчакване по-голямо от посоченото за съответната инструкция вместо да проверавам флага за заетост защото при проверката той постоянно е зает /има го като подпрограма ,но не се ползва/.




list p=16F84A ; PROCESSOR TYPE
#include <p16F84A.inc> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

;*************** DEFINE CONSTANT AND VARIABLES **************
w EQU 0
f EQU 1
CBLOCK H'0C'
BF_temp
Counter
Counter_2
Counter_Wr
Reg_Data
Reg_Note
LCD_temp
ENDC
;****************** DEFINE I/O PINS *********************
#define E PORTA,0
#define RW PORTA,1
#define RS PORTA,2
;*******************************************************
ORG H'0000'
goto start
;******************** START PROGRAM **********************
start bsf STATUS,RP0
movlw B'11000111'
movwf OPTION_REG
clrf TRISB
clrf TRISA
bcf STATUS,RP0
clrf PORTB
clrf PORTA
goto main
;-----------------------------------------------------------
;:::::::::::::::: 4-bit : LCD :::::::::::::::::::::::::::::
;-----------------------------------------------------------
Init_LCD movlw D'35'
movwf Counter
loop call Wait_1mS
decfsz Counter,f
goto loop
;------------------------------------
;************* FUNCTION SET *********
;------------------------------------
movlw B'00100000'
movwf PORTB
bsf E
bcf E
call Wait_60uS
;------------------------
movlw B'00100000'
movwf PORTB
bsf E
bcf E
;------------------------
movlw B'11000000'
movwf PORTB
bsf E
bcf E
call Wait_60uS
;------------------------------------
;******* Display ON/OFF Control *****
;------------------------------------
clrf PORTB
bsf E
bcf E
;------------------------
movlw B'11000000'
movwf PORTB
bsf E
bcf E
call Wait_60uS
;-------------------------------------
;************* Display Clear *********
;-------------------------------------
clrf PORTB
bsf E
bcf E
;------------------------
movlw B'00010000'
movwf PORTB
bsf E
bcf E
call Wait_1mS
call Wait_1mS
;------------------------------------
;*********** Entry Mode Set *********
;------------------------------------
clrf PORTB
bsf E
bcf E
;------------------------
movlw B'01100000'
movwf PORTB
bsf E
bcf E
call Wait_60uS
;------------------------------------
;********* Initialization end *******
;------------------------------------
return
;::::::::::::::::4-bit interface ::::::::::::::::::::::::
Send_instr_43 movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bcf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_60uS
return
;: 4-bit interface ::::::::::::::::::::::::::::::::::::::
Send_instr_153 movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bcf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_1mS
call Wait_1mS
return
;:::::::::::::::::::::::::::::::; 4-bit interface :::::::::::::::::::::::::::::::::::::::
Send_char movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bsf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_60uS
return
;-----------------------------------------------------
Check_BF bsf STATUS,RP0
movlw H'FF'
movwf TRISB
bcf STATUS,RP0
bcf RS
bsf RW
bsf E
bcf E
movf PORTB,w
movwf BF_temp
btfsc BF_temp,7
goto Check_BF
bcf RW
bsf STATUS,RP0
clrf TRISB
bcf STATUS,RP0
return
;-----------------------------------------------------------
Wait_1mS movlw D'100'
movwf Counter_Wr
Again nop
nop
nop
nop
nop
nop
nop
decfsz Counter_Wr,f
goto Again
return
;------------------------------------------------------------
Wait_60uS movlw D'10' ; wait exactly 65uS
movwf Counter_Wr
Wait_Wr_ag nop
nop
nop
decfsz Counter_Wr,f
goto Wait_Wr_ag
return
;------------------------------------------------------------
Wait_1 movlw D'10'
movwf Counter
clrf TMR0
again_1 bcf INTCON,T0IF
loop_1 btfss INTCON,T0IF
goto loop_1
decfsz Counter,f
goto again_1
return
;-----------------------------------------------------------
Message ADDWF PCL,f
retlw '*'
retlw '*'
retlw '*'
retlw '*'
retlw ' '
retlw 'D'
retlw 'A'
retlw 'L'
retlw 'L'
retlw 'A'
retlw 'S'
retlw ' '
retlw 'D'
retlw 'S'
retlw '1'
retlw '8'
retlw 'B'
retlw '2'
retlw '0'
retlw ' '
retlw '*'
retlw '*'
retlw '*'
retlw '*'
;----------------------------------------------------------
main call Init_LCD
movlw H'90'
call Send_instr_43
clrf Reg_Note
UP_1 movf Reg_Note,w
call Message
call Send_char
INCF Reg_Note,f
movlw D'24'
SUBWF Reg_Note,w
btfss STATUS,Z
goto UP_1
UP_2 call Wait_1
movlw B'00011000' ; Display Shift to Left
call Send_instr_43
goto UP_2
sleep_1 nop
goto sleep_1
END

Автор:  Predator_MF [ Пон Фев 21, 2005 2:53 pm ]
Заглавие: 

Проста работа :D Това за LVP го забрави...PIC16F84 няма такава функция (LVP - Low Voltage Programming, заема ти RB3 и не можеш да го ползваш в програмата си)...Проблема с BusyFlag-а и аз го имах при няколко дисплея, явно хардуерен проблем...ама и той не е важен...
Тука проблема ти е прост, решението също...

1. Забележи, че навсякъде в подпрограмите пращаш към PORTB битове 7:4, а не 3:0...Първо оправи това...
2. Тия тричките имат нужда от промяна...
Код:
;::::::::::::::::4-bit interface ::::::::::::::::::::::::
Send_instr_43 movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bcf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_60uS
return
;: 4-bit interface ::::::::::::::::::::::::::::::::::::::
Send_instr_153 movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bcf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_1mS
call Wait_1mS
return
;:::::::::::::::::::::::::::::::; 4-bit interface :::::::::::::::::::::::::::::::::::::::
Send_char movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bsf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_60uS
return
;-----------------------------------------------------

По-точно ей тия редове:
Код:
movf LCD_temp,w
andlw H'F0'
movwf PORTB
...
swapf LCD_temp,w
andlw H'F0'
movwf PORTB

...трябва да изглеждат така:
Код:
swapf LCD_temp,w
andlw H'0F'
movwf PORTB
...
movf LCD_temp,w
andlw H'0F'
movwf PORTB

Пример за Send_instr_43:
Код:
;::::::::::::::::4-bit interface ::::::::::::::::::::::::
Send_instr_43 movwf LCD_temp ; 4-bit interface
swapf LCD_temp,w
andlw H'0F'
movwf PORTB
bcf RW
bcf RS
bsf E
bcf E
movf LCD_temp,w
andlw H'0F'
movwf PORTB
bsf E
bcf E
call Wait_60uS
return
.
Оттук нататък си ти... 8)

Автор:  PIC [ Пон Фев 21, 2005 4:07 pm ]
Заглавие: 

Данните при мен са на портВ 7-4 и ако ги умножа с 0F то според мен тези битове след операцията ще са нула? А и по този начин си работи само управлението е от друг порт.

10101010
and
00001111
00001010
MSB LSB

Автор:  Predator_MF [ Пон Фев 21, 2005 4:22 pm ]
Заглавие: 

Значи извинявай, не съм те разбрал както трябва.... :lol: Но проблема е точно там където казвам...аз предположих, че искаш да си преместиш 4-те бита на RB3:0...Нищо де, проблема е пак в тия редове, а именно "ANDLW 0xF0" ти маскира долната тетрада, и като си сложиш управлението там (на RB3:0), те постоянно ще излизат в "0". Преправи ги тия редове със малко логика, че мене ме домързя да ти го напиша...Трябва да маскираш първо LCD_temp, след това да го OR-неш или AND-неш със PORTB, без да засягаш младшата тетрада (RB3:0).

Автор:  Predator_MF [ Пон Фев 21, 2005 4:33 pm ]
Заглавие: 

Добре де....
Код:
Send_instr_43 movwf LCD_temp ; 4-bit interface
movlw 0x0F ;!!!!
andwf PORTB,f  ;Изчистваш старшата на PORTB
movf LCD_temp,w
andlw 0xF0       ; Махаш младшата тетрада
xorwf PORTB,f  ;Вдигаш битовете на старшата,без да буташ младшата
bcf RW
bcf RS
bsf E
bcf E
movlw 0x0F ;пак !!!! внимавай, така трябва да е
andwf PORTB,f  ; Чистиш старшата на PORTB
swapf LCD_temp,w  ; Разменяш тетрадите на LCD_temp
andlw 0xF0             ; Маскираш младшата, остава ти старшата...
xorwf PORTB          ; и я слагаш на PORTB :)
bsf E
bcf E
call Wait_60uS
return

Ша черпиш :D

Автор:  PIC [ Вто Фев 22, 2005 3:04 pm ]
Заглавие: 

Благодаря ти приятелю! Утре ще пробвам... Интересно ми е защо се получава така , че при запис в регистъра на константа след това не можеш да променяш битовете поотделно...какъвто е случая с портВ...предполагам , че същото важи и за регистри с общо предназначение... :axe:

Автор:  Predator_MF [ Вто Фев 22, 2005 3:12 pm ]
Заглавие: 

То си може побитово...bsf,bcf...ама струва ли си да губиш 30-ина реда да гласиш битове...отколкото 4 реда да маскираш тия дето няма да ги буташ. Всичко в тоя (тия) контролери става с елементарна булева алгебра (не че съм я учил..ама съм чел малко :D )

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/