/*
* B4,B5,B6,B7 pinlerini kullanarak 4 bit iletisim kullanir.
* Cursor kapalidir.
* RW kullanilmadigi icin direk topraga baglanabilir.
*
* 2x16 LCD Kullanim Klavuzu
* lcd_init(); ile LCD'nin ilk ayarlarini yap
* lcd_clear(); ile LCD'yi sil
* putsLCD("deneme"); seklinde yazi yazdir.
* putcLCD('F'); seklinde tek ascii kodu yazdir.
* lcd_gotoxy(1,13); seklinde LCD'nin istenilen yerine git.
*/
#include <xc.h>
#define rs LATB4
#define rw LATB6
#define e LATB5
#define rs_tris TRISBbits.RB4
#define rw_tris TRISBbits.RB6
#define e_tris TRISBbits.RB5
#define lcd_port PORTB
#define lcd_tris TRISBbits
////////////////////////////////////////////
/* LCD'de kullanilan komutlarin tanimlamasi*/
#define CLEAR 1 // Ekrani temizler
#define HOME 2 // Imleci sol ust koseye getirir
#define SHIFT_CUR_LEFT 4 // Imlecin belirttigi adres azalarak gider
#define SHIFT_CUR_RIGHT 5
#define SHIFT_DISP_LEFT 6 // Imlecin belirttigi adres artarak gider
#define SHIFT_DISP_RIGHT 7
#define DISPLAY_OFF 11
#define ImlecGizle 12 // Gostergeyi ac, kursor gorunmesin
#define CURSOR_OFF 13
#define BLINK_OFF 14 // Yanip sonen blok kursor
#define DISPLAY_ON 15 // Yanip sonen blok kursor
#define ImlecGeri 16 // Kursoru bir karakter geri kaydir
#define KaydirSaga 24 // Gostergeyi bir karakter saga kaydir
#define KaydirSola 28 // Gostergeyi bir karakter sola kaydir
#define EkraniKapat 8 // Gostergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir baslangic adresi
// (DDRAM adres)
#define IkinciSatir 192 // ikinci satirin baslangic adresi
#define KarakUretAdres 64 // Karakter ureteci adresini belirle
// (CGRAM adres)
/* LCD'de Kullanilan Fonksiyon Secimi */
#define EIGHT_BIT_2_5X7 56 // 8 bit ara birim, 2 satir, 5*7 piksel
#define EIGHT_BIT_1_5X7 48 // 8 bit ara birim, 1 satir, 5*7 piksel
#define FOUR_BIT_2_5X7 40 // 4 bit ara birim, 2 satir, 5*7 piksel
#define FOUR_BIT_1_5X7 32 // 4 bit ara birim, 1 satir, 5*7 piksel
extern void putcLCD(unsigned char);
extern void lcd_clear(void);
extern void putsLCD(const char *s);
extern void lcd_gotoxy(unsigned char x, unsigned char y);
extern void lcd_init(void);
extern void lcd_cmd(unsigned char c);
#include "lcd2.h" // lcd.h dosyasi tanimlanip, degerler aliniyor
void lcd_busy() {
unsigned char i;
for (i = 0; i < 10; i++)
__delay_us(25);
}
void lcd_cmd(unsigned char c) // Komut g�nderme fonksiyonu
{
rw = 0;
rs = 0;
e = 1;
lcd_port = c >> 4;
e = 0;
lcd_busy();
e = 1;
lcd_port = c & 0x0F;
e = 0;
lcd_busy();
}
void putcLCD(unsigned char c) {
rw = 0;
rs = 1;
e = 1;
lcd_port = c >> 4;
e = 0;
lcd_busy();
e = 1;
lcd_port = c & 0x0F;
e = 0;
lcd_busy();
}
void lcd_clear(void) // LCD siliniyor
{
lcd_cmd(0x1);
__delay_ms(2);
}
void putsLCD(const char * s) {
lcd_busy();
while (*s) {
putcLCD(*s++);
}
}
void lcd_gotoxy(unsigned char x, unsigned char y) {
unsigned char direccion;
if (y != 1)
direccion = 0x40;
else
direccion = 0;
direccion += x - 1;
lcd_cmd(0x80 | direccion);
}
void lcd_init() {
lcd_tris.RB0 = 0;
lcd_tris.RB1 = 0;
lcd_tris.RB2 = 0;
lcd_tris.RB3 = 0;
rs_tris = 0;
rw_tris = 0;
e_tris = 0;
rs = 0;
e = 0;
rw = 0;
__delay_ms(15);
e = 1;
lcd_cmd(0x02);
__delay_ms(2);
lcd_cmd(FOUR_BIT_2_5X7);
lcd_cmd(SHIFT_DISP_LEFT);
lcd_cmd(DISPLAY_ON);
lcd_clear();
lcd_cmd(BirinciSatir);
}
#include "lcd2.h" // lcd.h dosyasi tanimlanip, degerler aliniyor
void lcd_busy() {
unsigned char i;
for (i = 0; i < 10; i++)
__delay_us(25);
}
inline void writePort(char data)
{
char aux = lcd_port & 0xF0;
aux |= data;
lcd_port = aux;
}
void lcd_cmd(unsigned char c) // Komut g�nderme fonksiyonu
{
rw = 0;
rs = 0;
e = 1;
writePort (c >> 4);
e = 0;
lcd_busy();
e = 1;
writePort (c & 0x0F);
e = 0;
lcd_busy();
}
void putcLCD(unsigned char c) {
rw = 0;
rs = 1;
e = 1;
writePort (c >> 4);
e = 0;
lcd_busy();
e = 1;
writePort (c & 0x0F);
e = 0;
lcd_busy();
}
void lcd_clear(void) // LCD siliniyor
{
lcd_cmd(0x1);
__delay_ms(2);
}
void putsLCD(const char * s) {
lcd_busy();
while (*s) {
putcLCD(*s++);
}
}
void lcd_gotoxy(unsigned char x, unsigned char y) {
unsigned char direccion;
if (y != 1)
direccion = 0x40;
else
direccion = 0;
direccion += x - 1;
lcd_cmd(0x80 | direccion);
}
void lcd_init() {
lcd_tris.RB0 = 0;
lcd_tris.RB1 = 0;
lcd_tris.RB2 = 0;
lcd_tris.RB3 = 0;
rs_tris = 0;
rw_tris = 0;
e_tris = 0;
rs = 0;
e = 0;
rw = 0;
__delay_ms(15);
e = 1;
lcd_cmd(0x02);
__delay_ms(2);
lcd_cmd(FOUR_BIT_2_5X7);
lcd_cmd(SHIFT_DISP_LEFT);
lcd_cmd(DISPLAY_ON);
lcd_clear();
lcd_cmd(BirinciSatir);
}
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "lcd2.h"
#pragma config PLLDIV = 1
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 1
#pragma config FOSC = HS
#pragma config BOR = ON
#pragma config BORV = 2
#pragma config WDTPS = 32768
#pragma config CCP2MX = ON
#pragma config PBADEN = ON
#pragma config MCLRE = ON
#pragma config STVREN = ON
#pragma config MCLRE = ON
void Delay1Second() {
int i = 0;
for (i = 0; i < 100; i++)
__delay_ms(10);
}
void main() {
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00000000;
TRISD = 0b00000000;
TRISE = 0b00000000;
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
PORTE = 0b00000000;
__delay_ms(25);
lcd_init();
while (1) {
putcLCD("T");
Delay1Second();
}
}no se que mas puedo hacer o que tengo malo...
Como es eso de chequeareñ bit de busy?...esa inicializacion yo la hice y nada...la volveré a hacer a ver como me va...pero eso del bit de busy no entiendo...
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#pragma config PLLDIV = 5
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2
#pragma config FOSC = HS // You can write this way
#pragma config FCMEN = OFF // OR this way
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config BORV = 3
#pragma config VREGEN = OFF
#pragma config WDT = OFF
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF
#define RS LATB4
#define EN_PIN LATB5
void Delay1Second() {
int i = 0;
for (i = 0; i < 100; i++)
__delay_ms(10);
}
void init_4bit_LCD() {
LATB = 0x03;
ClockPulse();
__delay_us(4500); // wait min 4.1ms
LATB = 0x03;
ClockPulse();
__delay_us(4500); // wait min 4.1ms
LATB = 0x03;
ClockPulse();
__delay_us(150); // wait min 150 uS
LATB = 0x02;
ClockPulse();
//Function Set: 4 bit interface, 2 lines, 5x8 dots simbols
LCD_SendCommand(0x28);
//Display ON, Cursor OFF, Blink OFF
LCD_SendCommand(0x0C);
//Clear Display
LCD_SendCommand(0x01);
__delay_us(1640);
//Modo de Operacion
LCD_SendCommand(0x06);
}
void ClockPulse() {
EN_PIN = 1;
__delay_us(40);
EN_PIN = 0;
__delay_us(40);
}
void LCD_SendCommand(unsigned char command) {
LATB = (command & 0xF0) >> 4;
ClockPulse();
LATB = command & 0x0F;
ClockPulse();
}
void LCD_SendChar(unsigned char ch) {
LATB = (1 << RS) | ((ch & 0xF0) >> 4);
ClockPulse();
LATB = (1 << RS) | (ch & 0x0F);
ClockPulse();
}
void main() {
char *str = "Hola Mundo!";
PORTB = 0x00;
TRISB = 0x00;
__delay_ms(25);
init_4bit_LCD();
for (int i = 0; str[i] != 0; i++) {
LCD_SendChar(str[i]);
}
while (1) {
LATB6 = 0;
Delay1Second();
LATB6 = 1;
Delay1Second();
}
}TEST_LCD_PIC18F4550.c:39: warning: (361) function declared implicit int
TEST_LCD_PIC18F4550.c:50: warning: (361) function declared implicit int
TEST_LCD_PIC18F4550.c:60: error: (984) type redeclared
TEST_LCD_PIC18F4550.c:60: error: (1098) conflicting declarations for variable "ClockPulse" (TEST_LCD_PIC18F4550.c:39)no se a que se deban esos errores...
/******************************************************
* LIBRERIA LCD 16x2 PIC18 *
* *
* Pines : RB0, RB1, RB2, RB3 *
* Modo : 4-bits *
* LCD 16x2 *
* Init_4bit_LCD(); Inicializa el LCD *
* LCD_Clear(); Limpia la LCD *
* LCD_SendString("String"); Escribe string en la LCD *
* LCD_SendChar('F'); Escribe caracteres en la LCD *
* LCD_GotoXY(3,1); Selecciona la Posicion de la LCD *
******************************************************/
#include <xc.h>
/******************************************/
/* Conexiones del LCD al Microcontrolador */
#define RS_PIN LATBbits.LATB4 //
#define EN_PIN LATBbits.LATB5
#define LCD_DataPort LATB
/* Configuracion del Display y cursor */
#define DON 0b00001111 /* Display encendido */
#define DOFF 0b00001011 /* Display apagado */
#define CURSOR_HOME 0b00000010 /* Cursor encendido */
#define CURSOR_ON 0b00001111 /* Cursor encendido */
#define CURSOR_OFF 0b00001101 /* Cursor apagado */
#define BLINK_ON 0b00001111 /* Cursor con parpadeo */
#define BLINK_OFF 0b00001110 /* Cursor sin parpadeo */
#define CLEAR 0b00000001 /* Display encendido */
/* Modo de entrada */
#define INCREMENT 0b00000110 /* Incrementa la posicion del cursor */
#define DECREMENT 0b00000100 /* Decrementa la posicion del cursor */
/* Configuracion de los desplazamientos del cursor y del Display*/
#define SHIFT_CUR_LEFT 0b00010011 /* Corrimiento del cursor a la izquierda */
#define SHIFT_CUR_RIGHT 0b00010111 /* Corrimiento del cursor a la derecha */
#define SHIFT_DISP_LEFT 0b00011011 /* Corrimiento del display a la izquierda */
#define SHIFT_DISP_RIGHT 0b00011111 /* Corrimiento del display a la derecha */
/* Funciones de inicializacion */
#define NIBLE 0b00000010 /* interface a 4 bits */
#define FOUR_BIT 0b00101111 /* Interface a 4-bit */
#define EIGHT_BIT 0b00111111 /* Interface a 8-bit */
#define LINE_5X7 0b00110011 /* Una linea, caracter 5x7 */
#define LINE_5X10 0b00110111 /* Una linea, caracter 5x10 */
#define LINES_5X7 0b00111011 /* Dos lineas. character 5x7 */
/* Lineas de trabajo */
#define DDRAM_LINEA_1 0b10000000 /* Linea 1 */
#define DDRAM_LINEA_2 0b11000000 /* Linea 2 */
#define DDRAM_LINEA_3 0b10010000 /* Linea 3 */
#define DDRAM_LINEA_4 0b11010000 /* Linea 4 */
extern void LCD_SendChar(unsigned char);
extern void LCD_Clear(void);
extern void LCD_SendString(const char *s);
extern void LCD_GotoXY(unsigned char x, unsigned char y);
extern void Init_4bit_LCD(void);
extern void LCD_SendCommand(unsigned char c);
void Clock_Pulse(void);
/*************************************************
* Desarrollado con la ayuda *
* del archivo pdf LCD *
* proporcionado por el *
* Ingeniero Ivan de Jesus Deras *
*************************************************/
#include "lcd2.h"
void Clock_Pulse() {
EN_PIN = 1;
__delay_us(40);
EN_PIN = 0;
__delay_us(40);
}
void LCD_SendCommand(unsigned char c) {
LCD_DataPort = (c & 0xF0) >> 4;
Clock_Pulse();
LCD_DataPort = c & 0x0F;
Clock_Pulse();
LCD_DataPort = 0x00;
__delay_ms(40);
}
void LCD_SendChar(unsigned char c) {
LCD_DataPort = (c & 0xF0) >> 4;
RS_PIN = 1;
Clock_Pulse();
RS_PIN = 0;
LCD_DataPort = (c & 0x0F);
RS_PIN = 1;
Clock_Pulse();
RS_PIN = 0;
LCD_DataPort = 0x00;
__delay_ms(40);
}
void LCD_Clear(void) {
LCD_SendCommand(0x1);
__delay_ms(2);
}
void LCD_SendString(const char * s) {
while (*s) {
LCD_SendChar(*s++);
}
}
void LCD_GotoXY(unsigned char x, unsigned char y) {
unsigned char direccion;
if (y != 1)
direccion = 0x40;
else
direccion = 0;
direccion += x - 1;
LCD_SendCommand(0x80 | direccion);
}
void Init_4bit_LCD() {
EN_PIN = 0;
RS_PIN = 0;
__delay_ms(20);
LCD_DataPort = 0x02;
Clock_Pulse();
LCD_DataPort = 0x00;
__delay_ms(20);
//Function Set: 4 bit interface, 2 lines, 5x8 dots simbols
LCD_SendCommand(0x28);
//Clear Display
LCD_SendCommand(0x01);
__delay_us(1640);
//Modo de Operacion
LCD_SendCommand(0x06);
}