Heeeeeeey,

Ik heb weer eens ruzie met de 74hc595. Ik heb alles als volgt aangesloten:
leds op de pinnen 1tm7 en 15
pin 8(GND0 en pin 13(OE) aan de min
pin 16 en pin 10(MR) aan de plus

pin 14(DS) aan pin 6(PB.0) van mijn pic(16f628a)
pin 11(SH_CP) aan pin 7(PB.1) van de pic
pin 12(ST_CP) aan pin 12(PB.6) van de pic

en mijn code( in ASM) doet het volgende:
Pin 14 laag.
pin 11 hoog
alles laag

Pin 14 hoog
pin 11 hoog
alles laag

dit verhaalte 4 keer zodat ik in totaal 8 bits heb ingeklokt

dan pin 12(latch) hoog


	; Assign your microcontroller
        LIST P=16F628
	; This include file makes programming more understandble
        include <P16F628.INC>
__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF
	; Disable warning : Register in operand not in bank 0
	ERRORLEVEL -302 
	; free 16F628 RAM starts at 0x20(depends on type microcontroller)
	CBLOCK 0x20
		cntr1
        ENDC
	;some define's to make things easier
	;These are for Bank Switching
	#define	BANK0	bcf	STATUS,RP0	; RAM PAGE 0
	#define	BANK1	bsf	STATUS,RP0	; RAM PAGE 1
	;startadres of the controller
	org 0x0000
; For using A0-A3 as digital I/O 
	movlw	D'7' 		; 
        movwf	CMCON		; Comparators off, all pins digital I/O 
; Reset Port values
        clrf	PORTA	
        clrf	PORTB     
; define your pin direction (input/output)
	BANK1			; Switch to bank 1
        movlw	b'11111111'	;
        movwf	TRISA		; PORTA = all inputs
        movlw	b'00000000'	; 
        movwf	TRISB		; PORTB = all outputs
	BANK0			; Switch to bank 1
;--------------------------------------------------------------------------
; main loop
;--------------------------------------------------------------------------
main
;eerste schuifregister vullen
	bcf		PORTB,0				
	call	klok1
	bsf		PORTB,0			
	call	klok1
	bcf		PORTB,0			
	call	klok1
	bsf		PORTB,0		
	call	klok1
	bcf		PORTB,0		
	call	klok1
	bsf		PORTB,0		
	call	klok1
	bcf		PORTB,0			
	call	klok1
	bsf		PORTB,0			
	call	klok1

	call	latch
	goto	main

;sub routines
klok1
	bsf		PORTB,1			;klok de bit(pin b,1 hoog)	
	movlw	b'00000000'		;alles uit
	movwf	PORTB
	return
latch
	bsf		PORTB,6			;pin 12 hoog dus resultaat zou te zien moeten zijn	
	return

  END

Dit alles zou goed moeten zijn als je het mij vraagt? Iemand een idee wat ik fout doe? De mclr pin van mijn pic hangt via een 10k aan de plus en ik heb een condensator van 100n tussen de plus en de min van de pic zitten

wie weet waar mijn fout zit?

grtz Bas

Een 74HC595 stuur je idd. aan door de data-ingang hoog of laag te maken, een opgaande flank op de seriële klokingang te zetten, en --na dit 8 maal herhaald te hebben-- een opgaande flank op de paralelle klokingang te plaatsen.
Nu ken ik geen snars van PIC-assembler, maar het komt me voor dat je programma niets anders doet dan nullen inklokken. Als die op de uitgangen verschijnen, zou ik zeggen dat alles OK is. 't Is natuurlijk wel moeilijk na te gaan wat er mis kan zijn, omdat je vergat te melden wat er wél aan de uitgangen verschijnt... :-)


latch
	bsf		PORTB,6			;pin 12 hoog dus resultaat zou te zien moeten zijn	
	return

je laat je latch aanstaan tot na de volgende klok als je alweer niewe data wil beginnen


    	bsf		PORTB,6			;pin 12 hoog dus resultaat zou te zien moeten zijn	
	
	nop           ;korte pauze na de latch 
	bcf	PORTB,6   ;latch uitzetten 
      return

zoiets meschien ?
@ pro hij zet met bitsetfile
portb,0 :) (maakt 1 ) dus hij verwacht 11111111 < ik moet beter lezen hij verwacht iets van 01010 * sould3mon denk dat ie met leds aan het spelen gaat ^_^

ooh midden in een klok data wissen is ook niet netjes !!!
zet die buiten een klok puls maak die klok aleen ff bsf > nop > bcf return en doe op het eind na de latch die clear pas !

[Bericht gewijzigd door sould3mon op ]

bsf en bcf maakt het verschil tussen de led aan en de led uit. En inderdaad ik laat de latch aanstaan. maar alsnog: dit is de enige code tot nu toe dus dan zou ik dat resultaat toch al wel moeten zien?

en de:

	movlw	b'00000000'		;alles uit
	movwf	PORTB

kan ik beter vervangen door gewoon een nop en dan bcf PORTB,1

Ik ga het morgen proberen!Alvast bedankt :D Je hoort wel weer van me.

grtz Bas

PS nieuwe ideejen blijven welkom :P

nu het kan wel tijdens de klok geloof ik als de hc bij opgande flank de data al inklokt
maar nog is dit niet zo handig om dit tijdens een clock te doen tevens mis ook een bcf na de laatste bit inclocken , ( als je mplab gebruikt check je logic analyzer dies bij dit soort dingen erg handig )

[spoiler]


      ..
	call	klok1
	bcf		PORTB,0
	call	latch
	movfw 	0b00000000	;reset
	movwf	PORTB	;all
	goto	main

;sub routines
klok1
	bsf		PORTB,1
	nop			;klok de bit(pin b,1 hoog)	
	bcf		PORTB,1	
	return
latch
	bsf	PORTB,6
	nop
	bcf	PORTB,6					;pin 12 hoog dus resultaat zou te zien moeten zijn	
	return

  END

[/spoiler]
het verschil tussen je eigen code en deze met logic analyzer zal je wel een eind opweg moeten helpen

[Bericht gewijzigd door sould3mon op ]

De beide klokingangen v/d 74HC595 reageren enkel op een positieve flank; wat je er verder mee doet maakt geen zier uit. Ook de snelheid waarmee alles gebeurt is niet kritisch wat het aansturen met een µC betreft: Philips geeft een maximale klokfrequentie van 100MHz aan.

@sould3mon: ik had ook basz's code beter moeten lezen. Alleen weet ik nog steeds niet wat z'n schuifregister doet: alle uitgangen hoog, laag of willekeurig naargelang de wind staat?

010101011101010101110101

ofzo de bedoeling was denk ik 01010101 maar de laatse bit werd niet uitgeklokt waardoor het er iig neit mooi en duidelijk uitziet

(waarshijnlijk eenled matrix shema gevonden ;) )

boven updated code onder oude
http://members.lycos.nl/souldemon/elec/logic.PNG

zo ik ben met al jullie tips aan de slag gegaan en het werkt nu:D (op mijn breadboard). Het probleem zat hem in de code en in de poorten die gebruikt werden. B.6 is niet geschikt als latch poort. vraag me niet waarom maar nu ik B.2 gebruik werkt alles zoals het hoort! Bedankt!

oke nu probleem(pje) hoe klok ik het tweede setje getallen in? eerst de latch hoog maken zodat het eerste setje ingeklokt wordt. Dan een delay(dat wil ik) en dan weer de latch hoog toch? of niet?

euhm hoe bedoel je persies ?
heb je 2 595's in "daisy chain" ? dus 16 bits ?

of bedoel je gewoon een nieuwe reeks in de chip ?

met daisy chain als je de chip in de juist aangesloten heb wacht met de latch tot aantal bits ingeklokt zijn

igg meschien dit eens doorlezen
http://www.mikroe.com/en/books/picbook/7_07chapter.htm
hoe je er een routine van kan maken om aan te roepen

ik bedoel dat ik eerst 8 bits inklok. dus bijvoorbeeld 11110111 maar daarna 00010000 in wil klokken. dat wil ie nog niet doen:S. Alleen het eerste setje van 8 bits is dus maar zichtbaar

ik zal die link eens door gaan lezen bedankt!:D

zou het ook verstandig zijn om pullup of pulldown weerstanden te gebruiken op de ingangen van de 74hc595?

Op 21 januari 2007 20:18:35 schreef basz:
ik bedoel dat ik eerst 8 bits inklok. dus bijvoorbeeld 11110111 maar daarna 00010000 in wil klokken. dat wil ie nog niet doen:S. Alleen het eerste setje van 8 bits is dus maar zichtbaar

Dat wordt gokken: ofwel een software-fout, ofwel vergeet je de paralelle klokingang hoog te maken voor je hem weer laag maakt. Tip: hang tijdelijk een LEDje met gepaste weerstand aan QH', dan heb je ook een visuele indicatie van wat er in het schuifregister zelve gebeurt.

Op 21 januari 2007 20:20:10 schreef remy:
zou het ook verstandig zijn om pullup of pulldown weerstanden te gebruiken op de ingangen van de 74hc595?

dit idee had ik ook al. ga ik ff testen.

@pros software fout ben ik ook bang voor.maar wat bedoel jij met de parallele klokingang? Want zoals ik het zie. Je hebt een ingang waarop je het signaal (hoog of laag) aanbied. Je hebt een ingang waarmee je het aangeboden signaal echt inklokt. Je hebt een ingang waarmee je al het ingeklokte spul zichtbaar maakt(de latch)

welk bedoel jij met de parallele klokingang? En zou jij even simpel willen laten zien hoe je een nieuw setje bits inklokt? bijvoorbeeld

signaal aanbieden op pin 14(hoog of laag)
inklokken op pin 12(hoog signaal)
dit hier boven acht keer
dan de latch pin 14 hoog

en hoe dan verder voor het volgende setje? gewoon weer hetzelfde verhaal opnieuw?

trouwens dat ledje is een goed idee maar dan moet ik de nop's even vervangen door delay's van een halve seconde ofzowiets

Ik bedoel de latch (die de bits van het serieel schuifregister op de paralelle D-buffers plaatst, pin 12 dus. Waarom die chipbakkers telkens weer andere benamingen gebruiken, is me een raadsel). En, om mezelf te verbeteren, je moet hem laag maken, vóór je hem terug hoog kan maken om je bits te latchen. Tenandere, je kan dit --om te testen-- ook doen na iedere seriele klokpuls (op pin 11); dan moet je de bitjes telkens een plaats zien opschuiven.
Wat pull-up weerstanden betreft: noodzakelijk als je stuurt met open-collector uitgangen; verder zie ik weinig nut.

[Toevoeging]
Bediening:


Paralelle klokingang laag maken (pin 12)
(8 x) {
  Seriele klokingang laag maken (pin 11)
  Bit klaarzetten op de data-ingang (pin 14)
  Seriele klokingang hoog maken (pin 11)
}
Paralelle klokingang hoog maken (pin 12)

Bij serieschakeling van meerdere IC's de lus uitbreiden tot 16x, 24x, enz. en dan pas alles gelijktijdig latchen.

[Bericht gewijzigd door pros op ]

dit is nu mijn code:

	; Assign your microcontroller
        LIST P=16F628

	; This include file makes programming more understandble
        include <P16F628.INC>
	
__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF

	; Disable warning : Register in operand not in bank 0
	ERRORLEVEL -302 

	; free 16F628 RAM starts at 0x20(depends on type microcontroller)
	CBLOCK 0x20
		cntr1
		cntr2
		cntr3
        ENDC

	;some define's to make things easier
	;These are for Bank Switching
	#define	BANK0	bcf	STATUS,RP0	; RAM PAGE 0
	#define	BANK1	bsf	STATUS,RP0	; RAM PAGE 1
	
	;startadres of the controller
	org 0x0000

; For using A0-A3 as digital I/O 
	movlw	D'7' 		; 
        movwf	CMCON		; Comparators off, all pins digital I/O 

; Reset Port values
        clrf	PORTA	
        clrf	PORTB
        
; define your pin direction (input/output)
	BANK1			; Switch to bank 1
        movlw	b'00000000'	;
        movwf	TRISA		; PORTA = all outputs
        movlw	b'00000000'	; 
        movwf	TRISB		; PORTB = all outputs
	BANK0			; Switch to bank 1
;--------------------------------------------------------------------------
; main loop
;--------------------------------------------------------------------------
main
	movlw	b'00000000'
	movwf	PORTB
	movlw	b'00000000'
	movwf	PORTA			;alles is nu laag

;eerste schuifregister vullen
	bsf		PORTB,0		;achtste led		
	call	klok1
	bcf		PORTB,0		;zevende led	
	call	klok1
	bsf		PORTB,0		;zesde led	
	call	klok1
	bcf		PORTB,0		;vijfde led
	call	klok1
	bsf		PORTB,0		;vierde led
	call	klok1
	bcf		PORTB,0		;derde led
	call	klok1
	bsf		PORTB,0		;tweede led	
	call	klok1
	bcf		PORTB,0		;eertse led	
	call	klok1

	call 	latch
	call	delay_500ms	;delay

;nu alles omdraaien
	bcf		PORTB,0		;achtste led		
	call	klok1
	bsf		PORTB,0		;zevende led	
	call	klok1
	bcf		PORTB,0		;zesde led	
	call	klok1
	bsf		PORTB,0		;vijfde led
	call	klok1
	bcf		PORTB,0		;vierde led
	call	klok1
	bsf		PORTB,0		;derde led
	call	klok1
	bcf		PORTB,0		;tweede led	
	call	klok1
	bsf		PORTB,0		;eertse led	
	call	klok1
	
	call	latch
	call	delay_500ms ;delay
	
	goto	main


;sub routines
klok1
	bsf		PORTB,1			;klok de bit(pin b,1 hoog)	
	nop
	bcf		PORTB,1
	return

latch
	bsf		PORTA,2			;latch is hoog dus resultaat zou te zien moeten zijn	
	nop	
	bcf		PORTA,2
	return

; Delay routines

delay_500ms
	movlw	D'5'
	goto	delay	


delay	movwf	cntr3
delay1	movlw	0x82
	movwf	cntr2
delay2	movlw	0xff
	movwf	cntr1
delay3	decfsz	cntr1, f 
	goto	delay3
	return

  END

en als je het mij vraagt klopt alles. In het begin zet ik alle pinnen van de pic laag. dan zet ik een bit klaar. en klok ik die in. na het inklokken wordt de klok-pin gelijk weer laag. Dat stukje doe ik 8 keer.
dan de latch (pin 12) hoog. en daarna gelijk laag. Dan een vertraging(de delay_500ms) en dan weer alles van voor af aan? wat doe ik fout? want nu is het resultaat dat al mijn leds aan zijn:P

Voor zover ik iets van die PIC-assembler begrijp, is je programma OK. Als je de clear-ingang (pin 10) met Vcc verbonden hebt, en de OE-ingang (pin 13) met GND, zou het gewoon moeten werken.

jep dat heb ik gedaan. En ja het programma doet het ook prima tot de delay. Dus alles na";nu alles omdraaien" werkt niet. Als ik dat gedeelte+de delay weghaal werkt alles wel gewoon. wat ik nu kan bedenken is dat mijn delay het niet doet maar dat lijkt me sterk. Ik test morgen wel weer verder.

zo even een update:P

het schuifregister werkt nu.(sould3emon en pros erg bedankt! :D) Ik had een gedeeltelijk werkende pic. waardoor de klok enzo het wel deed maar de latch niet(goed). En er zaten een paar fouten in de code. Voor iedereen die ooit nog via de zoekmaschine hier komt zal ik ff mijn nu nog belabberde code neergooien. Met deze code stuur ik drie schuifregisters aan

	; Assign your microcontroller
        LIST P=16F628
	; This include file makes programming more understandble
        include <P16F628.INC>
__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF
	; Disable warning : Register in operand not in bank 0
	ERRORLEVEL -302 
	; free 16F628 RAM starts at 0x20(depends on type microcontroller)
	CBLOCK 0x20
		cntr1
		cntr2
		cntr3
        ENDC
	;some define's to make things easier
	;These are for Bank Switching
	#define	BANK0	bcf	STATUS,RP0	; RAM PAGE 0
	#define	BANK1	bsf	STATUS,RP0	; RAM PAGE 1

	#define	schuifreg1	PORTB,0	;dit is dus pin 14 van het eerste schuifregister
	#define	klokingang1	PORTB,1	;klokingang van eerste schuifregister(pin 11)
	#define	latch1		PORTA,2 ;dit is de latch

	#define	schuifreg2	PORTB,2	
	#define	klokingang2	PORTB,3

	#define	schuifreg3	PORTB,4	
	#define	klokingang3	PORTB,5	

	;startadres of the controller
	org 0x0000
; For using A0-A3 as digital I/O 
	movlw	D'7' 		; 
        movwf	CMCON		; Comparators off, all pins digital I/O 
; Reset Port values
        clrf	PORTA	
        clrf	PORTB      
; define your pin direction (input/output)
	BANK1			; Switch to bank 1
        movlw	b'11111000'	;
        movwf	TRISA		; PORTA = all inputs, 0-3 are outputs
        movlw	b'00000000'	; 
        movwf	TRISB		; PORTB = all outputs
	BANK0			; Switch to bank 1
;--------------------------------------------------------------------------
; main loop
;--------------------------------------------------------------------------
main
	movlw	b'00000000'
	movwf	PORTB
	movlw	b'00000000'
	movwf	PORTA			;alles is nu laag

;eerste schuifregister vullen
	bcf		schuifreg1	
	call	klok1
	bsf		schuifreg1	
	call	klok1
	bcf		schuifreg1	
	call	klok1
	bsf		schuifreg1	
	call	klok1
	bcf		schuifreg1	
	call	klok1
	bsf		schuifreg1	
	call	klok1
	bcf		schuifreg1	
	call	klok1
	bsf		schuifreg1	
	call	klok1
;tweede schuifregister vullen
	bsf		schuifreg2
	call	klok2
	bcf		schuifreg2
	call	klok2
	bsf		schuifreg2
	call	klok2
	bcf		schuifreg2
	call	klok2	
	bsf		schuifreg2
	call	klok2
	bcf		schuifreg2
	call	klok2
	bsf		schuifreg2
	call	klok2
	bcf		schuifreg2
	call	klok2
;derde schuifregister vullen
	bsf		schuifreg3
	call	klok3
	bcf		schuifreg3
	call	klok3
	bsf		schuifreg3
	call	klok3
	bcf		schuifreg3
	call	klok3	
	bsf		schuifreg3
	call	klok3
	bcf		schuifreg3
	call	klok3
	bsf		schuifreg3
	call	klok3
	bcf		schuifreg3
	call	klok3
	
	call	latch
;--------------------------------------------------------
;nu alles omgekeerd
;eerste schuifregister vullen
	bsf		schuifreg1	
	call	klok1
	bcf		schuifreg1	
	call	klok1
	bsf		schuifreg1	
	call	klok1
	bcf		schuifreg1	
	call	klok1
	bsf		schuifreg1	
	call	klok1
	bcf		schuifreg1	
	call	klok1
	bsf		schuifreg1	
	call	klok1
	bcf		schuifreg1	
	call	klok1
;tweede schuifregister vullen
	bcf		schuifreg2
	call	klok2
	bsf		schuifreg2
	call	klok2
	bcf		schuifreg2
	call	klok2
	bsf		schuifreg2
	call	klok2
	bcf		schuifreg2
	call	klok2	
	bsf		schuifreg2
	call	klok2
	bcf		schuifreg2
	call	klok2
	bsf		schuifreg2
	call	klok2
;derde schuifregister vullen
	bcf		schuifreg3
	call	klok3
	bsf		schuifreg3
	call	klok3
	bcf		schuifreg3
	call	klok3
	bsf		schuifreg3
	call	klok3
	bcf		schuifreg3
	call	klok3	
	bsf		schuifreg3
	call	klok3
	bcf		schuifreg3
	call	klok3
	bsf		schuifreg3
	call	klok3

	call	latch
	goto	main

;subroutines
klok1
	bsf		klokingang1			;klok de bit(pin b,1 hoog)
	nop
	bcf		klokingang1
	return
klok2
	bsf		klokingang2
	nop
	bcf		klokingang2
	return
klok3
	bsf		klokingang3
	nop
	bcf		klokingang3
	return
latch
	bsf		latch1			;latch is hoog dus resultaat zou te zien moeten zijn
	call	delay_300ms
	bcf		PORTA,1
	return

	goto	main

;--------------------------
; Delay routines
;--------------------------
delay_100ms
	movlw	D'1'
	goto	delay	
delay_300ms
	movlw	D'3'
	goto	delay	
delay_500ms
	movlw	D'5'
	goto	delay	
delay_1s
	movlw	D'10'
	goto	delay	

delay	movwf	cntr3
delay1	movlw	0x82
	movwf	cntr2
delay2	movlw	0xff
	movwf	cntr1
delay3	decfsz	cntr1, f 
	goto	delay3
	decfsz	cntr2, f
        goto	delay2
	decfsz	cntr3, f
        goto	delay1
	return

        END

Voor de liefhebbers eentje met een Avr geschreven in gcc.
Deze laat gedurende de for-loop er steeds een ledje bij laten branden.
Met 1 schuifregister.


#include <avr/io.h>
#include <util/delay.h>
/*
Atmega8 en 74HC595

PC0(pin 22) = Data(14)
PC1(pin 23) = Latch(12)
PC2(pin 24) = Clock(11)
*/

// delay routine gejat van marcel ;)
void delay_ms(unsigned int t)
{
  while(t > 0)
  {    
    /*
    _delay_loop_2 doorloopt 4 clock cycles
    per tel. 4 x 250 = 1000 cycles
    bij 1Mhz clock is dit +/- 1ms delay
    zie ook de AVR libc documentatie
    */
    _delay_loop_2(250);
    t--;
  }  
}


int main()
{
unsigned char i;
unsigned char j;
	delay_ms(100); 				//stabilisatie

  	DDRC |= (1 << PC0);  		//Deze drie poorten als uitgang
	DDRC |= (1 << PC1);
    DDRC |= (1 << PC2); 
   
  
  for(j=0; j<8; j++)			// Deze lus wordt 9 keer aangeroepen
  {
    
  	PORTC &= ~(1 << PC1);		// Latch laag	
	
	for(i=0; i<8; i++)			// Deze lus 
	{

		PORTC &= ~(1 << PC2);	// Clock laag
				
  		
		if(j >= i)				// Ledje na ledje aan
		{
			PORTC |= (1 << PC0);// Data hoog
		}
		else
		{
			PORTC &= ~(1 << PC0);// Data laag
		}
		
		delay_ms(100);			// vertraging voor het oog
    	PORTC |= (1 << PC2);	// Clock hoog			
	}
	PORTC &= ~(1 << PC2);		// Clock laag				 
	PORTC |= (1 << PC1);		// Latch hoog
  }  
}

haha erg handig om ook hier te posten. Inmiddels heb ik mijn zo goed als complete code af.

	; Assign your microcontroller
        LIST P=16F628
	; This include file makes programming more understandble
        include <P16F628.INC>
__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF
	; Disable warning : Register in operand not in bank 0
	ERRORLEVEL -302 
	; free 16F628 RAM starts at 0x20(depends on type microcontroller)
	CBLOCK 0x20
		Var1
		Var2
		Var3
		bits1
		bits2
		bits3
		cntr1
		cntr2
		cntr3
		herhalen
        ENDC
	;some define's to make things easier
	;These are for Bank Switching
	#define	BANK0	bcf	STATUS,RP0	; RAM PAGE 0
	#define	BANK1	bsf	STATUS,RP0	; RAM PAGE 1

	#define	data1		PORTB,0	;dit is dus pin 14 van het eerste schuifregister(data pin)
	#define	klok1		PORTB,1	;klokingang van eerste schuifregister(pin 11)
	#define	data2		PORTB,2	;pin 14 van het 2e schuifregister
	#define	klok2		PORTB,3	;pin 11 van het 2e schuifregister
	#define	data3		PORTB,4	;pin 14 van het 3e schuifregister
	#define	klok3		PORTB,5	;pin 11 van het 3e schuifregister
	#define	latch1		PORTA,2 ;dit is de latch van alle schuifregisters
	;startadres of the controller
	org 0x0000
; For using A0-A3 as digital I/O 
	movlw	D'7' 		; 
        movwf	CMCON		; Comparators off, all pins digital I/O 
; Reset Port values
        clrf	PORTA	
        clrf	PORTB      
; define your pin direction (input/output)
	BANK1			; Switch to bank 1
        movlw	b'11111000'	;
        movwf	TRISA		; PORTA = all inputs, 0-3 are outputs
        movlw	b'00000000'	; 
        movwf	TRISB		; PORTB = all outputs
	BANK0			; Switch to bank 1
;--------------------------------------------------------------------------
; main loop
;--------------------------------------------------------------------------
main		 

	movlw	D'5'
	movwf	herhalen
knipperen
			;87654321	nummer van de led
	movlw	b'10101010'	; zet waarde in w
	call	schuifregister1
	movlw	b'10101010'
	call	schuifregister2
	movlw	b'10101010'
	call	schuifregister3
	call	latch
	call	delay_300ms

	movlw	b'01010101'
	call	schuifregister1
	movlw	b'01010101'
	call	schuifregister2
	movlw	b'01010101'
	call	schuifregister3
	call	latch
	call	delay_300ms

	decfsz	herhalen, f
	goto	knipperen
	
;--------------------------
	movlw	D'5'
	movwf	herhalen
cirkel
	movlw	b'00000000'
	call	schuifregister1
	movlw	b'00001000'
	call	schuifregister2
	movlw	b'00000000'
	call	schuifregister3
	call	latch
	call	delay_300ms


	movlw	b'11100000'
	call	schuifregister1
	movlw	b'10011100'
	call	schuifregister2
	movlw	b'00000011'
	call	schuifregister3
	call	latch
	call	delay_300ms


	movlw	b'11111111'
	call	schuifregister1
	movlw	b'11111111'
	call	schuifregister2
	movlw	b'11111111'
	call	schuifregister3
	call	latch
	call	delay_300ms
	
	decfsz	herhalen, f
	goto	cirkel
;------------------
	movlw	D'5'
	movwf	herhalen
aanuit
	movlw	b'00000000'
	call	schuifregister1
	movlw	b'00000000'
	call	schuifregister2
	movlw	b'00000000'
	call	schuifregister3
	call	latch
	call	delay_300ms

	movlw	b'11111111'
	call	schuifregister1
	movlw	b'11111111'
	call	schuifregister2
	movlw	b'11111111'
	call	schuifregister3
	call	latch
	call	delay_300ms
	
	decfsz	herhalen, f
	goto	aanuit

	goto	main


schuifregister1
		movwf	Var1		; zet de waarde vanuit w in Var1. dit is het getal wat geklokt moet worden
		movlw	D'8'		;zet de waarde 8 in het werkregister
		movwf	bits1		;sla de waarde 8 uit w op in bits1 dis is het aantal bits wat ingeklokt moet worden
loop1
		rlf		Var1,1		;rotate left trough carry en sla het resultaat op in Var1. Eerste bit zit nu in de carry 
		btfss	STATUS, C	; lees de carry uit. Is carry= 1?
		bcf		data1		;zo nee, zet de datalijn naar 0
		btfsc	STATUS, C	; is carry 0?
		bsf		data1		;zo nee data is 1

		bsf		klok1
		nop		
		bcf		klok1		;bitje is nu ingeklokt

		decfsz	bits1,f		;verlaag bits1 met één totdat die nul is
		goto	loop1		; is bits1 0? dan "return" zo nee ga naar loop1
		return

schuifregister2
		movwf	Var2		
		movlw	D'8'	
		movwf	bits2
loop2	rlf		Var2,1		
		btfss	STATUS, C	
		bcf		data2		
		btfsc	STATUS, C	
		bsf		data2		
		bsf		klok2
		nop		
		bcf		klok2	
		decfsz	bits2,f	
		goto	loop2	
		return

schuifregister3
		movwf	Var3		
		movlw	D'8'	
		movwf	bits3
loop3	rlf		Var3,1		
		btfss	STATUS, C	
		bcf		data3		
		btfsc	STATUS, C	
		bsf		data3		
		bsf		klok3
		nop		
		bcf		klok3	
		decfsz	bits3,f	
		goto	loop3	

		return
latch
		bsf		latch1
		nop
		bcf		latch1
		return
;--------------------------
; Delay routines
;--------------------------
delay_100ms
	movlw	D'1'
	goto	delay	
delay_300ms
	movlw	D'3'
	goto	delay	
delay_500ms
	movlw	D'5'
	goto	delay	
delay_1s
	movlw	D'10'
	goto	delay	

delay	movwf	cntr3
delay1	movlw	0x82
	movwf	cntr2
delay2	movlw	0xff
	movwf	cntr1
delay3	decfsz	cntr1, f 
	goto	delay3
	decfsz	cntr2, f
    goto	delay2
	decfsz	cntr3, f
     goto	delay1
	return

		END

Zoals je ziet stuur ik 24 leds aan. Straks worden dit 125 leds. Ik gebruik het geheel namelijk voor het aansturen van mijn 5*5*5 led kubus. Nu kan ik nog maar een verdieping maar straks met nog een schuifregister of een 4017 kan ik 5 verdiepingen aansturen