jennflo
Newbie level 3
can anyone help about our code...
we cant output on what we want in 7 seg Quad from MCU PIC16f877a. once the time is set in LCD it will make an output to the 7-segment quad.
RA0-RA3 are for the common anode and the RC0-RC3 are the bcd-decoder.
we cant output on what we want in 7 seg Quad from MCU PIC16f877a. once the time is set in LCD it will make an output to the 7-segment quad.
RA0-RA3 are for the common anode and the RC0-RC3 are the bcd-decoder.
Code:
#include P16F877A.inc
__config _HS_OSC & _PWRTE_OFF & _CP_OFF & _WDT_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF
ERRORLEVEL -302
CTR EQU 0x20
LCD_TEMP EQU 0x21
CTR1 EQU 0x22
BTNTEST EQU 0x23
BTNTEST2 EQU 0x24
BTNTEST3 EQU 0x25
BTNTEST4 EQU 0x26
CTR_SET_CNCL EQU 0x27
HR_SET EQU 0x28
MIN_SET EQU 0x29
TEMP_HR_SET EQU 0x2A
TEMP_MIN_SET EQU 0x2B
LCD_DATA EQU PORTB
LCD_DATA_TRIS EQU TRISB
LCD_CTRL EQU PORTD
LCD_CTRL_TRIS EQU TRISD
SEVENSEGDISP_TRIS EQU TRISC
SEVENSEGCOMM_TRIS EQU TRISA
#DEFINE LCD_E LCD_CTRL,7
#DEFINE LCD_RW LCD_CTRL,6
#DEFINE LCD_RS LCD_CTRL,5
#DEFINE LCD_DECBTN LCD_CTRL,4
#DEFINE LCD_INCBTN LCD_CTRL,3
#DEFINE LCD_SETBTN LCD_CTRL,1
#DEFINE LCD_CNCLBTN LCD_CTRL,0
CBLOCK 0
d1
d2
d3
ENDC
;.......................................................
ORG 0x00
GOTO MAIN
;ORG 0x04
;.......................................................
LCD_INIT
; Busy-flag is not yet valid
CLRF LCD_CTRL ; ALL PORT output should output Low.
; power-up delay
CALL DELAY20ms ; 20ms
; Busy Flag should be valid from here
MOVLW 0x38 ; 8-bit-interface, 2-lines
CALL LCD_PUTCMD
MOVLW 0x00 ; disp.off, curs.off, no-blink
CALL LCD_DMODE
CALL LCD_CLEAR
MOVLW 0x04 ; disp.on, curs.off
CALL LCD_DMODE
MOVLW 0x02 ; auto-inc (shift-cursor)
CALL LCD_EMODE
RETURN
;.......................................................
LCD_BUSY
BSF STATUS,RP0 ; Select Register page 1
MOVLW 0xFF ; Set PORTB for input
MOVWF LCD_DATA_TRIS
BCF STATUS, RP0 ; Select Register page 0
BCF LCD_RS ; Set LCD for command mode
BSF LCD_RW ; Setup to read busy flag
BSF LCD_E ; LCD E-line High
MOVF LCD_DATA, W ; Read busy flag + DDram address
BCF LCD_E ; LCD E-line Low
ANDLW 0x80 ; Check Busy flag, High = Busy
BTFSS STATUS, Z
GOTO LCD_BUSY
LCD_NOTBUSY
BCF LCD_RW
BSF STATUS, RP0 ; Select Register page 1
MOVLW 0x00
MOVWF LCD_DATA_TRIS ; Set PORTB for output
BCF STATUS, RP0 ; Select Register page 0
RETURN
;.......................................................
LCD_CLEAR
MOVLW 0x01
CALL LCD_PUTCMD
RETURN
;.......................................................
LCD_HOME
MOVLW 0x02
CALL LCD_PUTCMD
RETURN
;.......................................................
LCD_EMODE
ANDLW 0x03 ; Strip upper bits
IORLW 0x04 ; Function set
CALL LCD_PUTCMD
RETURN
;.......................................................
LCD_DMODE
ANDLW 0x07 ; Strip upper bits
IORLW 0x08 ; Function set
CALL LCD_PUTCMD
RETURN
;.......................................................
LCD_SCGA ; Set CGRam
ANDLW 0x3F ; Strip upper bits
IORLW 0x40 ; Function set
CALL LCD_PUTCMD
RETURN
;.......................................................
LCD_SDDA ; Set DDRam
IORLW 0x80 ; Function set
CALL LCD_PUTCMD
RETURN
;.......................................................
LCD_GADDR ; Get Address counter contents
BSF STATUS,RP0 ; Select Register page 1
MOVLW 0xFF ; Set PORTB for input
MOVWF LCD_DATA_TRIS
BCF STATUS, RP0 ; Select Register page 0
BCF LCD_RS ; Set LCD for command mode
BSF LCD_RW ; Setup to read busy flag
BSF LCD_E ; LCD E-line High
MOVF LCD_DATA, W ; Read busy flag + RAM address
BCF LCD_E ; LCD E-line Low
ANDLW 0x7F ; Strip upper bit
BCF LCD_RW
BSF STATUS, RP0 ; Select Register page 1
MOVLW 0x00
MOVWF LCD_DATA_TRIS ; Set PORTB for output
BCF STATUS, RP0 ; Select Register page 0
RETURN
;.......................................................
LCD_PUTCHAR
MOVWF LCD_TEMP ; Character to send is in W
CALL LCD_BUSY ; Wait for LCD to be ready
BCF LCD_RW ; Set LCD in read mode
BSF LCD_RS ; Set LCD in data mode
BSF LCD_E ; LCD E-line High
MOVF LCD_TEMP, W
MOVWF LCD_DATA ; Send data to LCD
BCF LCD_E ; LCD E-line Low
RETURN
;.......................................................
LCD_PUTCMD
MOVWF LCD_TEMP ; Command to send is in W
CALL LCD_BUSY ; Wait for LCD to be ready
BCF LCD_RW ; Set LCD in read mode
BCF LCD_RS ; Set LCD in command mode
BSF LCD_E ; LCD E-line High
MOVF LCD_TEMP, W
MOVWF LCD_DATA ; Send data to LCD
BCF LCD_E ; LCD E-line Low
RETURN
;.......................................................
DELAY20ms
;19993 cycles
MOVLW 0x9E
MOVWF d1
MOVLW 0x10
MOVWF d2
Delay_0
DECFSZ d1, F
GOTO $+2
DECFSZ d2, F
GOTO Delay_0
;3 cycles
GOTO $+1
NOP
;4 cycles (including call)
RETURN
;.......................................................
DELAY1sec
;999990 cycles
MOVLW 0x07
MOVWF d1
MOVLW 0x2F
MOVWF d2
MOVLW 0x03
MOVWF d3
Delay_1
DECFSZ d1, F
GOTO $+2
DECFSZ d2, F
GOTO $+2
DECFSZ d3, F
GOTO Delay_1
;6 cycles
GOTO $+1
GOTO $+1
GOTO $+1
;4 cycles (including call)
RETURN
;.......................................................
INC_HR
INCF BTNTEST,F
BTFSS CTR1,1
GOTO INC_NEXT_1
GOTO TEST_23
TEST_23 BTFSS CTR,1
GOTO INC_NEXT_2
GOTO TEST_23_1
TEST_23_1 BTFSS CTR,0
GOTO INC_NEXT_2
GOTO SET_HOUR
INC_NEXT_1 BTFSS CTR,3
GOTO INC_NEXT_2
GOTO INC_NEXT_3
INC_NEXT_2 INCF CTR,F
INCF HR_SET,F
GOTO SET_HOUR
INC_NEXT_3 BTFSS CTR,0
GOTO INC_NEXT_2
GOTO INC_NEXT_5
INC_NEXT_5 INCF CTR1,F
MOVLW 0x30
MOVWF CTR
ANDLW 0xF0
ANDWF HR_SET,F
ADDLW 0x10
ADDWF HR_SET,F
GOTO SET_HOUR
;.......................................................
DEC_HR
INCF BTNTEST2,F
BTFSS CTR1,1
GOTO TEST_00
GOTO DEC_1
TEST_00
BTFSS CTR1,0
GOTO TEST_3
GOTO DEC_1
TEST_3
BTFSS CTR,3
GOTO TEST_2
GOTO DEC_2
TEST_2
BTFSS CTR,2
GOTO TEST_1
GOTO DEC_2
TEST_1
BTFSS CTR,1
GOTO TEST_0
GOTO DEC_2
TEST_0
BTFSS CTR,0
GOTO SET_HOUR
GOTO DEC_2
DEC_1
BTFSS CTR,3
GOTO BIT_2
GOTO DEC_2
BIT_2
BTFSS CTR,2
GOTO BIT_1
GOTO DEC_2
BIT_1
BTFSS CTR,1
GOTO BIT_0
GOTO DEC_2
BIT_0
BTFSS CTR,0
GOTO DEC_3
GOTO DEC_2
DEC_3
DECF CTR1,F
MOVLW 0x39
MOVWF CTR
ADDLW 0x09
ADDWF HR_SET,F
SUBLW 0x10
SUBWF HR_SET,F
GOTO SET_HOUR
DEC_2
DECF CTR,F
DECF HR_SET,F
GOTO SET_HOUR
;.......................................................
INC_MIN
INCF BTNTEST,F
BTFSS CTR1,2
GOTO NEXT_MIN1
GOTO TESTMIN591
TESTMIN591
BTFSS CTR1,0
GOTO NEXT_MIN1
GOTO TESTMIN59
TESTMIN59
BTFSS CTR,3
GOTO NEXT_MIN2
GOTO TESTMIN59_1
TESTMIN59_1
BTFSS CTR,0
GOTO NEXT_MIN2
GOTO SET_MINUTE
NEXT_MIN1 BTFSS CTR,3
GOTO NEXT_MIN2
GOTO NEXT_MIN3
NEXT_MIN2
INCF CTR,F
INCF MIN_SET,F
GOTO SET_MINUTE
NEXT_MIN3 BTFSS CTR,0
GOTO NEXT_MIN2
GOTO NEXT_MIN5
NEXT_MIN5
INCF CTR1,F
MOVLW 0x30
MOVWF CTR
ANDLW 0xF0
ANDWF MIN_SET,F
ADDLW 0x10
ADDWF MIN_SET,F
GOTO SET_MINUTE
;.......................................................
DEC_MIN
INCF BTNTEST2,F
BTFSS CTR1,2
GOTO DEC_MIN_5
GOTO DEC_MIN_8
DEC_MIN_5 BTFSS CTR1,1
GOTO DEC_MIN_6
GOTO DEC_MIN_8
DEC_MIN_6 BTFSS CTR1,0
GOTO DEC_MIN_7
GOTO DEC_MIN_8
DEC_MIN_8 BTFSS CTR,3
GOTO DEC_MIN_9
GOTO DEC_MIN_4
DEC_MIN_9 BTFSS CTR,2
GOTO DEC_MIN_10
GOTO DEC_MIN_4
DEC_MIN_10 BTFSS CTR,1
GOTO DEC_MIN_11
GOTO DEC_MIN_4
DEC_MIN_11 BTFSS CTR,0
GOTO DEC_MIN_12
GOTO DEC_MIN_4
DEC_MIN_12 DECF CTR1,F
MOVLW 0x30
MOVWF CTR
ADDLW 0x09
ADDWF MIN_SET,F
SUBLW 0x10
SUBWF MIN_SET,F
GOTO SET_MINUTE
DEC_MIN_7 BTFSS CTR,3
GOTO DEC_MIN_0
GOTO DEC_MIN_4
DEC_MIN_0 BTFSS CTR,2
GOTO DEC_MIN_1
GOTO DEC_MIN_4
DEC_MIN_1 BTFSS CTR,1
GOTO DEC_MIN_2
GOTO DEC_MIN_4
DEC_MIN_2 BTFSS CTR,0
GOTO SET_MINUTE
GOTO DEC_MIN_4
DEC_MIN_4 DECF CTR,F
DECF MIN_SET,F
GOTO SET_MINUTE
;.......................................................
SET_BTN
INCF BTNTEST3,F
MOVLW 0x30
MOVWF CTR1
MOVWF CTR
BTFSS CTR_SET_CNCL,0
GOTO SET_TEST_1
BTFSS CTR_SET_CNCL,1
GOTO SET_TEST_1
BTFSS CTR_SET_CNCL,2
GOTO SET_TEST_1
GOTO SET_TEST
SET_TEST_1 INCF CTR_SET_CNCL,F
GOTO SET_TEST
;.......................................................
SET_TEST
BTFSS CTR_SET_CNCL,0
GOTO SET_TEST_00
GOTO SET_TEST_01
SET_TEST_00 BTFSS CTR_SET_CNCL,1
GOTO SET_TEST_00_1
GOTO SET_TEST_02
SET_TEST_00_1 BTFSS CTR_SET_CNCL,2
GOTO START
SET_TEST_01 BTFSS CTR_SET_CNCL,1
GOTO SET_TEST_01_1
SET_TEST_01_1 BTFSS CTR_SET_CNCL,2
GOTO SET_MINUTE
SET_TEST_02 BTFSS CTR_SET_CNCL,2
GOTO DISPLAY_TIME
;.......................................................
CNCL_BTN
INCF BTNTEST4,F
MOVLW 0x30
MOVWF CTR1
MOVWF CTR
CLRF HR_SET
CLRF MIN_SET
BTFSS CTR_SET_CNCL,2
GOTO DEC_CTR_SET_BTN
BTFSS CTR_SET_CNCL,1
GOTO DEC_CTR_SET_BTN
BTFSS CTR_SET_CNCL,0
GOTO DEC_CTR_SET_BTN
GOTO DISPLAY_SOMETHING
DEC_CTR_SET_BTN DECF CTR_SET_CNCL,F
GOTO CNCL_TEST
;.......................................................
CNCL_TEST
;.......................................................
INC_COMPARTMENT
;.......................................................
DEC_COMPARTMENT
;.......................................................
INC_ALARM
;.......................................................
DEC_ALARM
;.......................................................
WELCOME_NOTE
;.......................................................
DISPLAY_SOMETHING
;.......................................................
SET_AGAIN
MOVLW 0x03
MOVWF CTR_SET_CNCL
;.......................................................
INC_TEST
BTFSS CTR_SET_CNCL,0
GOTO ZEROVALUE
GOTO ONEVALUE
ZEROVALUE BTFSS CTR_SET_CNCL,1
GOTO ZEROVALUE_1
GOTO TWOVALUE
ZEROVALUE_1 BTFSS CTR_SET_CNCL,2
GOTO INC_HR
GOTO INC_ALARM
ONEVALUE BTFSS CTR_SET_CNCL,1
GOTO ONEVALUE_2
GOTO THREEVALUE
ONEVALUE_2 BTFSS CTR_SET_CNCL,2
GOTO INC_MIN
GOTO SETPSH
TWOVALUE BTFSS CTR_SET_CNCL,2
GOTO DISPLAY_TIME
GOTO SETPSH
THREEVALUE BTFSS CTR_SET_CNCL,2
GOTO INC_COMPARTMENT
GOTO SETPSH
;.......................................................
DEC_TEST
BTFSS CTR_SET_CNCL,0
GOTO D_ZEROVALUE
GOTO D_ONEVALUE
D_ZEROVALUE BTFSS CTR_SET_CNCL,1
GOTO D_ZEROVALUE_1
GOTO D_TWOVALUE
D_ZEROVALUE_1 BTFSS CTR_SET_CNCL,2
GOTO DEC_HR
GOTO DEC_ALARM
D_ONEVALUE BTFSS CTR_SET_CNCL,1
GOTO D_ONEVALUE_2
GOTO D_THREEVALUE
D_ONEVALUE_2 BTFSS CTR_SET_CNCL,2
GOTO DEC_MIN
GOTO SETPSH
D_TWOVALUE BTFSS CTR_SET_CNCL,2
GOTO DISPLAY_TIME
GOTO SETPSH
D_THREEVALUE BTFSS CTR_SET_CNCL,2
GOTO DEC_COMPARTMENT
GOTO SETPSH
;.......................................................
MAIN BCF STATUS,RP1
BSF STATUS,RP0
MOVLW 0x00
MOVWF LCD_DATA_TRIS
MOVLW 0x1B
MOVWF LCD_CTRL_TRIS
MOVLW 0x00
MOVWF SEVENSEGDISP_TRIS
MOVWF SEVENSEGCOMM_TRIS
BCF STATUS,RP0
MOVLW 0x06
MOVWF ADCON1
MOVLW 0x07
MOVWF CMCON
MOVLW 0x30
MOVWF CTR
MOVWF CTR1
CLRF BTNTEST
CLRF BTNTEST2
CLRF BTNTEST3
CLRF BTNTEST4
CLRF CTR_SET_CNCL
CLRF TMR1H
CLRF TMR1L
MOVLW 0xFF
MOVWF PORTA
CLRF PORTC
;.......................................................
START
CALL LCD_INIT
CALL LCD_CLEAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW 'S'
CALL LCD_PUTCHAR
MOVLW 'E'
CALL LCD_PUTCHAR
MOVLW 'T'
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW 'H'
CALL LCD_PUTCHAR
MOVLW 'O'
CALL LCD_PUTCHAR
MOVLW 'U'
CALL LCD_PUTCHAR
MOVLW 'R'
CALL LCD_PUTCHAR
MOVLW 0x47
CALL LCD_SDDA
MOVLW '0'
CALL LCD_PUTCHAR
MOVLW '0'
CALL LCD_PUTCHAR
GOTO SETPSH
;.....................................................
SETPSH
BTFSS LCD_INCBTN
GOTO INC_WITH_INPUT
GOTO INC_NO_INPUT
SETPSH2 BTFSS LCD_DECBTN
GOTO DEC_WITH_INPUT
GOTO DEC_NO_INPUT
SETPSH3 BTFSS LCD_SETBTN
GOTO SET_WITH_INPUT
GOTO SET_NO_INPUT
SETPSH4 BTFSS LCD_CNCLBTN
GOTO CNCL_WITH_INPUT
GOTO CNCL_NO_INPUT
INC_NO_INPUT
BTFSC BTNTEST,0
DECF BTNTEST,F
GOTO SETPSH2
GOTO SETPSH2
INC_WITH_INPUT
BTFSS BTNTEST,0
GOTO INC_TEST
GOTO SETPSH
DEC_NO_INPUT
BTFSC BTNTEST2,0
DECF BTNTEST2,F
GOTO SETPSH3
GOTO SETPSH3
DEC_WITH_INPUT
BTFSS BTNTEST2,0
GOTO DEC_TEST
GOTO SETPSH
SET_NO_INPUT
BTFSC BTNTEST3,0
DECF BTNTEST3,F
GOTO SETPSH4
GOTO SETPSH4
SET_WITH_INPUT
BTFSS BTNTEST3,0
GOTO SET_BTN
GOTO SETPSH
CNCL_NO_INPUT
BTFSC BTNTEST4,0
DECF BTNTEST4,F
GOTO SETPSH
GOTO SETPSH
CNCL_WITH_INPUT
BTFSS BTNTEST4,0
GOTO CNCL_BTN
GOTO SETPSH
;......................................................
SET_HOUR
CALL LCD_INIT
CALL LCD_CLEAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW 'S'
CALL LCD_PUTCHAR
MOVLW 'E'
CALL LCD_PUTCHAR
MOVLW 'T'
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW 'H'
CALL LCD_PUTCHAR
MOVLW 'O'
CALL LCD_PUTCHAR
MOVLW 'U'
CALL LCD_PUTCHAR
MOVLW 'R'
CALL LCD_PUTCHAR
MOVLW 0x47
CALL LCD_SDDA
MOVF CTR1,W
CALL LCD_PUTCHAR
MOVF CTR,W
CALL LCD_PUTCHAR
GOTO SETPSH
;......................................................
SET_MINUTE
CALL LCD_INIT
CALL LCD_CLEAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW 'S'
CALL LCD_PUTCHAR
MOVLW 'E'
CALL LCD_PUTCHAR
MOVLW 'T'
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW 'M'
CALL LCD_PUTCHAR
MOVLW 'I'
CALL LCD_PUTCHAR
MOVLW 'N'
CALL LCD_PUTCHAR
MOVLW 'U'
CALL LCD_PUTCHAR
MOVLW 'T'
CALL LCD_PUTCHAR
MOVLW 'E'
CALL LCD_PUTCHAR
MOVLW 0x47
CALL LCD_SDDA
MOVF CTR1,W
CALL LCD_PUTCHAR
MOVF CTR,W
CALL LCD_PUTCHAR
GOTO SETPSH
;......................................................
DISPLAY_TIME
CALL LCD_INIT
CALL LCD_CLEAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW 'T'
CALL LCD_PUTCHAR
MOVLW 'I'
CALL LCD_PUTCHAR
MOVLW 'M'
CALL LCD_PUTCHAR
MOVLW 'E'
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW 'I'
CALL LCD_PUTCHAR
MOVLW 'S'
CALL LCD_PUTCHAR
MOVLW ' '
CALL LCD_PUTCHAR
MOVLW 'S'
CALL LCD_PUTCHAR
MOVLW 'E'
CALL LCD_PUTCHAR
MOVLW 'T'
CALL LCD_PUTCHAR
MOVLW '!'
CALL LCD_PUTCHAR
MOVLW 0xFF
ANDLW 0xF0
ANDWF HR_SET,W
MOVWF TEMP_HR_SET
SWAPF TEMP_HR_SET,F
MOVF TEMP_HR_SET,W
MOVWF PORTC
BCF PORTA,0
CALL DELAY20ms
MOVLW 0xFF
ANDLW 0x0F
ANDWF HR_SET,W
MOVWF TEMP_HR_SET
SWAPF TEMP_HR_SET,F
MOVF TEMP_HR_SET,W
MOVWF PORTC
BCF PORTA,1
CALL DELAY20ms
MOVLW 0xFF
ANDLW 0xF0
ANDWF MIN_SET,W
MOVWF TEMP_MIN_SET
SWAPF TEMP_MIN_SET,F
MOVF TEMP_MIN_SET,W
MOVWF PORTC
BCF PORTA,3
CALL DELAY20ms
MOVLW 0xFF
ANDLW 0x0F
ANDWF MIN_SET,W
MOVWF TEMP_MIN_SET
SWAPF TEMP_MIN_SET,F
MOVF TEMP_MIN_SET,W
MOVWF PORTC
BCF PORTA,4
GOTO SETPSH
;......................................................
END