Darkstar3000
New Member
So I have this question
Write an assembly language program for PIC 16F684 to switch ON LEDs to count in binary from 0 to 7. Allow a delay of about 1second between the change.Write the program, verify its operation by executing it
I wrote the program but I'm not sure if it does the job correctly since I'm not really comfortable with assembly language so can anyone take a look at it and tell me if it's doing what the question specifies and if my comments are correct. I can't test it out as I'm currently on vacation so I just need a verification of my work.
I'm using MPLAB V8.84
Thanks in advance.
Here's a link to the asm if the code is messy **broken link removed**
Write an assembly language program for PIC 16F684 to switch ON LEDs to count in binary from 0 to 7. Allow a delay of about 1second between the change.Write the program, verify its operation by executing it
I wrote the program but I'm not sure if it does the job correctly since I'm not really comfortable with assembly language so can anyone take a look at it and tell me if it's doing what the question specifies and if my comments are correct. I can't test it out as I'm currently on vacation so I just need a verification of my work.
I'm using MPLAB V8.84
Thanks in advance.
Code:
; WRITTEN BY
; DATE 28/04/12
; FILE SAVED AS BinaryCounter.asm
; DEVICE PIC16F684
; FUNCTION PROGRAM COUNTS FROM 0 TO 7 IN BINARY
; ----------------------- EQUATES ------------------------------------
PORTA EQU 05h ;LABELS THE PORTA REGISTER AS "PORTA"
;DELAY COUNTERS
COUNT1 EQU 20h;
COUNT2 EQU 21h
;------------------------ CONSTANTS -----------------------------------------
;IDENTIFIES CONSTANTS FOR REQUIRED LEDS
;I/O for LEDS
#define TRIS_D0_D1 B'00001111' ; TRISIO SETTING FOR D0 AND D1
#define TRIS_D2_D3 B'00101011' ; TRISIO SETTING FOR D2 AND D3
; the LEDS
#define D0 B'00010000' ; D0 LED
#define D1 B'00100000' ; D1 LED
#define D2 B'00010000' ; D2 LED
#define D3 B'00000100' ; D3 LED
; ----------------------- MAIN PROGRAM ------------------------------------
START ORG 0X00 ;'ORG' SPECIFIES THE MEMORY LOCATION OF THE PROGRAM
; LED 0 ON
LOOP0
MOVLW TRIS_D0_D1; ;PUT 00001111 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D0 ;PUT 00010000 INTO W
MOVWF PORTA ;MOVE W ONTO PORTA
;Delay:
decfsz COUNT1,1 ;DECREASE THE VALUE OF COUNT1 BY 1
;AND SKIP NEXT LINE IF RESULT IS ZERO
goto LOOP0 ;IF COUNT1 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP0
decfsz COUNT2,1 ;DECRESE THE VALUE OF COUNT2 BY 1
;AND SKIP NEXT LINE IF RESULT IT ZERO
goto LOOP0 ;IF COUNT2 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP0
; LED 1 ON
LOOP1
CLRF PORTA; ;CLEAR THE CONTENTS OF PORTA
MOVLW TRIS_D0_D1; ;PUT 00001111 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D1 ;PUT 00100000 INTO W
MOVWF PORTA ;MOVE W ONTO PORTA
;Delay:
decfsz COUNT1,1 ;DECREASE THE VALUE OF COUNT1 BY 1
;AND SKIP THE NEXT LINE IF RESULT IS ZERO
goto LOOP1 ;IF COUNT1 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP1
decfsz COUNT2,1 ;DECREASE THE VALUE OF COUNT2 BY 1
goto LOOP1 ;GO TO LOOP1
; LED 1 & 2 ON
LOOP2
;1
CLRF PORTA; ;CLEAR THE CONTENTS OF PORTA
MOVLW TRIS_D0_D1 ;PUT 00001111 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D1 ;PUT 00100000 INTO W
MOVWF PORTA ;MOVE W ONTO PORTA
;2
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW TRIS_D2_D3 ;PUT 00101011 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D2 ;PUT 00010000 INTO W
MOVWF PORTA ;MOVE W ONTO PORTA
;Delay:
decfsz COUNT1,1 ;DECREASE THE VALUE OF COUNT1 BY 1
;AND SKIP THE NEXT LINE IF THE RESULT IS ZERO
goto LOOP2 ;IF COUNT IS ZERO,CARRY ON OTHERWISE
;GO TO LOOP 2
decfsz COUNT2,1 ;DECRESE THE VALUE OF COUNT2 BY 1
;AND SKIP THE NEXT LINE IF THE RESULT IS ZERO
goto LOOP2 ;IF COUNT2 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP2
; LED 3 ON
LOOP3
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW TRIS_D2_D3; ;PUT 00101011 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D3 ;PUT 00000100 INTO W
MOVWF PORTA ;MOVE W ONTO PORTA
;Delay:
decfsz COUNT1,1 ;DECREASE THE VALUE OF COUNT1 BY 1
;AND SKIP THE NEXT LINE IF THE RESULT IS ZERO
goto LOOP3 ;IF COUNT1 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP3
decfsz COUNT2,1 ;DECREASE THE VALUE OF COUNT2 BY 1
;AND SKIP THE NEXT LINE IF THE RESULT IS ZERO
goto LOOP3 ;IF COUNT2 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP3
; LED 3 & 1 ON
LOOP4
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW TRIS_D2_D3; ;PUT 00101011 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D3 ;PUT 00000100 INTO W
MOVWF PORTA ;MOVE W TO PORTA
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW TRIS_D0_D1 ;PUT 00001111 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D1 ;PUT 00010000 INTO W
MOVWF PORTA ;MOVE W ONTO PORTA
;Delay:
decfsz COUNT1,1 ;DECREASE THE VALUE OF COUNT1 BY 1
;AND SKIP THE NEXT LINE IF THE RESULT IS ZERO
goto LOOP4 ;IF COUNT1 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP4
decfsz COUNT2,1 ;DECREASE THE VALUE OF COUNT2 BY 1
;AND SKIP THE NEXT LINE IF THE RESULT IS ZERO
goto LOOP4 ;IF COUNT1 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP4
; LED 3 & 2 ON
LOOP5
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW TRIS_D2_D3 ;PUT 00101011 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D3 ;PUT 00000100 INTO W
MOVWF PORTA ;MOVE W TO PORTA
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW TRIS_D2_D3; ;PUT 00101011 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D2 ;00010000
MOVWF PORTA ;MOVE W TO PORTA
;Delay:
decfsz COUNT1,1 ;DECREASE THE VALUE OF COUNT1 BY 1
;AND SKIP THE NEXT LINE IF THE RESULT IS ZERO
goto LOOP5 ;IF COUNT1 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP5
decfsz COUNT2,1 ;DECREASE THE VALUE OF COUNT2 BY 1
;AND SKIP THE NEXT LINE IF THE RESULT IS ZERO
goto LOOP5 ;IF COUNT2 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP5
; LED 3 & 2 & 1
LOOP6
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW TRIS_D2_D3 ;PUT 00101011 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D3 ;PUT 00000100 INTO W
MOVWF PORTA ;MOVE W TO PORTA
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW TRIS_D2_D3 ;PUT 00101011 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR THE CONTENTS OF PORTA
MOVLW D2 ;PUT 00010000 INTO W
MOVWF PORTA ;MOVE W TO PORTA
CLRF PORTA ;CLEAR CONTENTS OF PORTA
MOVLW TRIS_D0_D1 ;PUT 00001111 INTO W
TRIS PORTA ;
CLRF PORTA ;CLEAR CONTENTS OF PORTA
MOVLW D1 ;PUT 00010000 INTO W
MOVWF PORTA ;MOVE W TO PORTA
;Delay:
decfsz COUNT1,1 ;DECREASE THE VALUE OF COUNT1 BY 1
;AND SKIP THE NEXT LINE IF THE RESULT IS ZERO
goto LOOP6 ;IF COUNT1 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP6
decfsz COUNT2,1 ;DECREASE THE VALUE OF COUNT2 BY 1
;AND SKIP THE NEXT LINE IF THE RESULT IS ZERO
goto LOOP6 ;IF COUNT2 IS ZERO, CARRY ON OTHERWISE
;GO TO LOOP6
END
Here's a link to the asm if the code is messy **broken link removed**
Last edited: