list p=16f767
#include <P16F767.inc>
d1 equ 20h
d2 equ 21h
d3 equ 22h
;**********************************************************************
org 0x0000
; init
bcf STATUS, RP1
bcf STATUS, RP0 ;bank 0
clrf PORTA
bsf STATUS, RP0 ;bank 1
movlw 62h ; 4mhz clk
movwf OSCCON
movlw 0Fh ; Configure all pins
movwf ADCON1 ; as digital
movlw 00h ; all output on portA
movwf TRISA
bsf TRISC,3 ; set as input (SCL)
bsf TRISC,4 ; set as input (SDA)
bcf STATUS, RP0 ; bank 0
movlw 28h
movwf SSPCON ; enable MSSP and stuff
bsf STATUS, RP0 ; bank 1
movlw 09h
movwf SSPADD ; 100khz
bcf STATUS, RP0 ; bank 0
; write byte
call START
movlw b'10100000' ; control bits (write mode)
call SENDBYTE
movlw 00h ; address 0x00
call SENDBYTE
movlw 00h ; address 0x00
call SENDBYTE
movlw b'00000101' ; send 0x05
call SENDBYTE
call STOP
; buncha delays just in case, let the eeprom do its thing
movlw 0ffh
call DELAY
movlw 0ffh
call DELAY
movlw 0ffh
call DELAY
movlw 0ffh
call DELAY
movlw 0ffh
call DELAY
clrw
; read byte
call START
movlw b'10100000' ; write mode first to set current read address
call SENDBYTE
movlw 00h
call SENDBYTE
movlw 00h
call SENDBYTE
call RESTART
movlw b'10100001' ; control bits (read mode)
call SENDBYTE
call READBYTE ; byte put into w register
movwf PORTA ; display output
bsf SSPCON2, ACKDT ; no acknowledge
bsf SSPCON2, ACKEN
call STOP
LOOP_FOREVER
goto LOOP_FOREVER
;---------------------------------
; START
;---------------------------------
START
bsf SSPCON2,SEN
call WAIT
return
;---------------------------------
; WAITSSP
;---------------------------------
WAIT
bsf STATUS, RP0 ;bank 1
btfsc SSPSTAT,2
goto WAIT
bcf STATUS, RP0 ; Bank0
return
;---------------------------------
; STOP
;---------------------------------
STOP
bsf SSPCON2,PEN
call WAIT
return
;---------------------------------
; RESTART
;---------------------------------
RESTART
bsf SSPCON2,RSEN
call WAIT
return
;---------------------------------
; SENDBYTE
;---------------------------------
SENDBYTE
movwf SSPBUF
call WAIT
btfsc SSPCON2, ACKSTAT ; wait for acknowledge
goto $-1
return
;---------------------------------
; READBYTE
;---------------------------------
READBYTE
bsf SSPCON2,RCEN
call WAIT
movf SSPBUF,0
return
;---------------------------------
; DELAY ROUTINE delays n milliseconds
;---------------------------------
DELAY
movwf d3
DELAY_1
;993 cycles
movlw 0xC6
movwf d1
movlw 0x01
movwf d2
DELAY_0
decfsz d1, f
goto $+2
decfsz d2, f
goto DELAY_0
decfsz d3, f
goto DELAY_1
return
END