Programas hechos en C18 compiler

#21
el tema correcto seria este: Ccs c programas hechos en mplab(Proyecto completo).

sobre el oscilador, guíate de esto: Consiguiendo 4 Mhz para los 48 Mhz necesarios en los PIC's con USB 2.0 que lo mismo digo "Absolutamente todo está en el datasheet".

La cosa es que cuando tomo el valor del registro que uso para leer el tmro
haciendo la conversion siempre pierdo las unidades
en el CCS trata de que el tipo de las variables sean las correctas (el CCS tiene bugs al respecto), sugiero que hagas las operaciones por separado en varias líneas para que veas donde va la falla o hacerlo en el proteus con el archivo *.cof, en modo debug y la simulación paso a paso para que revises el resultado...

igual, esperemos al experto... claro que este tema se trata del C18; el CCS lo tratan en otro sitio.

saludos
 
#22
Esta practica es muy sencilla trata de enviar el dato de la temperatura LM35 a la pc donde se vizualizaara en un software llamado " Termmometro".

Pragrama del PIC:

Código:
///////////////////////////////////////////////////////////
//TITULO: USO DEL ADC y USART                                 ///
//AUTOR: george.manson.69
//COMPILADOR: HI TECH (LITE MODE)
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

#include<htc.h>        //Incluimos libreria del micro a usar
#include<stdio.h>    //libreria para trabajar con conversiones
#include"libUSART/usartdr.h" //Libreria creada para uso del usart
#include"libADC/adcdr.h"//Inluimos libreria de trabajo con ADC

__CONFIG(UNPROTECT & WDTDIS & PWRTEN & INTIO & MCLREN & LVPDIS);
__CONFIG(DEBUGDIS & BORDIS);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//UNPROTECT    = Codigo no Potegido
//WDTDIS    = Watch Dog Timer Desactivado
//PWRTEN    = Power Activado
//INTIO        = Osiclador interno
//MCLREN    = Activamos Master Clear
//LVPDIS    = Low Voltage Porgramming Desactivado
//DEBUGDIS    = Desactiva Debug
//BOR        = Desactivado
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define _XTAL_FREQ 8000000 //Oscilador Interno de 8MHZ

unsigned char adc[2];
unsigned int dato;
///////////////////////////////
//Funcion de 1 segundo
////////////////////////////////
void Delay1S(void){
    unsigned char x;
    for(x=0;x<100;x++){
        __delay_ms(10);
    }
}
/////////////////////////////////////////////////
//Funcion de interrupcion
//Si no se usa simplemente no hacemos nada...
//Esto sirve para direccionar lo los datos
//en un lugar muy cercano al Inicio de la memoria
//de datos
////////////////////////////////////////////////
static void interrupt
isr(void){}
//////////////////////////////////////////////
//Funcion Principal
//////////////////////////////////////////////
void main(void){
///////////////////////////////////
//Registro para trabajar a 8MHZ
///////////////////////////////////
    OSCCON=0x70;
    while(HTS==0); //Es estable la frecuencia ?
    TRISA=0x07;
    TRISC=0x80;                //RB1=RX,RB2=TX
    //Configuracion del USART
    OpenUSART(25,OFF,OFF);    //value=(FOSC/(baud*16))-1
                            //SIN INTERRUPCIONES
                            //a 9600 baudios
    //Configuracion del ADC
    OpenADC(FOSC_FRC,AN0,OFF);
                            //Oscilador interno
                            //AN0 como entrada analogo
                            //PORTB sin analoga

    GIE=0;                    //INTERRUPCIONES GLOBALES DesACTIVADAS
    PEIE=0;                    //DesACTIVA INTERURPCIONES POR PERIFERICOS

    while(1){
        __delay_ms(100);
        startADC();
        while(GODONE);
        dato=readADC();
        adc[0]=(unsigned char)dato;
        adc[1]=((dato&0x0300)>>8);
        putch(adc[0]);
        putch(adc[1]);
    }
    
}
Nota parea abror el software se debe de tener instalado el framework 4 en su PC
 

Adjuntos

#23
HE realizado un programa hecho en Hi tech COMPILER.
para Manejo de un LCD 16x2 con un 74HC164.

Código:
///////////////////////////////////////////////////////////
//TITULO: USO DEL LCD 3-WIRES                            ///
//AUTOR: george.manson.69
//COMPILADOR: HI TECH (LITE MODE)
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

#include<htc.h>            //Incluimos libreria del micro a usar
#include<stdio.h>
__CONFIG(UNPROTECT & WDTDIS & PWRTEN & INTIO & MCLREN & LVPDIS);
__CONFIG(DEBUGDIS & BORDIS);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//UNPROTECT    = Codigo no Potegido
//WDTDIS    = Watch Dog Timer Desactivado
//PWRTEN    = Power Activado
//INTIO        = Osiclador interno
//MCLREN    = Activamos Master Clear
//LVPDIS    = Low Voltage Porgramming Desactivado
//DEBUGDIS    = Desactiva Debug
//BOR        = Desactivado
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define _XTAL_FREQ 8000000 //Oscilador Interno de 8MHZ
#include"libLCD3PIN/lcd3pin.h"
////////////////////////////////////////////
//VARIABLES GLOBALES
///////////////////////////////////////////
unsigned char buffer[25];
//////////////////////////////////////////////////
//Funcion de segundo
//////////////////////////////////////////////////
void DELAY1S(void){
    unsigned char seg;
    for(seg=0;seg<100;seg++){
        __delay_ms(10);
    }
}
/////////////////////////////////////////////////
//Funcion de interrupcion
//Si no se usa simplemente no hacemos nada...
//Esto sirve para direccionar lo los datos
//en un lugar muy cercano al Inicio de la memoria
//de datos
////////////////////////////////////////////////
static void interrupt
isr(void){}
/////////////////////////////////////////////////
//Funcion Principal
/////////////////////////////////////////////////
void main(void){
///////////////////////////////////
//Registro para trabajar a 8MHZ
///////////////////////////////////
    OSCCON=0x70;
    while(HTS==0); //Es estable la frecuencia ?
    //Inicializa Puertos
    TRISB=0x00;
    PORTB=0x00;
    ADCON0=0;
    ANSELH=0;
    //Inicializa LCD
    lcd_init(CURSOR_OFF);
    lcd_rom_string("LCD 3-WIRES");
    lcd_gotoxy(1,2);
    lcd_rom_string("george.manson.69");
    DELAY1S();    //Esperamos 1 Segundo
    lcd_gotoxy(1,1);
    lcd_rom_string("ucursos.webs.com");
    lcd_gotoxy(1,2);
    lcd_rom_string("                ");
    for(unsigned char cont=0;cont<100;cont++){
        sprintf(buffer," value = %u  ",cont);
        lcd_gotoxy(1,2);
        lcd_ram_string(buffer);
        __delay_ms(100);
    }
    while(1);
}
 

Adjuntos

#24
Hola george, llego tarde al tema pero no para felicitarte, desde tu otro post para ccs veo que sos un gran programador que se desempeña sin mayores problemas en uno u otro lenguaje. Veo que es muy similar al CCS, asi que seguramente pronto estaré haciendo algunas pruebas guiandome por tus trabajos.
Sin más molestar, un cordial saludo para todos.
 
#25
Hola george, llego tarde al tema pero no para felicitarte, desde tu otro post para ccs veo que sos un gran programador que se desempeña sin mayores problemas en uno u otro lenguaje. Veo que es muy similar al CCS, asi que seguramente pronto estaré haciendo algunas pruebas guiandome por tus trabajos.
Sin más molestar, un cordial saludo para todos.
Veo que los compiladores C18 y HI tech...son muy buenos y aparte estan en modo lite, y es para toda la familia 16 y 18(C18).

Espero que empecemos a hacer mas programas en C18 y Hi tech compiler.
 
#26
Buenas!
Primero que todo felicidades por el post! Apenas comienzo con C18 y ya presento problemas de los mas simples:
Tengo un 18F2550 con un pulsador en RA0, un LED en RB4, y este programa:
Código:
while(1){
  if(PORTAbits.RA0 == 1){
    LATB = 0x10;
    Delay10KTCYx(100);
    LATB = 0x00;
    Delay10KTCYx(100);
  }else{
    LATB = 0x00;
  }
}
En teoría el LED deberia prender y apagar cuando presiono el pulsador, pero solo se queda encendido.
Alguna idea?

Gracias de antemano

edit: Estoy utilizando el oscilador interno. Creo que por el ruido el LED no se veia titilar, sin embargo ya lo hace (si me alejo lo suficiente).
 
Última edición:
#27
Buenas a todos,

Logré solucionar mi problema, con un cristal de 20MHz, los condensadores de 15pF y colocando el bit FOSC = HS...

Ahora pasemos a cosas mas grandes!
 
#28
Simple uso de un LCD20x4, a 4 bits
Código:
///////////////////////////////////////////////////////////
//TITULO: USO DEL LCD 4-bits							///
//AUTOR: george.manson.69
//COMPILADOR: HI TECH (LITE MODE)
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

#include<htc.h>			//Incluimos libreria del micro a usar
__CONFIG(UNPROTECT & WDTDIS & PWRTEN & INTIO & MCLREN & LVPDIS);
__CONFIG(DEBUGDIS & BORDIS);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//UNPROTECT	= Codigo no Potegido
//WDTDIS	= Watch Dog Timer Desactivado
//PWRTEN	= Power Activado
//INTIO		= Osiclador interno
//MCLREN	= Activamos Master Clear
//LVPDIS	= Low Voltage Porgramming Desactivado
//DEBUGDIS	= Desactiva Debug
//BOR		= Desactivado
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define _XTAL_FREQ 8000000 //Oscilador Interno de 8MHZ
#include"lcd4bits/lcd.h"
////////////////////////////////////////////
//VARIABLES GLOBALES
///////////////////////////////////////////
unsigned char buffer[25];
//////////////////////////////////////////////////
//Funcion de segundo
//////////////////////////////////////////////////
void DELAY1S(void){
	unsigned char seg;
	for(seg=0;seg<100;seg++){
		__delay_ms(10);
	}
}
/////////////////////////////////////////////////
//Funcion de interrupcion
//Si no se usa simplemente no hacemos nada...
//Esto sirve para direccionar lo los datos
//en un lugar muy cercano al Inicio de la memoria
//de datos
////////////////////////////////////////////////
static void interrupt
isr(void){}
/////////////////////////////////////////////////
//Funcion Principal
/////////////////////////////////////////////////
void main(void){
///////////////////////////////////
//Registro para trabajar a 8MHZ
///////////////////////////////////
	OSCCON=0x70;
	while(HTS==0); //Es estable la frecuencia ?
	//Inicializa Puertos
	ADCON0=0;
	ANSELH=0;
	TRISC=0;
	//Inicializa LCD
	lcd_init(CURSOR_OFF);

	lcd_rom_string("  ucursos.webs.com  ");
	lcd_gotoxy(1,2);
	lcd_rom_string("  LCD20x4 - 4 bits  ");
	DELAY1S();
	lcd_gotoxy(1,3);
	lcd_rom_string("      Hi tech       ");
	lcd_gotoxy(1,4);
	lcd_rom_string("     for PIC16      ");
	while(1);
}
----------------------------------------------------------------------
Practica simple de uso de pwm dual con LCD 20 x4

Código:
///////////////////////////////////////////////////////////
//TITULO: Control de PWM DUAL							///
//AUTOR: george.manson.69
//COMPILADOR: HI TECH (LITE MODE)
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

#include<htc.h>			//Incluimos libreria del micro a usar
#include<stdio.h>
__CONFIG(UNPROTECT & WDTDIS & PWRTEN & INTIO & MCLREN & LVPDIS);
__CONFIG(DEBUGDIS & BORDIS);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//UNPROTECT	= Codigo no Potegido
//WDTDIS	= Watch Dog Timer Desactivado
//PWRTEN	= Power Activado
//INTIO		= Osiclador interno
//MCLREN	= Activamos Master Clear
//LVPDIS	= Low Voltage Porgramming Desactivado
//DEBUGDIS	= Desactiva Debug
//BOR		= Desactivado
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define _XTAL_FREQ 8000000 //Oscilador Interno de 8MHZ
#include"timer2/timer2.h"//LLama la libreria de usar Timer2
#include"pwmdr/pwm.h"	 //LLama libreria para usar PWM
#include"lcd4bits/lcd.h" //Libreria para LCD
#include"libADC/adcdr.h"//Inluimos libreria de trabajo con ADC
////////////////////////////////////////////
//VARIABLES GLOBALES
///////////////////////////////////////////
unsigned char buffer[25];
unsigned int adc[2];
//////////////////////////////////////////////////
//Funcion de segundo
//////////////////////////////////////////////////
void DELAY1S(void){
	unsigned char seg;
	for(seg=0;seg<100;seg++){
		__delay_ms(10);
	}
}
/////////////////////////////////////////////////
//Funcion de interrupcion
//Si no se usa simplemente no hacemos nada...
//Esto sirve para direccionar lo los datos
//en un lugar muy cercano al Inicio de la memoria
//de datos
////////////////////////////////////////////////
static void interrupt
isr(void){}
/////////////////////////////////////////////////
//Funcion Principal
/////////////////////////////////////////////////
void main(void){
///////////////////////////////////
//Registro para trabajar a 8MHZ
///////////////////////////////////
	OSCCON=0x70;
	while(HTS==0); //Es estable la frecuencia ?
	//Inicializa Puertos
	TRISC=0;
	TRISA=0x03;
	//Configuramos TIMER 2 para PWM
	OpenTimer2(PRESCALE_16);
	//Usamos libreria PWM
	OpenPwm(61);
	//PWM period =   [(period  ) + 1] x 4 x Tosc x TMR2 prescaler
	//PWM period =   [(255)+1]x(4/4Mhz)x16
	// [.001s/((4/4Mhz)*16)]-1=period 
	// [1/(f*(4/Tosc)*preescalar)]-1=period
	//Configuracion del ADC
	OpenADC(FOSC_FRC,AN0_AN1,OFF);
							//Oscilador interno
							//AN0 como entrada analogo
							//PORTB sin analoga
	//Inicializa LCD
	lcd_init(CURSOR_OFF);
	GIE=0;					//INTERRUPCIONES GLOBALES DesACTIVADAS
	PEIE=0;					//DesACTIVA INTERURPCIONES POR PERIFERICOS
////////////////////////////////////////////////////////////
	PwmDuty(0); //1023=100% 512=50% de duty
	PwmDuty2(0);//1023=100% 512=50% de duty

	lcd_rom_string("Control de PWM-dual ");
	DELAY1S();
	while(1){
		for(unsigned char ch=0;ch<2;ch++){
			channelADC(ch);
			__delay_ms(1);
			startADC();
			while(GODONE!=0);
			adc[ch]=readADC();
			if(adc[ch]<10) adc[ch]=0;
		}
		PwmDuty(adc[0]); //1023=100% 512=50% de duty
		PwmDuty2(adc[1]);//1023=100% 512=50% de duty
		sprintf(buffer,"PWM1= %u %% ",(unsigned int)(((unsigned long)adc[0]*100)/1023));
		lcd_gotoxy(1,2);
		lcd_ram_string(buffer);
		sprintf(buffer,"PWM2= %u %% ",(unsigned int)(((unsigned long)adc[1]*100)/1023));
		lcd_gotoxy(1,3);
		lcd_ram_string(buffer);
		__delay_ms(10);	
	}
			
	while(1);
}
 

Adjuntos

Última edición:
#32
En esta vez les traigo un gran manual de uso de Hi tech compiler:
De los cuales los temas son los siguientes.:

Código:
Índice
1 Introducción a la programación en C
1.1 Estructura de un programa____________________________________________1
1.2 Tipos de datos_______________________________________________________2
1.3 Constantes__________________________________________________________2
1.4 Tipos de Variables____________________________________________________2
1.5 Operadores_________________________________________________________3
1.5.1 Asignaciones_____________________________________________________3
1.5.2 Aritmética_______________________________________________________4
1.5.3 Relaciones_______________________________________________________4
1.6 Funciones___________________________________________________________5
2 Declaraciones de Control
2.1 IF-ELSE________________________________________________________________6
2.2 SWITCH-CASE___________________________________________________________7
2.3 FOR___________________________________________________________________8
2.4 WHILE/DO/WHILE________________________________________________________9
2.5 COMENTARIOS___________________________________________________________11
PRIMER PROGRAMA___________________________________________________________11
3 TIMERS
3.1 Timer0_______________________________________________________________17
3.2 Interrupción por desbordamiento_________________________________________22
3.3 Práctica: Corrimiento___________________________________________________25
4 USART
4.1 Modo Asincrónico________________________________________________________28
4.2 Modo Sincrónico_________________________________________________________28
4.3 Velocidad de Comunicación_________________________________________________29
4.4 Norma R232_____________________________________________________________29
4.5 Conexión de un Microcontrolador____________________________________________29
4.6 El conector DB9___________________________________________________________29
4.7 MAX232_________________________________________________________________30
4.8 Función en Hi tech_________________________________________________________30
4.9 Practica: Uso del USART_____________________________________________________31
5 ADC ---------------------------------------------------------------------------------------------------------------37
6 CCP
6.1 Modo Captura ___________________________________________________________42
6.2 Modo PWM _____________________________________________________________48
6.3 Modo Comparador________________________________________________________54
7 GLCD -------------------------------------------------------------------------------------------------------------60
7.7 Voltímetro con GLCD_______________________________________________________67
8 MMC
8.1 Conexión y señales en las tarjetas MMC________________________________________72
8.2 Tarjeta SD________________________________________________________________72
8.3 Conexión y señales en las Tarjetas SD _________________________________________73
8.4 Funcionamiento general del Protocolo_________________________________________74
8.5 Comandos Modo SPI_______________________________________________________74
8.6 Típicas Conexiones ________________________________________________________78
8.7 Utilidades para la práctica __________________________________________________79
8.8 Librería para Manejo de Tarjetas MMC________________________________________80
8.9 Usando Librería ___________________________________________________________81
9 Usando WinHEX_____________________________________________________________84
10 Practicas
10.1 Visualizador de ADC con Display’s de 7 seg ______________________________________85
10.2 Contador de Eventos con Display de 7 seg _______________________________________96
10.3 Reloj _____________________________________________________________________101
10.4 Matriz de led 8x8 ___________________________________________________________108
10.5 Cambio de Matrix via USART __________________________________________________116
10.6 Matriz de corrimiento ________________________________________________________122
10.7 Cambio de Texto por USART ___________________________________________________127
10.8 Proyectos con LCD y Teclado 4x4 _______________________________________________132
10.9 GLCD & MMC: Proyector de Imágenes ___________________________________________153
Pueden bajarlo gratis.

en http://ucursos.webs.com

deja tus comentarios. SALU2
 
#33
Simple enlace entre labview y pic16 usando serial.

Código:
///////////////////////////////////////////////////////////
//TITULO: USO DEL ADC y USART                                 ///
//AUTOR: george.manson.69
//COMPILADOR: HI TECH (LITE MODE)
//PAGE: http://ucursos.blogspot.com
//PAGE2:http://ucursos.webs.com
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

#include<htc.h>        //Incluimos libreria del micro a usar
#include<stdio.h>    //libreria para trabajar con conversiones
#include"libUSART/usartdr.h" //Libreria creada para uso del usart
#include"libADC/adcdr.h"//Inluimos libreria de trabajo con ADC

__CONFIG(UNPROTECT & WDTDIS & PWRTEN & INTIO & MCLREN & LVPDIS);
__CONFIG(DEBUGDIS & BORDIS);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//UNPROTECT    = Codigo no Potegido
//WDTDIS    = Watch Dog Timer Desactivado
//PWRTEN    = Power Activado
//INTIO        = Osiclador interno
//MCLREN    = Activamos Master Clear
//LVPDIS    = Low Voltage Porgramming Desactivado
//DEBUGDIS    = Desactiva Debug
//BOR        = Desactivado
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define _XTAL_FREQ 8000000 //Oscilador Interno de 8MHZ

unsigned int adc;
unsigned char y;

///////////////////////////////
//Funcion de 1 segundo
////////////////////////////////
void Delay1S(void){
    unsigned char x;
    for(x=0;x<100;x++){
        __delay_ms(10);
    }
}
/////////////////////////////////////////////////
//Funcion de interrupcion
//Si no se usa simplemente no hacemos nada...
//Esto sirve para direccionar lo los datos
//en un lugar muy cercano al Inicio de la memoria
//de datos
////////////////////////////////////////////////
static void interrupt
isr(void){}
//////////////////////////////////////////////
//Funcion Principal
//////////////////////////////////////////////
void main(void){
///////////////////////////////////
//Registro para trabajar a 8MHZ
///////////////////////////////////
    OSCCON=0x70;
    while(HTS==0); //Es estable la frecuencia ?
    TRISA=0x01;
    TRISC=0x80;                //RB1=RX,RB2=TX
    //Configuracion del USART
    OpenUSART(25,OFF,OFF);    //value=(FOSC/(baud*16))-1
                            //SIN INTERRUPCIONES
                            //a 2400 baudios
    //Configuracion del ADC
    OpenADC(FOSC_FRC,AN0,OFF);
                            //Oscilador interno
                            //AN0 como entrada analogo
                            //PORTB sin analoga
//Desactivo Interrupciones GENERALES
    GIE=0;                    //INTERRUPCIONES GLOBALES DesACTIVADAS
    PEIE=0;                    //DesACTIVA INTERURPCIONES POR PERIFERICOS

    while(1){
        channelADC(0);        //Elige canal analogo
        Delay1S();            //Retardo de 1S para leer correctamente
        startADC();            //Empieza Ciclo de Conversion
        while(GODONE!=0);    //Ha terminado de convertir
        adc=readADC();        //Lee dato analogo
        printf("\fCanal Analogo 0 = %u",adc);//Imprime Dato analogo.
    }
    
}
 

Adjuntos

#35
Buenas!
Primero que todo felicidades por el post! Apenas comienzo con C18 y ya presento problemas de los mas simples:
Tengo un 18F2550 con un pulsador en RA0, un LED en RB4, y este programa:
Código:
while(1){
  if(PORTAbits.RA0 == 1){
    LATB = 0x10;
    Delay10KTCYx(100);
    LATB = 0x00;
    Delay10KTCYx(100);
  }else{
    LATB = 0x00;
  }
}
En teoría el LED deberia prender y apagar cuando presiono el pulsador, pero solo se queda encendido.
Alguna idea?

Gracias de antemano

edit: Estoy utilizando el oscilador interno. Creo que por el ruido el LED no se veia titilar, sin embargo ya lo hace (si me alejo lo suficiente).
Hola

Tengo una rutina muy similar que use para enviar caracteres por el puerto serie al presionar un boton, al mismo tiempo enciendo el led para iluminarme.

Te dejo el fragmento espero te sirva, yo tampoco logro ver diferencia con tu codigo.


while (1){
while (Kbhit==0){ //Mientras no reciba dato USART
putrsXLCD("Hor:min:seg");
gotoxyXLCD(1,2);
putrsXLCD("dia y fecha");
if (BOTON == 1)
{
putrsUSART("AT+CMSS=2\r\n");
LED = 1;
comandXLCD(0x01);
putrsXLCD("Enviando mensaje");
Espera(); //Loop espera si se queda presionado boton
Delay10KTCYx(100);
Delay10KTCYx(100);
comandXLCD(0x01);
}else{
LED = 0;
}
}
Delay10KTCYx(100);
Delay10KTCYx(100);
Delay10KTCYx(100);
Delay10KTCYx(100);
Kbhit=0;
}
}
 
#37
Que tal george :apreton:mirando tu post me dio la curiosidad por aprender, pude relizar esto con tu diseño y parte del programa donde manejas el nokia 3310 anexo la simulacion en proteus 7.7 y el programa en hi tech

Código:
#include <pic.h>  
#include <htc.h>
__CONFIG(FOSC_HS &   
  WDTE_OFF &   
  PWRTE_ON  &  
  BOREN_OFF &  
  MCLRE_ON &   
  LVP_OFF);  
#define GLCD_CS  RD0
#define GLCD_RST RD1
#define GLCD_DC  RD2
#define GLCD_SDA RD3
#define GLCD_SCLK RD4
#define _XTAL_FREQ 20000000
void pic_init(void);
void glcd8544_init(void);
void glcd8544_write(unsigned char c);
void glcd8544_goto(char x,char y);
void glcd8544_char(char c);
void glcd8544_string(const char *s);
static const char FontLookup[][5]={
{0x00,0x00,0x00,0x00,0x00},   // sp
{0x00,0x00,0x2f,0x00,0x00},   // !
{0x00,0x07,0x00,0x07,0x00},   // "
{0x14,0x7f,0x14,0x7f,0x14},   // #
{0x24,0x2a,0x7f,0x2a,0x12},   // $
{0xc4,0xc8,0x10,0x26,0x46},   // % 
{0x36,0x49,0x55,0x22,0x50},   // &
{0x00,0x05,0x03,0x00,0x00},   // '
{0x00,0x1c,0x22,0x41,0x00},   // (
{0x00,0x41,0x22,0x1c,0x00},   // )
{0x14,0x08,0x3E,0x08,0x14},   // *
{0x08,0x08,0x3E,0x08,0x08},   // +
{0x00,0x00,0x50,0x30,0x00},   // ,
{0x10,0x10,0x10,0x10,0x10},   // -
{0x00,0x60,0x60,0x00,0x00},   // .
{0x20,0x10,0x08,0x04,0x02},   // /
{0x3E,0x51,0x49,0x45,0x3E},   // 0
{0x00,0x42,0x7F,0x40,0x00},   // 1
{0x42,0x61,0x51,0x49,0x46},   // 2
{0x21,0x41,0x45,0x4B,0x31},   // 3
{0x18,0x14,0x12,0x7F,0x10},   // 4
{0x27,0x45,0x45,0x45,0x39},   // 5
{0x3C,0x4A,0x49,0x49,0x30},   // 6
{0x01,0x71,0x09,0x05,0x03},   // 7
{0x36,0x49,0x49,0x49,0x36},   // 8
{0x06,0x49,0x49,0x29,0x1E},   // 9
{0x00,0x36,0x36,0x00,0x00},   // :
{0x00,0x56,0x36,0x00,0x00},   // ;
{0x08,0x14,0x22,0x41,0x00},   // <
{0x14,0x14,0x14,0x14,0x14},   // =
{0x00,0x41,0x22,0x14,0x08},   // >
{0x02,0x01,0x51,0x09,0x06},   // ?
{0x32,0x49,0x59,0x51,0x3E},   // @
{0x7E,0x11,0x11,0x11,0x7E},   // A
{0x7F,0x49,0x49,0x49,0x36},   // B
{0x3E,0x41,0x41,0x41,0x22},   // C
{0x7F,0x41,0x41,0x22,0x1C},   // D
{0x7F,0x49,0x49,0x49,0x41},   // E
{0x7F,0x09,0x09,0x09,0x01},   // F
{0x3E,0x41,0x49,0x49,0x7A},   // G
{0x7F,0x08,0x08,0x08,0x7F},   // H
{0x00,0x41,0x7F,0x41,0x00},   // I
{0x20,0x40,0x41,0x3F,0x01},   // J
{0x7F,0x08,0x14,0x22,0x41},   // K
{0x7F,0x40,0x40,0x40,0x40},   // L
{0x7F,0x02,0x0C,0x02,0x7F},   // M
{0x7F,0x04,0x08,0x10,0x7F},   // N
{0x3E,0x41,0x41,0x41,0x3E},   // O
{0x7F,0x09,0x09,0x09,0x06},   // P
{0x3E,0x41,0x51,0x21,0x5E},   // Q
{0x7F,0x09,0x19,0x29,0x46},   // R
{0x46,0x49,0x49,0x49,0x31},   // S
{0x01,0x01,0x7F,0x01,0x01},   // T
{0x3F,0x40,0x40,0x40,0x3F},   // U
{0x1F,0x20,0x40,0x20,0x1F},   // V
{0x3F,0x40,0x38,0x40,0x3F},   // W
{0x63,0x14,0x08,0x14,0x63},   // X
{0x07,0x08,0x70,0x08,0x07},   // Y
{0x61,0x51,0x49,0x45,0x43},   // Z
{0x00,0x7F,0x41,0x41,0x00},   // [
{0x55,0x2A,0x55,0x2A,0x55},   // 55
{0x00,0x41,0x41,0x7F,0x00},   // ]
{0x04,0x02,0x01,0x02,0x04},   // ^
{0x40,0x40,0x40,0x40,0x40},   // _
{0x00,0x01,0x02,0x04,0x00},   // '
{0x20,0x54,0x54,0x54,0x78},   // a
{0x7F,0x48,0x44,0x44,0x38},   // b
{0x38,0x44,0x44,0x44,0x20},   // c
{0x38,0x44,0x44,0x48,0x7F},   // d
{0x38,0x54,0x54,0x54,0x18},   // e
{0x08,0x7E,0x09,0x01,0x02},   // f
{0x0C,0x52,0x52,0x52,0x3E},   // g
{0x7F,0x08,0x04,0x04,0x78},   // h
{0x00,0x44,0x7D,0x40,0x00},   // i
{0x20,0x40,0x44,0x3D,0x00},   // j
{0x7F,0x10,0x28,0x44,0x00},   // k
{0x00,0x41,0x7F,0x40,0x00},   // l
{0x7C,0x04,0x18,0x04,0x78},   // m
{0x7C,0x08,0x04,0x04,0x78},   // n
{0x38,0x44,0x44,0x44,0x38},   // o
{0x7C,0x14,0x14,0x14,0x08},   // p
{0x08,0x14,0x14,0x18,0x7C},   // q
{0x7C,0x08,0x04,0x04,0x08},   // r
{0x48,0x54,0x54,0x54,0x20},   // s
{0x04,0x3F,0x44,0x40,0x20},   // t
{0x3C,0x40,0x40,0x20,0x7C},   // u
{0x1C,0x20,0x40,0x20,0x1C},   // v
{0x3C,0x40,0x30,0x40,0x3C},   // w
{0x44,0x28,0x10,0x28,0x44},   // x
{0x0C,0x50,0x50,0x50,0x3C},   // y
{0x44,0x64,0x54,0x4C,0x44}    // z
};
main(void)
{
pic_init();      
glcd8544_init();     
__delay_ms(250);
for(;;){
 glcd8544_goto(0,0);
 glcd8544_string("PRUEBA HI-TECH");
 glcd8544_string("  84X48 GLCD  ");
 glcd8544_string("NOKIA 3310 LCD");
 glcd8544_string("              ");
 glcd8544_string("              ");
 glcd8544_string("              ");
 __delay_ms(1000);
 glcd8544_goto(0,0);
 glcd8544_string("              ");
 glcd8544_string("              ");
 glcd8544_string("              ");
 glcd8544_string(" PIC 16F887 ");
 glcd8544_string("    GRACIAS    ");
 glcd8544_string("  GEORGE MANSON ");
 __delay_ms(1000);
}}
void pic_init(void)
{
TRISA=0b00010000;
TRISB=0b00000000;
TRISC=0b00000000;
TRISD=0b00000000;
TRISE=0b00000000;
ANSEL=0b00000000;
ANSELH=0b00000000;   
PORTA=0b00000000;
PORTB=0b00000000;
PORTC=0b00000000;
PORTD=0b00000000;
PORTE=0b00000000;
}
 
void glcd8544_init(void)
{
GLCD_RST=1;
__delay_ms(15);  
glcd8544_write(0x21);  
glcd8544_write(0xC0);  
glcd8544_write(0x13);   
glcd8544_write(0x20);   
glcd8544_write(0x0C);   
}
 
void glcd8544_write(unsigned char c)   
{int i;
GLCD_CS=0;
for(i=7;i>=0;i--){
 if(((c>>i)&1)==1) GLCD_SDA=1;
 else GLCD_SDA=0;
 GLCD_SCLK=0;
 GLCD_SCLK=1;}
GLCD_CS=1;
}
 
void glcd8544_goto(char x, char y)
{
GLCD_DC=0;
glcd8544_write(0x40+y);
glcd8544_write(0x80+x);
GLCD_DC=1;
}
 
void glcd8544_char(char c)    
{int i;
for(i=0;i<5;i++) glcd8544_write(FontLookup[c-32][i]);
glcd8544_write(0x00);  
}
 
void glcd8544_string(const char *s) 
{
GLCD_DC=1;
while(*s)      
glcd8544_char(*s++);  
}
Pero me sale un mensaje en la compilacion que el programa se puede potencializar en un 40%:D
 

Adjuntos

#39
Que tal foreros tengo una duda con el protocolo I2C no se como utilizar las funciones del compilador C18 para hacerlo funcionar, intente seguir un tutorial de c18 donde venia un ejemplo para escribir y leer en una eeprom pero no me simulo bien y tambien el ejemplo de este tema y no me simula bien y ya no eh encontrado otro ejemplo, de casualidad alguien x favor tiene algun ejemplo sencillo de I2C en C18, o un tutorial lo necesito la comunicacion para obtener datos de un sensor hmc5883l pero no eh ni podido siquiera simular con una eeprom para leer y escribir datos, es para un pic18f458 gracias, mientras seguire intentando con el ejemplo de este tema
 
Última edición:
Arriba