Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Proteus 7 simulation problem

Status
Not open for further replies.

jhanus

New Member
Hello, my first post here I think?! :eek:

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
 

Attachments

  • FinalLCD.asm
    8.1 KB · Views: 134
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top