Sida 1 av 2

Gubbe

Postat: 20 januari 2005, 15:15:56
av Mutiaz
Tjena! Håller på med en uppgift där jag ska göra en gubbe som vandrar på LCDn. Gubben har jag fixat. Men problemet är att den ska gå till slutet av displayen och sen stanna där. Jag kör PicBasic med en 16F877.

Såhär långt har jag kommit:

DEFINE LOADER_USED 1

' LCD registers and bits
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTE
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTE
DEFINE LCD_EBIT 1

ADCON1 = 7
Low PORTE.2


' custom characters

LCDOut $FE, 64, $8e, $8e, $84, $8e, $95, $84, $8a, $91


LCDOut $FE, 1



loop:

LCDOut $00
LCDOut $FE, $14
Pause 500

GoTo loop




End




Undrar om någon vänlig själ kan hjälpa mig med detta?

Mvh
//Mathias

Postat: 20 januari 2005, 15:58:19
av Hedis
Räkna helt enkelt hur många steg gubben har tagit.

Ett värde som ökas varje gång du flyttar gubben ett steg. I början på rutinen som flyttar gubben gämnför du värdet med antalet rutor.
Om det stämmer så hoppa till stop eller return lr vad du nu vill göra och nolla räknaren.

Postat: 20 januari 2005, 16:15:44
av Mutiaz
Okej. Kan du kanske berätta hur man göra räknaren? Jag är bara på övn 4 hehe =)

Postat: 20 januari 2005, 16:24:34
av jack
Kanske inte är så här Hedis tänker men detta borde funka ändå.

Deklarera en variabel, sätt in den i loopen så att den plussas på med ett för varje loop, använd en vilkorssats för att kolla när variabeln nått något värde, avsluta då programmet.

T ex:

Kod: Markera allt


LOOP: 

IF kalle = 10 THEN
END
ENDIF

LCDOut $00 
LCDOut $FE, $14 
PAUSE 500 

kalle = kalle + 1

GoTo LOOP


Postat: 20 januari 2005, 16:26:45
av Hedis
Nu kan jag inte basic´n men i asm så blir det ungefär såhär:

Kod: Markera allt

main:
ldi step,$00  ; laddar step med 0
right:
cpi step,20 (om du vill bryta efter 20 steg) ;Jämnför step med 20
inc step ; Ökar step med 1
breq main ; Om steg var 20 så hoppa till main
*rutinen som hoppar åt höger* ;Din rutin för att flytta gubben ett steg åt höger
rjmp loop

Postat: 20 januari 2005, 16:42:09
av Mutiaz
Har testat men problemet som blir är att gubben bakom syns. Gubben bakom måste alltså rensas så det inte blir femton gubbar utan bara en som flyttar sig.. Nån som vet?

Postat: 20 januari 2005, 16:44:41
av Hedis
Det problemet måste du ju alltid ha haft eller?
Skicka en clear screen mellan varje steg så löser det sig.
Ett alternativ är ju att du shiftar hela displayen åt höger. Läs i databladet för HD44780 kontrollern för att se kommandona,

Postat: 20 januari 2005, 16:44:52
av Noddan
Det finns oftast ett inbyggt kommando för att rensa lcd-skärmen på kontrollerchippet. Testa med det, borde avhjälpa problemet (rensa skärmen precis innan du ritar ut nästa gubbe).

Postat: 20 januari 2005, 16:55:39
av Mutiaz
jack skrev:Kanske inte är så här Hedis tänker men detta borde funka ändå.

Deklarera en variabel, sätt in den i loopen så att den plussas på med ett för varje loop, använd en vilkorssats för att kolla när variabeln nått något värde, avsluta då programmet.

T ex:

Kod: Markera allt


LOOP: 

IF kalle = 10 THEN
END
ENDIF

LCDOut $00 
LCDOut $FE, $14 
PAUSE 500 

kalle = kalle + 1

GoTo LOOP

Fan nu funkar inget.. Hur deklarerar man en variabel? typ såhär: "kalle VAR BYTE" ??

Postat: 20 januari 2005, 17:13:48
av Hedis
Du måste nolla kalle först.
Dessutom så måste du ha ngt efter THEN. (Ahh! missade att du hade END på nästa rad...)

Typ den rutinen du vill hopps till när du har gått "slut" på raden.
Då måste du dessutom tömma "kalle" igen så den är klar att använda nästa gång.

Postat: 20 januari 2005, 17:25:08
av Mutiaz
Hur tömmer man det då?

Postat: 20 januari 2005, 17:38:42
av jack
Tänkte inte på det.

kalle = 0
Lägg den någonstans i början av programmet. Inte i loopen.

Postat: 20 januari 2005, 17:51:33
av Mutiaz
Nu funkar det igen! Men om jag använder $14 att cursorn går ett steg åt höger så blir det ett mellanrum mellan två chars. Det finns ju ett $1C som scrollar gubben men det blir då en lång svans efter. Kan man få bort den? Jag har provat med clear display ($FE, 1) men det funkar inte...

Postat: 20 januari 2005, 17:57:32
av karlstedt
En vanlig HD44780(?) flyttar markören automatiskt ett steg åt höger när du skriver ett tecken så du ska inte behöva göra det. Det borde räcka att du skriver dina gubbar på raken och tömmer displayen mellan skrivningarna.

Postat: 20 januari 2005, 18:03:45
av Mutiaz
Såhär ser det ut nu:

Kod: Markera allt

DEFINE	LOADER_USED	1

' LCD registers and bits
DEFINE  LCD_DREG        PORTD
DEFINE  LCD_DBIT        4
DEFINE  LCD_RSREG       PORTE
DEFINE  LCD_RSBIT       0
DEFINE  LCD_EREG        PORTE
DEFINE  LCD_EBIT        1


gubbe     VAR     BYTE 


        ADCON1 = 7      
        Low PORTE.2     

        
' custom characters
        
        gubbe = 0
        
	    LCDOut $FE, 64, $8e, $8e, $84, $8e, $95, $84, $8a, $91 			
	   	
	    
	    LCDOut $FE, 1				

		



LOOP: 

		IF gubbe = 10 Then End
		
	
		LCDOut $00 
		
		LCDOut $FE, $14 
	
		Pause 500 
		
		gubbe = gubbe +1
		
	

GoTo LOOP 




        End
Var ska jag lägga rensningen?