;**********************************************************************
;                                                                     *
;    Filename:         xxx.asm                                        *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:                                                          *
;    Company:                                                         *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required: P16F882.INC                                      *
;                                                                     *

;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Revision History:                                                *
;                                                                     *
;**********************************************************************

     LIST      p=16F882            ; list directive to define processor
     #INCLUDE <p16F882.inc>        ; processor specific variable definitions

     __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT 
     __CONFIG _CONFIG2, _WRT_OFF & _BOR40V

	ERRORLEVEL -302

;------------------------------------------------------------------------------

#DEFINE		CMD_DIGITS18_ON		0X00
#DEFINE		CMD_DIGITS9A_ON		0X01
#DEFINE		CMD_DIGITS18_BLINK	0X02
#DEFINE		CMD_DIGITS9A_BLINK	0X03
#DEFINE		CMD_BLINK_RATE		0X04
#DEFINE		CMD_NOT_USED		0X05
#DEFINE		CMD_MEM1		0X06
#DEFINE		CMD_MEM2		0X07
#DEFINE		CMD_MEM3		0X08
#DEFINE		CMD_MEM4		0X09
#DEFINE		CMD_MEM5		0X0A
#DEFINE		CMD_MEM6		0X0B
#DEFINE		CMD_MEM7		0X0C
#DEFINE		CMD_MEM8		0X0D
#DEFINE		CMD_MEM9		0X0E
#DEFINE		CMD_MEM10		0X0F
#DEFINE		CMD_SHIFT_L		0X10
#DEFINE		CMD_SHIFT_R		0X11
#DEFINE		CMD_SET_SHIFT18		0X12
#DEFINE		CMD_SET_SHIFT9A		0X13
#DEFINE		CMD_WAKE		0X14
#DEFINE		CMD_SLEEP		0X15
#DEFINE		CMD_COMMON_18		0X16
#DEFINE		CMD_COMMON_9A		0X17



DEMO_VAR_SHR	UDATA_SHR        ; INT_VAR is the section name in Access RAM
DEMO_STAGE	RES 1
DEMO_COUNTL	RES 1
DEMO_COUNTH	RES 1
DISP_POINTER	RES 1
DISP_COUNT	RES 1
DISP_TEMP	RES 1
DISP_DATA	RES 1
DEMO_COUNT_TIME	RES 1


;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 16F882 has 128 bytes of non-volatile EEPROM, starting at address 0x2100
; 
;------------------------------------------------------------------------------

          ORG   0x2100
          DE    0x00, 0x01, 0x02, 0x03

;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------

RESET_VECTOR    CODE   0x0000
          goto    START             ; When using debug header, ICD2 may not stop
                                    ; on instruction 0 during reset.

;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------

INT_VECTOR      CODE   0x0004       ; Interrupt Vector Location



;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------

	ORG	0X0E
START

;--------------------------------------------------------------------------
; SET INTERNAL CLOCK TO 8MHZ.
;--------------------------------------------------------------------------
	BANKSEL	OSCCON
	BSF	OSCCON,6
	BSF	OSCCON,5
	BSF	OSCCON,4

;--------------------------------------------------------------------------
; SET INTERNAL CLOCK TO 8MHZ.
;--------------------------------------------------------------------------
	CALL	CONFIG_PORTS
	CALL	CONFIG_SPI
	CLRF	DEMO_COUNTL
	CLRF	DEMO_COUNTH
	CLRF	DISP_POINTER
	BANKSEL	PORTA
	BSF	PORTA,7
MAIN
	MOVLW	0X01
	CALL	DEMO_WAIT		;GIVE DISPLAY CHIP TIME TO STARTUP.
	CALL	DISP_WAKE		;WAKE UP THE DISPLAY CHIP.

	MOVLW	0XFF
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_ON		
	CALL	DISP_SEND_CD
;--------------------------------------------------------------------------
; CLEAR DISPLAY
;--------------------------------------------------------------------------



;--------------------------------------------------------------------------
; SETUP COMMON ANODE / CATHODE COMMANDS.
;--------------------------------------------------------------------------
	MOVLW	0XF0			;F0
	MOVWF	DISP_DATA
	MOVLW	CMD_COMMON_18
	CALL	DISP_SEND_CD

	MOVLW	0XC0
	MOVWF	DISP_DATA
	MOVLW	CMD_COMMON_9A
	CALL	DISP_SEND_CD

;	MOVLW	0X30
;	CALL	DEMO_WAIT

;--------------------------------------------------------------------------
; DISPLAY "NEOLOCH" ON DISPLAY.
;--------------------------------------------------------------------------
	CLRF	DISP_POINTER	
MAIN_NEOLOCH
	MOVF	DISP_POINTER,W
	CALL	DISP_STRING_NEOLOCH
	MOVWF	DISP_DATA
	MOVF	DISP_POINTER,W
	CALL	DISP_MEM
	INCF	DISP_POINTER,F
	MOVLW	0X08
	SUBWF	DISP_POINTER,W
	BTFSS	STATUS,Z
	GOTO	MAIN_NEOLOCH
	GOTO	MAIN_BLINK

DISP_STRING_NEOLOCH
	BCF	PCLATH,0
	BCF	PCLATH,1
	BCF	PCLATH,2
	MOVF	DISP_POINTER,W
	ADDWF	PCL,F
	DT	"NEOLOCH "

;--------------------------------------------------------------------------
; TURN ON BLINK, DIGITS 1 - 1
;--------------------------------------------------------------------------
MAIN_BLINK				; TURN ON BLINK DIGITS 1 - 8
	MOVLW	0X0A
	CALL	DEMO_WAIT
	MOVLW	0X80
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_BLINK
	CALL	DISP_SEND_CD
	MOVLW	0X20
	CALL	DEMO_WAIT

;--------------------------------------------------------------------------
; TURN ON BLINK, DIGITS 1 - 2
;--------------------------------------------------------------------------
	MOVLW	0X0A
	CALL	DEMO_WAIT
	MOVLW	0XC0
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_BLINK
	CALL	DISP_SEND_CD
	MOVLW	0X20
	CALL	DEMO_WAIT

;--------------------------------------------------------------------------
; TURN ON BLINK, DIGITS 1 - 3
;--------------------------------------------------------------------------
	MOVLW	0X0A
	CALL	DEMO_WAIT
	MOVLW	0XE0
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_BLINK
	CALL	DISP_SEND_CD
	MOVLW	0X20
	CALL	DEMO_WAIT

;--------------------------------------------------------------------------
; TURN ON BLINK, DIGITS 1 - 4
;--------------------------------------------------------------------------
	MOVLW	0X0A
	CALL	DEMO_WAIT
	MOVLW	0XF0
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_BLINK
	CALL	DISP_SEND_CD
	MOVLW	0X20
	CALL	DEMO_WAIT

;--------------------------------------------------------------------------
; TURN ON BLINK, DIGITS 1 - 5
;--------------------------------------------------------------------------
	MOVLW	0X0A
	CALL	DEMO_WAIT
	MOVLW	0XF8
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_BLINK
	CALL	DISP_SEND_CD
	MOVLW	0X20
	CALL	DEMO_WAIT

;--------------------------------------------------------------------------
; TURN ON BLINK, DIGITS 1 - 6
;--------------------------------------------------------------------------
	MOVLW	0X0A
	CALL	DEMO_WAIT
	MOVLW	0XFC
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_BLINK
	CALL	DISP_SEND_CD
	MOVLW	0X20
	CALL	DEMO_WAIT

;--------------------------------------------------------------------------
; TURN ON BLINK, DIGITS 1 - 7
;--------------------------------------------------------------------------
	MOVLW	0X0A
	CALL	DEMO_WAIT
	MOVLW	0XFE
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_BLINK
	CALL	DISP_SEND_CD
	MOVLW	0X20
	CALL	DEMO_WAIT

;--------------------------------------------------------------------------
; TURN ON BLINK, DIGITS 1 - 8
;--------------------------------------------------------------------------
	MOVLW	0X0A
	CALL	DEMO_WAIT
	MOVLW	0XFF
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_BLINK
	CALL	DISP_SEND_CD
	MOVLW	0X20
	CALL	DEMO_WAIT

;--------------------------------------------------------------------------
; TURN ON BLINK, DIGITS 1,3,5,7
;--------------------------------------------------------------------------
	MOVLW	0XAA			;TURN ON BLINK DIGITS 1,3,5,7
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_BLINK
	CALL	DISP_SEND_CD
	MOVLW	0X20
	CALL	DEMO_WAIT

;--------------------------------------------------------------------------
; TURN OFF BLINK
;--------------------------------------------------------------------------
	MOVLW	0X00
	MOVWF	DISP_DATA
	MOVLW	CMD_DIGITS18_BLINK
	CALL	DISP_SEND_CD
	MOVLW	0X01
	CALL	DEMO_WAIT

;	CALL	DISP_CLEAR
	CALL	DISP_PART_SL

	MOVLW	0X20
	CALL	DEMO_WAIT

	CALL	DISP_PART_SR

;--------------------------------------------------------------------------
; SCROLL NEOLOCH ACROSS FIRST 4 DIGITS WHILE OTHERS 4 DISPLAY "????"
;--------------------------------------------------------------------------
;	CALL	DISP_CLEAR

;	MOVLW	0X0F			;SETUP DIGITS 1-4 FOR SCROLL
;	MOVWF	DISP_DATA
;	MOVLW	CMD_SET_SHIFT18
;	CALL	DISP_SEND_CD
;	CALL	DISP_PART_SL

;	MOVLW	0X20
;	CALL	DEMO_WAIT


;	MOVLW	0XFF
;	MOVWF	DISP_DATA
;	MOVLW	CMD_COMMON_18
;	CALL	DISP_SEND_CD
;	MOVLW	0X30
;	CALL	DEMO_WAIT

MAIN_ENDLESS
	GOTO	MAIN
	GOTO	$

;--------------------------------------------------------------------------
; SCROLL PART NUMBER ON DISPLAY.
;--------------------------------------------------------------------------
DISP_PART_SL
	MOVLW	0XFF			;TURN ON SHIFT CHARACTERS FOR DIGITS 1 -8
	MOVWF	DISP_DATA
	MOVLW	CMD_SET_SHIFT18
	CALL	DISP_SEND_CD	
	MOVLW	0X00			;TURN OFF SHIFT CHARACTERS FOR DIGITS 9 - A 
	MOVWF	DISP_DATA
	MOVLW	CMD_SET_SHIFT9A
	CALL	DISP_SEND_CD
	CLRF	DISP_POINTER
DISP_PART_SL2
	MOVF	DISP_POINTER,W
	CALL	DISP_STRING_PART
	MOVWF	DISP_DATA
	MOVLW	CMD_SHIFT_L
	CALL	DISP_SEND_CD
	MOVLW	0X02
	CALL	DEMO_WAIT
	INCF	DISP_POINTER,F
	MOVLW	0X08
	SUBWF	DISP_POINTER,W
	BTFSS	STATUS,Z
	GOTO	DISP_PART_SL2
	RETURN
DISP_STRING_PART
	BCF	PCLATH,0
	BCF	PCLATH,1
	BCF	PCLATH,2
	MOVF	DISP_POINTER,W
	ADDWF	PCL,F
	DT	"DC-10D7S"

;--------------------------------------------------------------------------
; SCROLL PART NUMBER OFF DISPLAY.
;--------------------------------------------------------------------------
DISP_PART_SR
	MOVLW	0X08
	MOVWF	DISP_POINTER
DISP_PART_SR2
	MOVLW	" "
	MOVWF	DISP_DATA
	MOVLW	CMD_SHIFT_R
	CALL	DISP_SEND_CD
	MOVLW	0X02
	CALL	DEMO_WAIT
	DECFSZ	DISP_POINTER,F
	GOTO	DISP_PART_SR2
	RETURN

;--------------------------------------------------------------------------
; LOOKUP TABLE FOR PROPER MEMORY ADDRESS COMMAND.
;--------------------------------------------------------------------------		
DISP_MEM
	CALL	DISP_MEM_ADDRESS
	CALL	DISP_XMIT
	CALL	DEMO_WAIT_SHORT
	MOVF	DISP_DATA,W
	CALL	DISP_XMIT
	RETURN

DISP_MEM_ADDRESS
	BCF	PCLATH,0
	BCF	PCLATH,1
	BCF	PCLATH,2
	BANKSEL DISP_TEMP
	MOVWF	DISP_TEMP
	MOVLW	0X0F
	ANDWF	DISP_TEMP,W
	ADDWF	PCL,F
	RETLW	CMD_MEM1
	RETLW	CMD_MEM2
	RETLW	CMD_MEM3
	RETLW	CMD_MEM4
	RETLW	CMD_MEM5
	RETLW	CMD_MEM6
	RETLW	CMD_MEM7
	RETLW	CMD_MEM8
	RETLW	CMD_MEM9
	RETLW	CMD_MEM10
	RETLW	CMD_MEM1	;FOLLOWING COMMANDS ARE SAFETY RETURNS IN CASE JUMP
	RETLW	CMD_MEM1	;EXCEEDS 0X0A.
	RETLW	CMD_MEM1
	RETLW	CMD_MEM1
	RETLW	CMD_MEM1
	RETLW	CMD_MEM1

;--------------------------------------------------------------------------
; WAKE UP DISPLAY
;--------------------------------------------------------------------------
DISP_WAKE
	BANKSEL	DISP_TEMP
	MOVLW	CMD_WAKE		;WAKE COMMAND
	CALL	DISP_XMIT
	CALL	DEMO_WAIT_SHORT
	RETURN

;--------------------------------------------------------------------------
; SEND COMMAND AND DATA BYTE.
;--------------------------------------------------------------------------
DISP_SEND_CD
	BANKSEL	DISP_TEMP
	CALL	DISP_XMIT
	CALL	DEMO_WAIT_SHORT
	MOVF	DISP_DATA,W
	CALL	DISP_XMIT
	RETURN

;--------------------------------------------------------------------------
 ;TRANSMIT DATA BYTE.
;--------------------------------------------------------------------------
DISP_XMIT
	BANKSEL	PORTA
	BCF	PORTA,7			;CS = ON.
	BANKSEL SSPBUF
	MOVWF	SSPBUF
	BANKSEL	SSPSTAT
	BTFSS	SSPSTAT,BF
	GOTO	$-1
	BANKSEL	SSPBUF
	MOVF	SSPBUF,W
	BANKSEL	PORTA
	BSF	PORTA,7			;CS = OFF.
	RETURN	

;--------------------------------------------------------------------------
 ;CONFIGURE SPI PORT.
;--------------------------------------------------------------------------
DEMO_WAIT
	MOVWF	DEMO_COUNT_TIME
	CLRF	DEMO_COUNTL
	CLRF	DEMO_COUNTH
	CALL	DEMO_WAIT_SHORT
	DECFSZ	DEMO_COUNTH,F
	GOTO	$-2
	DECFSZ	DEMO_COUNT_TIME,F
	GOTO	$-4
	RETURN

DEMO_WAIT_SHORT
	CLRF	DEMO_COUNTL
	DECFSZ	DEMO_COUNTL,F
	GOTO	$-1
	RETURN

;--------------------------------------------------------------------------
 ;CONFIGURE SPI PORT.
;--------------------------------------------------------------------------
CONFIG_PORTS
	BANKSEL	PORTA
	CLRF	PORTA
	BANKSEL	ANSEL
	CLRF	ANSEL

	BANKSEL	PORTB
	CLRF	PORTB
	BANKSEL	ANSELH
	CLRF	ANSELH

	BANKSEL	PORTC
	CLRF	PORTC
	RETURN

;--------------------------------------------------------------------------
 ;CONFIGURE SPI.
;--------------------------------------------------------------------------
CONFIG_SPI
	BANKSEL	TRISC
	BCF	TRISC,5
	BCF	TRISC,3
;	BANKSEL TRISA
;	BSF	TRISA,5
	BANKSEL	SSPSTAT
	MOVLW	B'01000000'
	MOVWF	SSPSTAT
	BANKSEL	SSPCON
	MOVLW	B'00110010'
	MOVWF	SSPCON

	BANKSEL	TRISA
	BCF	TRISA,7
	RETURN

          END
