LIST P=16F877
#INCLUDE <P16F877.INC>
errorlevel -302
errorlevel -207
__CONFIG _CP_OFF & _PWRTE_ON & _XT_OSC & _WDT_OFF
;==========VARIABLE===============
CBLOCK 0X20
NUM1 ;FOR NUMBER
NUM2 ;FOR NUMBER
NUM3 ;FOR NUMBER
NUM4 ;FOR NUMBER
D1
D2
D3
D4
ENDC
ORG 0X00
GOTO START
TEXT CALL LCD_INIT
BSF PORTB,2 ;R/S SET TO '1'
MOVLW H'45'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'6E'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'74'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'65'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'72'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'20'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'43'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'6F'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'64'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'65'
MOVWF PORTD
CALL CLOCK_E
RETLW 0X00
WRONG CALL LCD_INIT
CALL LCD_LINE2
BSF PORTB,2 ;R/S SET TO '1'
MOVLW H'57'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'72'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'6F'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'6E'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'67'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'20'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'43'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'6F'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'64'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'65'
MOVWF PORTD
CALL CLOCK_E
RETLW 0X00
CORRECT CALL LCD_INIT
CALL LCD_LINE2
BSF PORTB,2 ;R/S SET TO '1'
MOVLW H'43'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'6F'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'72'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'72'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'65'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'63'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'74'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'20'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'43'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'6F'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'64'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'65'
MOVWF PORTD
CALL CLOCK_E
RETLW 0X00
START BSF STATUS,RP0
MOVLW B'00000001'
MOVWF TRISB
MOVLW B'00000000'
MOVWF TRISD
BCF STATUS,RP0
CLRF PORTB
CLRF PORTD
GOTO BEGIN
BEGIN CALL TEXT
BTFSC PORTB,0 ;SKIP IF ENTER=1
GOTO BEGIN ;IF ENTER=0 GO TO START
ONE MOVLW D'1'
MOVWF NUM1 ;SET NUM1=1
SUBLW B'00000001' ;NUM1-1
BTFSS STATUS,Z ;NUM1-1=0?
GOTO TWO ;YES, GO TO NEXT NUMBER
GOTO WRONG
TWO MOVLW D'2'
MOVWF NUM2 ;SET NUM1=2
SUBLW B'00000010' ;NUM2-2
BTFSS STATUS,Z ;NUM2-2=0?
GOTO THREE ;YES, GO TO NEXT NUMBER
GOTO WRONG
THREE MOVLW D'3'
MOVWF NUM3 ;SET NUM1=3
SUBLW B'00000011' ;NUM3-3
BTFSS STATUS,Z ;NUM3-3=0?
GOTO FOUR ;YES, GO TO NEXT NUMBER
GOTO WRONG
FOUR MOVLW D'4'
MOVWF NUM4 ;SET NUM1=4
SUBLW B'00000100' ;NUM4-4
BTFSS STATUS,Z ;NUM4-4=0?
GOTO WRONG ;NO, RETURN TO START
GOTO CORRECT
BSF PORTB,5
LCD_INIT BCF PORTB,2
MOVLW B'00110000'
MOVWF PORTD ;FUNCTION SET: 8 BIT INTERFACE
CALL CLOCK_E
MOVLW B'00001100'
MOVWF PORTD ;DISPALY & CURSOR: SET TO DISPLAY ON; CURSOR UNDERLINE OFF; CURSOR BLINK OFF
CALL CLOCK_E
MOVLW B'00111000'
MOVWF PORTD ;FUNCTION SET: 8 BIT; 2 LINE MODE; 5X10 DOT FORMAT
CALL CLOCK_E
MOVWF B'00000001'
MOVWF PORTD ;CLEAR DISPLAY
CALL CLOCK_E
MOVLW B'00000110'
MOVWF PORTD ;CHARACTER ENTRY MODE: INCREMENT; DISPLAY SHIFT ON
CALL CLOCK_E
RETLW 0X00
LCD_LINE2 BCF PORTB,2 ; R/S SET TO '0'
MOVLW B'11000000'
MOVWF PORTD ; JUMP TO 2ND LINE
CALL CLOCK_E
RETLW 0X00
CLOCK_E BSF PORTB,1
CALL DELAY2
BCF PORTB,1
RETLW 0X00
DELAY1 MOVLW D'130'
MOVWF D2
MOVLW D'221'
MOVWF D1
LOOP1 DECFSZ D1,1
GOTO LOOP1
DECFSZ D2,1
GOTO LOOP1
RETLW 0X00
DELAY2 MOVLW D'13' ;DELAY 10ms
MOVWF D4
MOVLW D'251'
MOVWF D3
LOOP2 DECFSZ D3,1
GOTO LOOP2
DECFSZ D4,1
GOTO LOOP2
RETLW 0X00
END
H_D_R said:i have not used PIC.
so i can help in code..
but if you have any logical questions then i can try...
if you wish then feel free to post questions..
thank you
atferrari said:Use the simulator coming with MPLAB from Microchip.
Once you cycle through your software, you could se why / where it is wrong.
smileguitar said:H_D_R said:i have not used PIC.
so i can help in code..
but if you have any logical questions then i can try...
if you wish then feel free to post questions..
thank you
ok, thanks for your kindness. I'll post a lot of questions about PIC coding (assembly language) since I've a lot of coding not understanding yet.
Thanks in advance!
BEGIN CALL TEXT
BTFSC PORTB,0 ;SKIP IF ENTER=1
GOTO BEGIN ;IF ENTER=0 GO TO START
CALL TEXT
BEGIN BTFSC PORTB,0 ;SKIP IF ENTER=1
GOTO BEGIN ;IF ENTER=0 GO TO START
FOUR MOVLW D'4'
MOVWF NUM4 ;SET NUM1=4
SUBLW B'00000100' ;NUM4-4
BTFSS STATUS,Z ;NUM4-4=0?
GOTO WRONG ;NO, RETURN TO START
GOTO CORRECT
BSF PORTB,5
FOUR MOVLW D'4'
MOVWF NUM4 ;SET NUM1=4
SUBLW B'00000100' ;NUM4-4
BTFSS STATUS,Z ;NUM4-4=0?
GOTO WRONGCHK ;NO, RETURN TO START
GOTO CORRECTCHK
WRONGCHK CALL WRONG
CALL TEXT
GOTO BEGIN
CORRECTCHK CALL CORRECT
BSF PORTB,5 ;I GUESS THIS IS FOR ACTIVATING LED / RELAY IF THE CODE IS CORRECT.
;OTHERWISE USE AT APPROPRIATE PLACE
ONE MOVLW D'1'
MOVWF NUM1 ;SET NUM1=1
SUBLW B'00000001' ;NUM1-1
BTFSS STATUS,Z ;NUM1-1=0?
GOTO TWO ;YES, GO TO NEXT NUMBER
GOTO WRONG
TWO MOVLW D'2'
MOVWF NUM2 ;SET NUM1=2
SUBLW B'00000010' ;NUM2-2
BTFSS STATUS,Z ;NUM2-2=0?
GOTO THREE ;YES, GO TO NEXT NUMBER
GOTO WRONG
THREE MOVLW D'3'
MOVWF NUM3 ;SET NUM1=3
SUBLW B'00000011' ;NUM3-3
BTFSS STATUS,Z ;NUM3-3=0?
GOTO FOUR ;YES, GO TO NEXT NUMBER
GOTO WRONG
FOUR MOVLW D'4'
MOVWF NUM4 ;SET NUM1=4
SUBLW B'00000100' ;NUM4-4
BTFSS STATUS,Z ;NUM4-4=0?
GOTO WRONG ;NO, RETURN TO START
GOTO CORRECT
BSF PORTB,5
ONE MOVLW D'1'
MOVWF NUM1 ;SET NUM1=1
SUBLW B'00000001' ;NUM1-1
BTFSS STATUS,Z ;NUM1-1=0?
GOTO TWO ;YES, GO TO NEXT NUMBER
GOTO WRONGCHK
TWO MOVLW D'2'
MOVWF NUM2 ;SET NUM1=2
SUBLW B'00000010' ;NUM2-2
BTFSS STATUS,Z ;NUM2-2=0?
GOTO THREE ;YES, GO TO NEXT NUMBER
GOTO WRONGCHK
THREE MOVLW D'3'
MOVWF NUM3 ;SET NUM1=3
SUBLW B'00000011' ;NUM3-3
BTFSS STATUS,Z ;NUM3-3=0?
GOTO FOUR ;YES, GO TO NEXT NUMBER
GOTO WRONGCHK
FOUR MOVLW D'4'
MOVWF NUM4 ;SET NUM1=4
SUBLW B'00000100' ;NUM4-4
BTFSS STATUS,Z ;NUM4-4=0?
GOTO WRONGCHK ;NO, RETURN TO START
GOTO CORRECTCHK
WRONGCHK CALL WRONG
CALL TEXT
GOTO BEGIN
CORRECTCHK CALL CORRECT
BSF PORTB,5 ;I GUESS THIS IS FOR ACTIVATING LED / RELAY IF THE CODE IS CORRECT.
;OTHERWISE USE AT APPROPRIATE PLACE
H_D_R said:smileguitar said:H_D_R said:i have not used PIC.
so i can help in code..
but if you have any logical questions then i can try...
if you wish then feel free to post questions..
thank you
ok, thanks for your kindness. I'll post a lot of questions about PIC coding (assembly language) since I've a lot of coding not understanding yet.
Thanks in advance!
sorry, by mistake i had written that sentence.
actually, i have not used PIC yet so how can i help you in code..??
i have updated that post also.
ya, i will try to help you to solve your logical questions.
sorry for my mistake..
nishal said:Hi Smileguitar,
Problem #1:
You are looping the Begin routine with text.
Change code from
Code:BEGIN CALL TEXT BTFSC PORTB,0 ;SKIP IF ENTER=1 GOTO BEGIN ;IF ENTER=0 GO TO START
to
Code:CALL TEXT BEGIN BTFSC PORTB,0 ;SKIP IF ENTER=1 GOTO BEGIN ;IF ENTER=0 GO TO START
Problem #2:
Defined correct and wrong codes as function. But in the code U implemented as goto statement.
Try changing the code from
Code:FOUR MOVLW D'4' MOVWF NUM4 ;SET NUM1=4 SUBLW B'00000100' ;NUM4-4 BTFSS STATUS,Z ;NUM4-4=0? GOTO WRONG ;NO, RETURN TO START GOTO CORRECT BSF PORTB,5
to
Code:FOUR MOVLW D'4' MOVWF NUM4 ;SET NUM1=4 SUBLW B'00000100' ;NUM4-4 BTFSS STATUS,Z ;NUM4-4=0? GOTO WRONGCHK ;NO, RETURN TO START GOTO CORRECTCHK WRONGCHK CALL WRONG CALL TEXT GOTO BEGIN CORRECTCHK CALL CORRECT BSF PORTB,5 ;I GUESS THIS IS FOR ACTIVATING LED / RELAY IF THE CODE IS CORRECT. ;OTHERWISE USE AT APPROPRIATE PLACE
Hope this helps...
- Nishal
Added after 6 minutes:
Hi smileguitar
Also correct these lines too.
Change code from
Code:ONE MOVLW D'1' MOVWF NUM1 ;SET NUM1=1 SUBLW B'00000001' ;NUM1-1 BTFSS STATUS,Z ;NUM1-1=0? GOTO TWO ;YES, GO TO NEXT NUMBER GOTO WRONG TWO MOVLW D'2' MOVWF NUM2 ;SET NUM1=2 SUBLW B'00000010' ;NUM2-2 BTFSS STATUS,Z ;NUM2-2=0? GOTO THREE ;YES, GO TO NEXT NUMBER GOTO WRONG THREE MOVLW D'3' MOVWF NUM3 ;SET NUM1=3 SUBLW B'00000011' ;NUM3-3 BTFSS STATUS,Z ;NUM3-3=0? GOTO FOUR ;YES, GO TO NEXT NUMBER GOTO WRONG FOUR MOVLW D'4' MOVWF NUM4 ;SET NUM1=4 SUBLW B'00000100' ;NUM4-4 BTFSS STATUS,Z ;NUM4-4=0? GOTO WRONG ;NO, RETURN TO START GOTO CORRECT BSF PORTB,5
to
Code:ONE MOVLW D'1' MOVWF NUM1 ;SET NUM1=1 SUBLW B'00000001' ;NUM1-1 BTFSS STATUS,Z ;NUM1-1=0? GOTO TWO ;YES, GO TO NEXT NUMBER GOTO WRONGCHK TWO MOVLW D'2' MOVWF NUM2 ;SET NUM1=2 SUBLW B'00000010' ;NUM2-2 BTFSS STATUS,Z ;NUM2-2=0? GOTO THREE ;YES, GO TO NEXT NUMBER GOTO WRONGCHK THREE MOVLW D'3' MOVWF NUM3 ;SET NUM1=3 SUBLW B'00000011' ;NUM3-3 BTFSS STATUS,Z ;NUM3-3=0? GOTO FOUR ;YES, GO TO NEXT NUMBER GOTO WRONGCHK FOUR MOVLW D'4' MOVWF NUM4 ;SET NUM1=4 SUBLW B'00000100' ;NUM4-4 BTFSS STATUS,Z ;NUM4-4=0? GOTO WRONGCHK ;NO, RETURN TO START GOTO CORRECTCHK WRONGCHK CALL WRONG CALL TEXT GOTO BEGIN CORRECTCHK CALL CORRECT BSF PORTB,5 ;I GUESS THIS IS FOR ACTIVATING LED / RELAY IF THE CODE IS CORRECT. ;OTHERWISE USE AT APPROPRIATE PLACE
CHEERS
- NISHAL
smileguitar said:I see, Thanks! Now I understand.
I've another question, due to my coding, how could I clear the LCD after displaying? I've been try to use B'00000001' to clear it, but not.
SETFT MACRO nFSR,TC
MOVLW nFSR
MOVWF FSR
MOVLW TC
MOVWF tempct
ENDM
TEXT CALL LCD_INIT
BSF PORTB,2 ;R/S SET TO '1'
MOVLW H'45'
MOVWF PORTD
CALL CLOCK_E
MOVLW H'6E'
MOVWF PORTD
CALL CLOCK_E
SENDLCD MACRO CHAR
MOVLW CHAR
MOVWF PORTD
CALL CLOCKE
ENDM
TEXT2
CALL LCDINIT
SETRS
SENDLCD H'45'
SENDLCD H'6E'
...
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?