  title  "Down-Counter, by PEK  99.07.06"
; 16C84 Klockas på 4 MHz för rätt tider
; Anslut 2 transistorer (ex. BC327) med basen till PortA stift 1 och 2, 
; kollektorn till GND på 7 segm. displayerna och
; emittern till GND.
; Anslut 7 segm. displayerna till PortB stift 1 - 7 genom 220 Ohms
; motstånd.

  LIST P=16C84, R=DEC
  errorlevel 0,-305
  INCLUDE "P16C84.inc"

; Registers
  count_1       equ 12          ; ental
  count_2       equ 13          ; tiotal
  delay_1	equ 14		; väntetid för 2.5 ms
  delay_2	equ 15		
  delay_3	equ 16          ; antal loopar per sek att rita

  __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC

  PAGE
; Start of Program
  
  org           0
  goto Start


; Segmenten på 7-segm displayen
Segments         
  addwf         PCL
  nop
  retlw         0x3F            ; 0
  retlw         0x03            ; 1
  retlw         0x6D            ; 2
  retlw         0x67            ; 3
  retlw         0x53            ; 4
  retlw         0x76            ; 5
  retlw         0x7E            ; 6
  retlw         0x23            ; 7
  retlw         0x7F            ; 8
  retlw         0x73            ; 9


Start
  movlw		0x00		; PortB som output
  tris		PORTB

  movlw		0x1C		; PortA som output på stift 1 och 2
  tris		PORTA

Loop  
  movlw         10              ; Initiera tiotal = 10-1 (9)
  movwf         count_2

Tiotal  
  movlw         10              ; Initiera ental = 10-1 (9)
  movwf         count_1
Ental
  call		Output		; Ut på displayen och vänta 
  decfsz        count_1		; Räknar ner ental
    goto        Ental

  decfsz        count_2		; Räknar ner tiotal
    goto        Tiotal

  goto Loop


; Delay-rutin med Output, ungefär 1 sek då kretsen klockas med 4 MHz.
Output
  movlw         198
  movwf         delay_3

Outp_Loop
  bcf		PORTA, 0        ; 1'a biten låg
  bsf		PORTA, 1	; 2'a biten på PortA går hög.
  movf          count_2, w      ; Tiotal ut på displayen
  call          Segments
  movwf		PORTB		; Siffra på port B
  call		Dlay

  bcf		PORTA, 1        ; 2'a biten låg
  bsf		PORTA, 0	; 1'a biten på PortA går hög.
  movf          count_1, w      ; Ental ut på displayen
  call          Segments
  movwf		PORTB		; Siffra på port B
  call		Dlay

  decfsz        delay_3
    goto        Outp_Loop

  return


; Delay på 2.5 msek då kretsen klockas med 4 MHz.
Dlay
  movlw  65			
  movwf  delay_1
  movlw  4
  movwf  delay_2
Dlay_Loop
  decfsz delay_1
   goto  Dlay_Loop
  decfsz delay_2
   goto  Dlay_Loop

  return


  end

