Hi.
I've been trying to interface a PIC16F688 with a 2 x 20 LCD.
RA4 = RS
RA5 = E
RC0-3 = D4-7
R/W = GND (Tried to have this on RA3, and changed the lcd.c file, but nothing.)
main.c
lcd.c
lcd.h is untouched.
All I get is squares on the first line.
It was working the other day, but I had to mess around with the code, and now it's not working.
I think it is a timer / oscillator problem, but I can't seem to find it.
Can you?
I've been trying to interface a PIC16F688 with a 2 x 20 LCD.
RA4 = RS
RA5 = E
RC0-3 = D4-7
R/W = GND (Tried to have this on RA3, and changed the lcd.c file, but nothing.)
main.c
Rich (BB code):
// Include
#include <htc.h>
#include "lcd.h"
// Definitions
#define _XTAL_FREQ 8000000
// Configuration
__CONFIG (FOSC_INTOSCIO & // Internal Oscillator
WDTE_OFF & // Watchdog timer OFF
PWRTE_OFF & // Power-up timer OFF
MCLRE_OFF & // MCLR pin function is digital input
CP_OFF & // Program Code Protection OFF
CPD_OFF & // Data Code Protection OFF
BOREN_OFF & // Brown out OFF
IESO_OFF & // Internal External Switchover mode is disabled
FCMEN_ON); // Fail-Safe Clock Monitor is disabled
// Variables
// Functions
// Main
void main()
{
CMCON0 = 0x07;
ANSEL = 0;
ADCON0 = 0;
ADCON1 = 0;
OSCCONbits.IRCF0 = 1; // 8MHz
OSCCONbits.IRCF1 = 1; // 8MHz
OSCCONbits.IRCF2 = 1; // 8MHz
OSCCONbits.OSTS = 0; // Device is running from internal osc
OSCCONbits.HTS = 1; // Stable
OSCCONbits.LTS = 1; // Stable
OSCCONbits.SCS = 1; // Internal oscillator used for system clock
OSCTUNE = 0b00000000; // Oscillator running at calibrated freq
TRISA = 0b00000000;
TRISC = 0b00000000;
lcd_init();
lcd_puts("1234567890");
lcd_goto(0x40);
lcd_puts("Hello World.");
for(;;);
} // end main
Rich (BB code):
/*
* LCD interface example
* Uses routines from delay.c
* This code will interface to a standard LCD controller
* like the Hitachi HD44780. It uses it in 4 bit mode, with
* the hardware connected as follows (the standard 14 pin
* LCD connector is used):
*
* PORTD bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
* PORTA bit 3 is connected to the LCD RS input (register select)
* PORTA bit 1 is connected to the LCD EN bit (enable)
*
* To use these routines, set up the port I/O (TRISA, TRISD) then
* call lcd_init(), then other routines as required.
*
*/
#ifndef _XTAL_FREQ
// Unless specified elsewhere, 4MHz system frequency is assumed
#define _XTAL_FREQ 4000000
#endif
#include <htc.h>
#include "lcd.h"
#define LCD_RS RA4
// #define LCD_RW RA4 connected to GND
#define LCD_EN RA5
#define LCD_DATA PORTC
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
/* write a byte to the LCD in 4 bit mode */
void
lcd_write(unsigned char c)
{
__delay_us(40);
LCD_DATA = ( ( c >> 4 ) & 0x0F );
LCD_STROBE();
LCD_DATA = ( c & 0x0F );
LCD_STROBE();
}
/*
* Clear and home the LCD
*/
void
lcd_clear(void)
{
LCD_RS = 0;
lcd_write(0x1);
__delay_ms(2);
}
/* write a string of chars to the LCD */
void
lcd_puts(const char * s)
{
LCD_RS = 1; // write characters
while(*s)
lcd_write(*s++);
}
/* write one character to the LCD */
void
lcd_putch(char c)
{
LCD_RS = 1; // write characters
lcd_write( c );
}
/*
* Go to the specified position
*/
void
lcd_goto(unsigned char pos)
{
LCD_RS = 0;
lcd_write(0x80+pos);
}
/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
char init_value;
ADCON1 = 0x06; // Disable analog pins on PORTA
init_value = 0x3;
TRISA=0;
TRISC=0;
LCD_RS = 0;
LCD_EN = 0;
// LCD_RW = 0;
__delay_ms(15); // wait 15mSec after power applied,
LCD_DATA = init_value;
LCD_STROBE();
__delay_ms(5);
LCD_STROBE();
__delay_us(200);
LCD_STROBE();
__delay_us(200);
LCD_DATA = 2; // Four bit mode
LCD_STROBE();
lcd_write(0x28); // Set interface length
lcd_write(0xF); // Display On, Cursor On, Cursor Blink
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
}
All I get is squares on the first line.
It was working the other day, but I had to mess around with the code, and now it's not working.
I think it is a timer / oscillator problem, but I can't seem to find it.
Can you?
Attachments
-
276.7 KB Views: 38
Last edited: