|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 4:07 pm
|
Страница 1 от 1
|
[ 9 мнения ] |
|
4-bit LCD Interface problem
| Автор |
Съобщение |
|
PIC
Ранг: Новодошъл
Регистриран на: Чет Дек 09, 2004 3:15 pm Мнения: 123 Местоположение: Благоевград
|
 4-bit LCD Interface problem
Здравейте, виждам че се разисква тема за HD44780.
Аз използвам KS0066U и се появява много странен проблем.
Работи с 4-битов интерфейс , като на портВ 4-7 са данните ,
а на портА 0-2 са управляващите битове. Така работи , но при
смяна - управляващите битове от портА 0-2 към портВ 1-3 нищо не става ??? Идеята ми е да използвам само портВ при управлението на модула /така съм предвидил и платката/ но работи само по горе описания начин. Естествено съм проверил подреждането на изводите на ЛСД спрямо порта на пик-а и в програмата съм ги предефинирал правилно , а проблема остава?
Използвам пик16Ф84А може би проблема идва от това , че всичко е на един порт?
|
| Пон Фев 21, 2005 12:33 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
Не,не е от това проблема, някъде в програмата ти е. кай да видим процедурите за управление ан дисплея, инициалзация и т.н. ... и м-у другото, като позлваш порт b надявам се си забранил LVP функцията . не помня тоя имаше лия, но ако я има трябва да е забранена, иначе B.3 няма да функционира нормално.
|
| Пон Фев 21, 2005 1:01 pm |
|
 |
|
PIC
Ранг: Новодошъл
Регистриран на: Чет Дек 09, 2004 3:15 pm Мнения: 123 Местоположение: Благоевград
|
Това е примерна програма за въртящо се съобщение на дисплея
която е работеща в този случай. При предефиниране на битовете 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
|
| Пон Фев 21, 2005 1:34 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Проста работа  Това за LVP го забрави...PIC16F84 няма такава функция (LVP - Low Voltage Programming, заема ти RB3 и не можеш да го ползваш в програмата си)...Проблема с BusyFlag-а и аз го имах при няколко дисплея, явно хардуерен проблем...ама и той не е важен...
Тука проблема ти е прост, решението също...
1. Забележи, че навсякъде в подпрограмите пращаш към PORTB битове 7:4, а не 3:0...Първо оправи това...
2. Тия тричките имат нужда от промяна...
По-точно ей тия редове: ...трябва да изглеждат така:Пример за Send_instr_43: .
Оттук нататък си ти... 
|
| Пон Фев 21, 2005 2:53 pm |
|
 |
|
PIC
Ранг: Новодошъл
Регистриран на: Чет Дек 09, 2004 3:15 pm Мнения: 123 Местоположение: Благоевград
|
Данните при мен са на портВ 7-4 и ако ги умножа с 0F то според мен тези битове след операцията ще са нула? А и по този начин си работи само управлението е от друг порт.
10101010
and
00001111
00001010
MSB LSB
|
| Пон Фев 21, 2005 4:07 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Значи извинявай, не съм те разбрал както трябва....  Но проблема е точно там където казвам...аз предположих, че искаш да си преместиш 4-те бита на RB3:0...Нищо де, проблема е пак в тия редове, а именно "ANDLW 0xF0" ти маскира долната тетрада, и като си сложиш управлението там (на RB3:0), те постоянно ще излизат в "0". Преправи ги тия редове със малко логика, че мене ме домързя да ти го напиша...Трябва да маскираш първо LCD_temp, след това да го OR-неш или AND-неш със PORTB, без да засягаш младшата тетрада (RB3:0).
|
| Пон Фев 21, 2005 4:22 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Добре де....
Ша черпиш 
|
| Пон Фев 21, 2005 4:33 pm |
|
 |
|
PIC
Ранг: Новодошъл
Регистриран на: Чет Дек 09, 2004 3:15 pm Мнения: 123 Местоположение: Благоевград
|
Благодаря ти приятелю! Утре ще пробвам... Интересно ми е защо се получава така , че при запис в регистъра на константа след това не можеш да променяш битовете поотделно...какъвто е случая с портВ...предполагам , че същото важи и за регистри с общо предназначение... 
|
| Вто Фев 22, 2005 3:04 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
То си може побитово...bsf,bcf...ама струва ли си да губиш 30-ина реда да гласиш битове...отколкото 4 реда да маскираш тия дето няма да ги буташ. Всичко в тоя (тия) контролери става с елементарна булева алгебра (не че съм я учил..ама съм чел малко  )
|
| Вто Фев 22, 2005 3:12 pm |
|
|
|
Страница 1 от 1
|
[ 9 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 10 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|