Hello anyone to help me 12c
PCF8574 Does Not Work on Test Board
Only works on proteus
Here are all the files
Thank you
Code:
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 8/20/2016 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
;----[16F873AHardware Configuration]-------------------------------------------
#CONFIG
__config _HS_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _PWRTE_OFF & _WDTE_OFF
#ENDCONFIG
;----[Oscillator Setup]---------------------------------------------------------
DEFINE OSC 12
TRISA = %11111100:PORTA=0
TRISB = %11111111:PORTB=0
TRISC = %11100111:PORTC=0
;----[Aliases]------------------------------------------------------------------
SDA VAR PORTC.4 ;I2C Data pin
SCL VAR PORTC.3 ;I2C Clock Pin
;----[Initialize Hardware]------------------------------------------------------
ADCON1 = 7
;----[Setup LCD using PCF8574 Port Expander]------------------------------------
LCD_Addr CON $40 ;A0,A1,A2 tied to ground
INCLUDE "LCD_PCF8574.pbp" ;Include LCD module for PCF8574
;----[Variables]----------------------------------------------------------------
LoopCount VAR BYTE
CustChar VAR BYTE
;----[Program Start]------------------------------------------------------------
Backlight = 0 ;Turn on LCD Backlight
ARRAYWRITE LCD_Buff,[" LCD PCF8574"] : LCD_WriteBuff
LoopCount= 0
;----[Custom Characters]-(Jumping Jacks)----------------------------------------
ARRAYWRITE LCD_Buff,[$FE,$40,$00,$04,$0A,$04,$0E,$15,$0A,$11]:LCD_WriteBuff ' #0
ARRAYWRITE LCD_Buff,[$FE,$48,$00,$04,$0A,$04,$1F,$04,$0A,$0A]:LCD_WriteBuff ' #1
ARRAYWRITE LCD_Buff,[$FE,$50,$04,$0A,$15,$0E,$04,$0A,$0A,$00]:LCD_WriteBuff ' #2
;----[Main Program Loop]--------------------------------------------------------
Main:
ARRAYWRITE LCD_Buff,[$FE,$C0,"Count = ",DEC LoopCount," "] : LCD_WriteBuff
PAUSE 200
LoopCount = LoopCount + 1
CustChar = LoopCount//3 ; Jumping Jacks Sequence
ARRAYWRITE LCD_Buff,[$FE,$9D,CustChar] : LCD_WriteBuff
GOTO Main
Code:
; File Name : LCD_PCF8574.pbp
; Author : Darrel Taylor
; Created : Mon Feb 24 2014
; Compiler : PicBasic Pro 3.0.6.x or higher
; Description : Uses PCF8574 Port expander to interface with HD44780 LCD
;
;-------------------------------------------------------------------------------
LCD_BuffSize CON 30
LCD_Buff VAR BYTE[LCD_BuffSize]
LCD_BuffAddr CON EXT : @LCD_BuffAddr = _LCD_Buff
LCD_BuffLen VAR WORD ; Length of data in buffer
LCD_Data VAR BYTE ; Data to Send to LCD
LCD_Byte VAR BYTE ; Nibbles to Send
LCD_E VAR LCD_Byte.4 ; Enable bit
LCD_RW VAR LCD_Byte.5 ; Read/Write bit
LCD_RS VAR LCD_Byte.6 ; Register Select bit
BackLight VAR LCD_Byte.7 ; Backlight 0=ON
LCD_WriteMode VAR BYTE ; 1=LowNibble, 2=HighNibble, 3=Both
LCD_CommandMode VAR BIT ; Indicates next byte is a command
LCD_Byte2 VAR BYTE ; Same nibble without E bit
LCD_Idx VAR BYTE
GOTO Over_LCDPCF8574
;----[Write 1-byte to LCD]--(Input is LCD_Data)---------------------------------
USERCOMMAND "LCD_WRITE"
LCD_WRITE_:
LCD_E = 1
IF LCD_WriteMode.1 THEN ; Write High Nibble
LCD_Byte = (LCD_Byte & $F0) | ((LCD_Data >> 4) & $0F)
LCD_Byte2 = LCD_Byte & $EF
I2CWRITE SDA,SCL, LCD_Addr,[LCD_Byte, LCD_Byte2]
ENDIF
IF LCD_WriteMode.0 THEN ; Write Low Nibble
LCD_Byte = (LCD_Byte & $F0) | (LCD_Data & $0F)
LCD_Byte2 = LCD_Byte & $EF
I2CWRITE SDA,SCL, LCD_Addr,[LCD_Byte, LCD_Byte2]
ENDIF
RETURN
ASM
LCD_WRITE? macro
L?CALL _LCD_WRITE_
endm
ENDASM
;----[Write contents of buffer to LCD]------------------------------------------
USERCOMMAND "LCD_WRITEBUFF"
LCD_WRITEBUFF_:
LCD_BuffLen = R5 - LCD_BuffAddr -1
LCD_WriteMode = 3 ; Both Nibbles
LCD_CommandMode = 0
FOR LCD_Idx = 0 TO LCD_BuffLen
IF LCD_Buff(LCD_Idx) = $FE THEN LCD_CommandMode = 1 : GOTO LCD_ByteDone
IF LCD_CommandMode THEN
LCD_RS = 0
LCD_CommandMode = 0
ELSE
LCD_RS = 1
ENDIF
LCD_Data = LCD_Buff(LCD_Idx)
LCD_Write
IF LCD_CommandMode THEN
PAUSE 2
ELSE
PAUSEUS 50
ENDIF
LCD_ByteDone:
NEXT LCD_Idx
LCD_CommandMode = 0
RETURN
ASM
LCD_WRITEBUFF? macro
L?CALL _LCD_WRITEBUFF_
endm
ENDASM
Over_LCDPCF8574:
;----[Initialize the LCD]-------------------------------------------------------
PAUSE 250 ; LCD Power-on delay
Backlight = 1 ; Backlight OFF
LCD_RW = 0 ; Write to LCD
LCD_RS = 0 ; Command Register
LCD_WriteMode = 1 ;-- Low Nibbles only
LCD_Data = 3 ; Reset 3 times
LCD_Write : PAUSEUS 6000
LCD_Write : PAUSEUS 1000
LCD_Write : PAUSEUS 1000
LCD_Data = 2 ; Start 4-bit mode
LCD_Write : PAUSEUS 1000
LCD_WriteMode = 3 ;-- Both Nibbles
LCD_Data = $28 : LCD_Write ; Function Set, 4-bit, 2-line, 5x7
LCD_Data = $0C : LCD_Write ; Display ON
LCD_Data = $01 : LCD_Write ; Clear Screen
PAUSE 2
LCD_Data = $06 : LCD_Write ; Entry Mode
PAUSE 2 ; Let command finish
Bookmarks