jhanus
New Member
Hello, my first post here I think?!
OK, here's my problem, I have read several times trough datasheet of LCD driver HD44780, and I can't find error in my program. Initialization should be fine.
Simulation in program PIC Simulator works fine (except display shift doesn't work)
But the same program doesn't work in Proteus simulator,I was hoping that someone can help me locate the problem why it doesn't work in Proteus.
I'm using PIC16f84a, LCD 2x16(HD44780).
Help me to start this program in Proteus, thank you!
OK, here's my problem, I have read several times trough datasheet of LCD driver HD44780, and I can't find error in my program. Initialization should be fine.
Simulation in program PIC Simulator works fine (except display shift doesn't work)
But the same program doesn't work in Proteus simulator,I was hoping that someone can help me locate the problem why it doesn't work in Proteus.
I'm using PIC16f84a, LCD 2x16(HD44780).
Help me to start this program in Proteus, thank you!
Code:
; ==============================================================================
; Upravljanje s LCD zaslonom pomocu PIC16F84A
; ==============================================================================
PROCESSOR 16F84A
#include "p16f84a.inc"
ERRORLEVEL -224
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF
;******************************definirani shortcutovi***************************
;*******************************************************************************
#define RW PORTB,0
#define E PORTB,1
#define RS PORTB,2
;******************************definirani registri******************************
;*******************************************************************************
limit equ 0x0c
cod equ 0x0d
counter equ 0x10
;******************************definirani "literali*****************************
;*******************************************************************************
FUNCSET equ b'00101000'
DISPLAY equ b'00001100'
ENTRYM equ b'00000111'
CLRDIS equ b'00000001'
RETHOME equ b'00000010'
CGRAM equ b'01000000'
DDRAM equ b'10000000'
ROTR equ b'00011100'
ROTL equ b'00011000'
;******************************pocetna inicijalizacija**************************
;*******************************************************************************
org 0x00
bsf STATUS,RP0 ;BANK1
clrf TRISB ;PORTB output
movlw b'00000001'
movwf OPTION_REG ;predjelilo 1:4, kas=1ms, TMR0=6
bcf STATUS,RP0
movlw b'00000000'
movwf INTCON ;ne zelim prekid
clrf PORTB ;PORTB u nulu
clrf counter ;counter u nulu
call init ;poziv inicijalizacije LCD
;*********************************pocetak programa******************************
;*******************************************************************************
movlw b'00000000' ;na adresi 0x00 pocinje prvi znak
call csign ;buildanje znaka
movlw 0x00 ;adresa na koju želim pointer
iorlw DDRAM ;adresa koja se šalje kao instrukcija, sa maskom DDRAMA
call inscode ;poziv na 4-bitni upis instrukcije
movlw 0x00 ;znak pod kodom 0x00 će se ispisati
call datcode ;poziv na 4-bitni upis podatka
;******************************malo hod ilti rotiranje***************************
; movlw d'15'
; call rotateR
; movlw d'15'
; call rotateL
; movlw d'15'
; call rotateR
; movlw d'15'
; call rotateL
;*********************************prvi spis stringa******************************
movlw 0x00 ;adresa na koju želim pointer
iorlw DDRAM ;maska DDRAM
call inscode ;poziv na 4-bitni upis instrukcije
movlw b'00000111' ;entery mode instrukcija,ali sa uključenim
call inscode ; zadnjim bitom ,display shift
str1 movf counter,w ;za onoliko koliko je u counteru, miče se po stringu
call string1 ;
bcf STATUS,Z
xorwf 0x00
btfsc STATUS,Z ;testiranje dali je došao do kraja
goto end_ ;ako da izlazi
call datcode ;poziv na 4-bitni upis podatka
incf counter ;inkrementira counter
goto str1
end_ goto end_
;********************************4-bitni prijenos*******************************
;************************************podataka***********************************
datcode movwf cod ;pohranjujem instrukciju u registar cod
andlw 0xF0 ;vrsi se eliminacija donjeg dijela instrukcije
movwf PORTB ;saljem to na PORTB
bcf RW ;sad je u modu za pisanje u LCD
nop
nop
nop
bsf RS ;odabran mod za podatke
nop
nop
nop
bsf E ;uključen ENABLE pin
nop
nop
nop
bcf E ;isključen ENABLE pin
swapf cod,w ;gornji i donji nibble se mijenjaju
andlw 0xF0 ;vrsi se eliminacija donjeg dijela instrukcije
movwf PORTB ;saljem to na PORTB
bcf RW ;sad je u modu za pisanje u LCD
nop
nop
nop
bsf RS ;odabran mod za podatke
nop
nop
nop
bsf E ;uključen ENABLE pin
nop
nop
nop
bcf E ;isključen ENABLE pin
movlw d'3'
call kasni_ms ;kasnjenje od 3ms
return
;*******************************inicijalizacija LCD*****************************
;*******************************************************************************
init movlw d'15'
call kasni_ms ;cekanje od 15ms da se LCD sabere
movlw FUNCSET ;FUNCTION SET, za odabir 4-bitnog moda, broj linija i veličinu slova
call inscode
movlw DISPLAY ;DIS on/off, CURSOR on/off, tip CURSORA
call inscode
movlw ENTRYM ;cursor and display move
call inscode
movlw CLRDIS ;brise DDRAM i postavlja na adresu 0x00
call inscode
return
;********************************4-bitni prijenos*******************************
;**********************************instrukcija**********************************
inscode movwf cod ;pohranjujem instrukciju u registar cod
andlw 0xF0 ;vrsi se eliminacija donjeg dijela instrukcije
movwf PORTB ;saljem to na PORTB
bcf RW ;sad je u modu za pisanje u LCD
nop
nop
nop
bcf RS ;odabran mod za instrukcije
nop
nop
nop
bsf E ;uključen ENABLE pin
nop
nop
nop
bcf E ;isključen ENABLE pin
swapf cod,w ;gornji i donji nibble se mijenjaju
andlw 0xF0 ;vrsi se eliminacija donjeg dijela instrukcije
movwf PORTB ;saljem to na PORTB
bcf RW ;sad je u modu za pisanje u LCD
nop
nop
nop
bcf RS ;odabran mod za instrukcije
nop
nop
nop
bsf E ;uključen ENABLE pin
nop
nop
nop
bcf E ;isključen ENABLE pin
movlw d'3'
call kasni_ms ;kasnjenje od 3ms
return
;**********************************konstrukcija*********************************
;*************************************znakova***********************************
csign iorlw CGRAM ;ILI početne adrese i maske CGRAMa 0x40
call inscode ;adresa zamaskirana sa 0x40 poslana kao instrukcija
; ustvari služi za ulaz u CGRAM i navedenu adresu
build movf counter,w
bcf STATUS,Z
xorlw d'24'
btfsc STATUS,Z ;testiranje dali je counter došao na 24
goto out ;izlaz jer je pri kraju stringa
movf counter,w
call sign ;poziva se byte pod brojem koji se nalazi u counteru
iorlw CGRAM ;pozvan byte u kombinaciji sa maskom CGRAMa
call datcode ;poziv na 4-bitni upis podatka
incf counter ;incremnet countera
goto build
out movlw RETHOME ;adresa DDRAMa na 0x00
call inscode ;poziv na 4-bitni upis instrukcije
clrf counter
return
;********************************rotiranje adresa******************************
;************************************u desno***********************************
rotateR movwf counter
rotR movlw ROTR
call inscode
decfsz counter
goto rotR
clrf counter
return
;********************************rotiranje adresa******************************
;************************************u lijevo***********************************
rotateL movwf counter
rotL movlw ROTL
call inscode
decfsz counter
goto rotL
clrf counter
return
;*****************************podaci za custom znakove**************************
;*******************************************************************************
sign addwf PCL,f
retlw b'00010001'
retlw b'00011111'
retlw b'00000000'
retlw b'00001010'
retlw b'00000000'
retlw b'00010001'
retlw b'00001110'
retlw b'00000000'
retlw b'00000000'
retlw b'00000000'
retlw b'00001010'
retlw b'00001010'
retlw b'00000000'
retlw b'00010000'
retlw b'00001111'
retlw b'00000000'
retlw b'00000001'
retlw b'00000100'
retlw b'00001100'
retlw b'00000100'
retlw b'00011111'
retlw b'00001110'
retlw b'00011111'
retlw b'00000000'
;************************************stringovi**********************************
;*******************************************************************************
string1 addwf PCL,f
retlw 'N'
retlw 'o'
retlw 'r'
retlw 'm'
retlw 'a'
retlw 'l'
retlw 'a'
retlw 'n'
retlw ' '
retlw 'n'
retlw 'a'
retlw 'c'
retlw 'i'
retlw 'n'
retlw ' '
retlw 'r'
retlw 'a'
retlw 'd'
retlw 'a'
retlw '.'
retlw 0x00
;******************************programirljivo kašnjenje*************************
;*******************************************************************************
kasni_ms movwf limit
clean bcf INTCON,T0IF
movlw d'6'
movwf TMR0
loop btfss INTCON,T0IF
goto loop
decfsz limit
goto clean
return
end