# Need help starting with 16F877

Status
Not open for further replies.

#### janosandi

##### Full Member level 4
hello Guys
i was using 12cXXX & 16FXXX & it was good for my small projects But now i need ore stuff of it so i've decided to move to 16F877.
but im facing problem starting with it at start i couldnt set trisA pins & mplab give me errors when i stat to compile it
im using assembly
can anyone help me with any assembly code to light a led on any port ?
ur help will b appriciated
John

#### ismbn

##### Full Member level 3
Hello janosandi
using assembly is good but its its very old now. its very difficult to read the program flow,also you will always face this kind challenges when Ever you'll change the controller...
so my opinion is to Use C as your programming language.
its not that much difficult also is you know the assembly.
this link tech you how to code for en led to Blink

OR this

and The following code do the same but using C
Code:
#include<xc.h>
#include<Delays.h>
#define LED1 RB0

void main(){
PORTB = 0x00; /// all Pin of PORTB to 0
TRISB = 0x00; /// to make all PORTB PIN output

while(1){
LED1 = ~LED1; // Toggle the State of LED Every time
Delay_ms(50)
Delay_ms(50)
Delay_ms(50)
Delay_ms(50)
}

}
and if you want to read the Digital input PIN
Code:
#include<xc.h>
#include<Delays.h>
#define LED1 RB0
#define Key   RB1

void main(){
PORTB = 0x00; /// all Pin of PORTB to 0
TRISB0 = 0;   /// OUTPUT
TRISB1 = 1;   /// INPUT

while(1){
if (key == 1){
LED1 = ~LED1; // Toggle the State of LED Every time
}
}

}
so when ever you connect PORTB pin 1 to VCC the PORTB0 will toggle its State

for more tutorial you can go to
this site

All The Best
HappyCoding :thumbsup:

janosandi

### janosandi

Points: 2

#### janosandi

##### Full Member level 4
thx Guys
the problem is tht i've used to use the Assembly code & i know about basic but i couldnt find free version of PICBASICi & in my country its hard & expensive to get one

- - - Updated - - -

now i got an assembled simple program now i can go on programming

thx Again Guys

#### pjmelect

To set port A pins you first of all have to disable the A-D analogue controller.

Code:
	bsf	STATUS,5            ;Switch to Bank 1
movlw	00h	          ;Set the Port A pins to outputs
movwf	TRISA
movlw	0ffh	          ;disable a-d
bcf	STATUS,5             ;Switch back to Bank 0

Last edited by a moderator:

#### PA3040

Assembly is very simple and easy

Dear janosandi This program is written in mind and untested
MCU PIC 16f877a
Crystal is used 4Mhz
PORTC bit 7 LED will ON

Code:
#include <p16f877a.inc>
__config 3f39
Start    goto    main
main        call    sys_init
goto    loop

sys_init    clrf    PORTC
bsf    STATUS,5
bcf    TRISC,7
bcf    STATUS,5
clrf    PORTC
return
end

#### janosandi

##### Full Member level 4
thx Guys its Done till Now
sure i'll ask for more help later with this

i had a mistake with the inc File

#### janosandi

##### Full Member level 4
Hi Guys
thx for your ideas it was usefull & now im starting to read about the 4 Ports of the 16F877
my questions is can i use the 4 ports as digital inputs or outputs ?
my project needs a port for 7 segment displays(wich i've used portB) ,atleast 5 inputs & 8 ouputs,
what you suggest?

Last edited:

#### abidr

##### Full Member level 5
But it depends how you make the circuit. 7 segment require 1 port for digits (unless you could use a shift register), 1 I/O for each segment.
Say you want to use 4 segments and 1 A/D. PORT A and PORT B would do the job easily.
Now you need 8 Outputs port C or D would be enough, and same goes to 5 inputs.
Go through the data sheet of 16F877A it is a comprehensive document, answers to lot of your future questions and questions are in there.

#### janosandi

##### Full Member level 4
i tried alot with the documents but im stopping somewhere
wht i should disable to activate the digital pins on ports C & D ?

#### abidr

##### Full Member level 5
from the datasheet
PORTC and the TRISC Register
PORTC is an 8-bit wide, bidirectional port. The corresponding data direction register is TRISC. Setting a TRISC bit (= 1) will make the corresponding PORTC pin an input (i.e., put the corresponding output driver in a High-Impedance mode). Clearing a TRISC bit (= 0) will make the corresponding PORTC pin an output (i.e.,put the contents of the output latch on the selected pin).

Code:
TRISC = 0b00001111; /// will make Port C4:7 outputs and C0:3 inputs

Same with PORTD

#### janosandi

##### Full Member level 4
i've read about it & already used port C but i'll include small Counter program to drive 2 7segment displays
Which it works on 16f628 but its not here
would u plz check for corrections
Code:
	List	 P=16F877A
include <P16F877A.inc>

__CONFIG _CP_OFF& _WRT_OFF& _CPD_OFF& _LVP_OFF& _BODEN_OFF& _PWRTE_ON& _WDT_OFF& _XT_OSC

org 	0x00

temp1		equ 20h	;for delay
temp2		equ 21h	;for delay
SwUp		equ 22h	;
SwDwn		equ	23h	;
units		equ	24h	;
tens		equ	25h	;
Sw_Flag		equ	26h	;

status		equ	0x03
rp1			equ	0x06
rp0			equ	0x05
portA		equ 0x05
portB		equ 0x06
portC		equ 0x07

option_reg	equ 0x81

;****************************************************************
;Beginning of program
;****************************************************************

goto	SetUp			;goto SetUp

;****************************************************************
;* Delay 10mS 		10 x 1,000uS			*
;****************************************************************
D_10mS	movlw	0Ah
movwf	temp2
D_a		nop
decfsz temp1,1
goto 	D_a
decfsz temp2,1
goto 	D_a
retlw 	00

;****************************************************************
;* port A and B initialisation					*
;****************************************************************
SetUp	bsf		STATUS,RP0
movlw	b'00000000'	;turn portB all outputs connected to 7segments
movwf	TRISB
movlw	b'00000011'	;turn portC 0,1 as inputs 2,3 as outputs to drive the segments
movwf	TRISC
bcf		STATUS,RP0
clrf 	portB
clrf	units
clrf	tens
clrf	Sw_Flag
goto 	Main

Up		btfsc	Sw_Flag,2
retlw	00
bsf		Sw_Flag,2
incf	units,1
movlw	0Ah			;put 10 into w
xorwf	units,0		;compare units file with 10
btfss	status,2	;zero flag in status file. Will be set if units is 10
retlw	00
clrf	units
incf	tens,1
movlw	0Ah			;put 10 into w
xorwf	tens,0		;compare units file with 10
btfsc	status,2	;zero flag in status file. Will be set if tens is 10
clrf	tens
retlw	00			;display passes 99 but not below 0

Dwn		btfsc	Sw_Flag,3
retlw	00
bsf		Sw_Flag,3
decf	units,1
movlw	0FFh		;put FFh into w
xorwf	units,0		;compare units file with FFh
btfss	status,2	;zero flag in status file. Will be set if units is 10
retlw	00
movlw	09
movwf	units		;put 9 into units file
decf	tens,1
movlw	0FFh		;put 0FFh into w
xorwf	tens,0		;compare tens file with 0FFh
btfsc	status,2	;zero flag in status file. Will be set if tens is 0FFh
goto	\$+2			;tens file is 0FFh
retlw	00
clrf	tens
clrf	units
retlw	00			;display  not below 0

Main	btfss	portC,0			;test switch-press for UP
call	Up				;UP switch pressed
btfss	portC,1			;test switch-press for Down
call	Dwn				;Down switch pressed
movlw	b'00000100'		;Make RC2 HIGH for units drive
movwf	portC
movf	units,0			;copy unit value into w
call	table			;unit display value will return in w
movwf	portB			;output units value
call	D_10mS			;call delay
clrf	portB			;clear display
movlw	b'00001000'		;Make RC3 HIGH for tens drive
movwf	portC
movf	tens,0			;copy tens value into w
call	table			;tens display value will return in w
movwf	portB			;output tens value
call	D_10mS			;call delay
clrf	portB			;clear display
btfsc	portC,0			;bit will be zero when sw is pressed
bcf		Sw_Flag,2
btfsc	portC,1			;bit will be zero when sw is pressed
bcf		Sw_Flag,3
goto	Main

retlw   b'00111111'     ; "0"   -|F|E|D|C|B|A
retlw   b'00000110'     ; "1"   -|-|-|-|C|B|-
retlw   b'01011011'     ; "2"   G|-|E|D|-|B|A
retlw   b'01001111'     ; "3"   G|-|-|D|C|B|A
retlw   b'01100110'     ; "4"   G|F|-|-|C|B|-
retlw   b'01101101'     ; "5"   G|F|-|D|C|-|A
retlw   b'01111101'     ; "6"   G|F|E|D|C|-|A
retlw   b'00000111'     ; "7"   -|-|-|-|C|B|A
retlw   b'01111111'     ; "8"   G|F|E|D|C|B|A
retlw   b'01101111'     ; "9"   G|F|-|D|C|B|A

end

#### PA3040

This is working
Code:
_CONFIG _CP_OFF& _WRT_OFF& _CPD_OFF& _LVP_OFF& _BODEN_OFF& _PWRTE_ON& _WDT_OFF& _XT_OSC

Or else use __config 3f39 for ( 4Mhz)

#### janosandi

##### Full Member level 4
wht program is this ?
any free version of pic basic is there ?
im using mpasm anyway thx

- - - Updated - - -

thx guys
now im sure everything with ports is ok for me
i've used a small code to test if PORTC works as i want
Code:
Main2	clrf	portC
btfss	portC,0
call	on1
BTFSS	portC,1
call	on2
goto	Main2

on1		movlw	b'00001000'
movwf	portC
retlw 	0x00

on2		movlw	b'00000100'
movwf	portC
retlw	0x00
& its done Now lets move to the main problem
in the code which i've included before i have a 2 digits counter which its working on 16f628
why its not working with 16f877 ? at the start r the files at 20h to 26h free to use for variables?
any idea will help
thx guys

#### PA3040

=janosandi;
& its done Now lets move to the main problem
in the code which i've included before i have a 2 digits counter which its working on 16f628
why its not working with 16f877 ? at the start r the files at 20h to 26h free to use for variables?
any idea will help
thx guys

Tray to change configuration word as i mention in the above and what is the Crystal is using for your board

#### janosandi

##### Full Member level 4
im using 4mhz Crystal & other functions is working great
i just want to convert the pic16f628 code into 16f877
just converted the ports i thing there is something else with the registers which i've used for variables
or if u have 2 segments counter ready for this will b great

#### pjmelect

One possible problem, you have not shown your circuit diagram, have you got pull up resistors on the switches on PortB? alternatively instead of adding pull up resistors you can enable the internal pull up resistors in your code RBPU (OPTION_REG<7>) and set it to low to enable the pull up resistors.

#### pic.programmer

PIC16F628 doesn't have ADC and PIC16F877 has ADC and so you have to disable ADC pins and configure them as digital IO pins.

#### PA3040

im using 4mhz Crystal & other functions is working great
i just want to convert the pic16f628 code into 16f877
just converted the ports i thing there is something else with the registers which i've used for variables
or if u have 2 segments counter ready for this will b great

What is your Seven segments are displaying, Is it showing at least Zero digit on both Seven segments. can we see your hardware or circuit diagram as explained by pjmelect

#### janosandi

##### Full Member level 4
its ok now it was a silly problem i wouldnt notice about it
im connecting positive to inputs when im using btfss
so its Solved now
its solved atleast now & i'll include a pic of my development board today
thx for all comments & help

John

Status
Not open for further replies.