Programas hechos en MPLAB

entonces que puedo hacer... ya estoy arta... no encuentro el error... plis que alguien me ayude...
MM yo no veo que en los #fuses halas puesto el HS para que trabaje con un cristal de 20Mhz, y tambien veo que en los fueses esta el WDT activado, aunque lo desactives en main() mejor desactivalo desde los fuses.

He aqui 3 practicas con labview con pic18f2550 con el protocolo USB modo Bulk Transfer. Espero que sea de utilidad. Y por supuesto el Diagramas y programas para el microcontrolador hecho en C.
 

Adjuntos

Última edición:
ok gracias.... estoy revisando lo que me has enviado... yo te aviso despues si me ha servido... si por ahi tienen un codigo de una lcd con rw a tierra y funcionando a 20Mhz y me lo proporcionan se los agradeciria mucho... gracias...

ah y no le he puesto HS porque el clock es externo tiene un cristal de 20Mhz... y esta conectado entre la pata OSC1 Y OSC2
 
Última edición:
hola ingdenis1 encontre esta liberia de un teclado 4x4 en google...a ver si te sirve!

Código:
///////////////////////////////////////////////////////////////////////////
////                     KBD_LIB.C by Redraven                         ////
////                                                                   ////
////                     Derived from KBDD.C                           ////
////                  Generic keypad scan driver                       ////
////                                                                   ////
////  kbd_init()   Must be called before any other function.           ////
////                                                                   ////
////  c = kbd_getc(c)  Will return a key value if pressed or /0 if not ////
////                   This function should be called frequently so as ////
////                   not to miss a key press.                        ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,1997 Custom Computer Services            ////
//// This source code may only be used by licensed users of the CCS C   ////
//// compiler.  This source code may only be distributed to other       ////
//// licensed users of the CCS C compiler.  No other use, reproduction  ////
//// or distribution is permitted without written permission.           ////
//// Derivative programs created using this software in object code     ////
//// form are not restricted in any way.                                ////
////////////////////////////////////////////////////////////////////////////

////////////////// The following defines the keypad layout on port D

// Un-comment the following define to use port B
#define use_portb_kbd TRUE

// Make sure the port used has pull-up resistors (or the LCD) on
// the column pins


#if defined(__PCH__)
#if defined use_portb_kbd
   #byte kbd = 0xF81              // This puts the entire structure
#else
   #byte kbd = 0xF83              // This puts the entire structure
#endif
#else
#if defined use_portb_kbd
   #byte kbd = 6                  // on to port B (at address 6)
#else
   #byte kbd = 8                  // on to port D (at address 8)
#endif
#endif

#if defined use_portb_kbd
   #define set_tris_kbd(x) set_tris_b(x)
#else
   #define set_tris_kbd(x) set_tris_d(x)
#endif

//Keypad connection:   (for example column 0 is B0)

#define COL0 (1 << 0) // PIN_B0
#define COL1 (1 << 1) // PIN_B1
#define COL2 (1 << 2) // PIN_B2
#define COL3 (1 << 3) // PIN_B3

#define ROW0 (1 << 4) // PIN_B4
#define ROW1 (1 << 5) // PIN_B5
#define ROW2 (1 << 6) // PIN_B6
#define ROW3 (1 << 7) // PIN_B7


#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)


#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2|COL3)


// Keypad layout:

char const KEYS[4][4] = {{'1','2','3','A'},
                         {'4','5','6','B'},
                         {'7','8','9','C'},
                         {'*','0','#','D'}};


#define KBD_DEBOUNCE_FACTOR 33    // Set this number to apx n/333 where
                                  // n is the number of times you expect
                                  // to call kbd_getc each second

void kbd_init() {
}

char kbd_getc( ) {
   static byte kbd_call_count;
   static short int kbd_down;
   static char last_key;
   static byte col;

   byte kchar;
   byte row;

   kchar='\0';
   if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
       switch (col) {
         case 0   : set_tris_kbd(ALL_PINS&~COL0);
                    kbd=~COL0&ALL_PINS;
                    break;
         case 1   : set_tris_kbd(ALL_PINS&~COL1);
                    kbd=~COL1&ALL_PINS;
                    break;
         case 2   : set_tris_kbd(ALL_PINS&~COL2);
                    kbd=~COL2&ALL_PINS;
                    break;
         case 3   : set_tris_kbd(ALL_PINS&~COL3);
                    kbd=~COL3&ALL_PINS;
                    break;
       }

       if(kbd_down) {
         if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
           kbd_down=false;
           kchar=last_key;
           last_key='\0';
         }
       } else {
          if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
             if((kbd & ROW0)==0)
               row=0;
             else if((kbd & ROW1)==0)
               row=1;
             else if((kbd & ROW2)==0)
               row=2;
             else if((kbd & ROW3)==0)
               row=3;
             last_key =KEYS[row][col];
             kbd_down = true;
          } else {
             ++col;
             if(col==4)
               col=0;
          }
       }
      kbd_call_count=0;
   }
  set_tris_kbd(ALL_PINS);
  return(kchar);
}
y este es un ejemplo donde al aplanar una tecla del teclado 4x4 te lo envia a la compu!
(yo no lo hice, por ahi me lo encontre jeje)


Código:
#include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use fast_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#include "kbd_lib.c"

void main(){
   char mitecla=0;

   kbd_init();
   printf("\rKeyboard 4x4 monitor\r\r";
   do {
      mitecla=kbd_getc();
      if(mitecla!=0){
         putc(mitecla);
      }
   } while (TRUE);
}
hola george.manson quisiera saber como agregar esa libreria de keypath 4x4 a mi software ccs para asi trabajar mas facilmente podrias explicar el codigo de ejemplo que encontraste
 
hola george.manson quisiera saber como agregar esa libreria de keypath 4x4 a mi software ccs para asi trabajar mas facilmente podrias explicar el codigo de ejemplo que encontraste
es facil copia el codigo y pegalo en bloc de notas conla extencion '.c' y grabalo en la carpeta de drivers donde esta ubicado donde esta instado el programa PICC.

y hacer tu programita solo incluye la libreria y listo
 
Hola que tal yo solucione mi problema si alguien necesita el codigo aqui se los dejo... gracias igual por su ayuda...

Código:
#define use_porte_lcd TRUE  //LCD conectado al puerto e

struct lcd_pin_map {                 // This structure is overlayed
   BOOLEAN enable;       //MODIFICADA PARA EASYPIC--------------------
   BOOLEAN rs;      //MODIFICADA PARA EASYPIC--------------------
   BOOLEAN unused;  // on to an I/O port to gain
   BOOLEAN unused1;  // access to the LCD pins.
                    // The bits are allocated from
                    // low order up.  ENABLE will
   int   data : 4;  // be pin B3-------------------------
} lcd;

#byte lcd = 0xF84
#define set_tris_lcd(x) set_tris_e(x)

#define lcd_type 2        // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line  

byte const LCD_INIT_STRING[4] =
{
 0x28 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
 0xf,                    // Display on
 1,                      // Clear display
 6                       // Increment cursor
 }; 
//-------------------------------------

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out

void lcd_send_nibble(byte nibble)
{
   lcd.data = nibble;
   delay_cycles(1);
   lcd.enable = 1;
   delay_us(2);
   lcd.enable = 0;
}
//-----------------------------------

//----------------------------------------

// Send a byte to the LCD.
void lcd_send_byte(byte address, byte n)
{
      lcd.rs = 0;
      delay_us(3000);
      lcd.rs = address;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}
//---------------------------------------

void lcd_init(void)
{
   BYTE i;
   set_tris_lcd(LCD_WRITE);
   lcd.rs = 0;
   lcd.enable = 0;
   delay_ms(50);
   lcd_send_nibble(2);
   delay_ms(5);
   for(i=0;i<=3;++i)
   {
      lcd_send_byte(0,LCD_INIT_STRING[i]);
      delay_ms(5); 
   }
}
//----------------------------
 
void lcd_gotoxy(byte x, byte y)
{
   byte address;
   if(y != 1)
      address = lcd_line_two;
   else
      address=0;
   address += x-1;
   lcd_send_byte(0, 0x80 | address);
}
//-----------------------------

void lcd_putc(char c)
{
   switch(c)
   {
      case '\f':                //limpia pantalla
         lcd_send_byte(0,1);
         delay_ms(2);
         break;
      case '\n':                //cambio de linea
         lcd_gotoxy(1,2);
         break;
      case '\b':                //retrocede 1 caracter
         lcd_send_byte(0,0x10);
         break;
      default:
         lcd_send_byte(1,c);
         break;
   }
}
//------------------------------

void lcd_setcursor_vb(short visible, short blink) 
{
  lcd_send_byte(0, 0xC|(visible<<1)|blink); 
}
 
Última edición por un moderador:
Hola a todos

estoy programando en Ccs un 16f877a y la cosa es que necesito leer los bits del puerto E individualmente, tengo conectadas ahi resistencias y botones y de ahi a la fuente, tengo algo como esto


port_e_pullups(TRUE);
set_tris_E=(0b00000111);
if(bit_test(9,1))
{
// aqui irian las instrucciones en caso de que se este presionando el boton conectado al pin RE0
}
while(true){}
}

se que estoy haciendo algo mal porque no me sale o no se que me falte o que onda

mucho agradecere su ayuda
 
Hola a todos

estoy programando en Ccs un 16f877a y la cosa es que necesito leer los bits del puerto E individualmente, tengo conectadas ahi resistencias y botones y de ahi a la fuente, tengo algo como esto


port_e_pullups(TRUE);
set_tris_E=(0b00000111);
if(bit_test(9,1))
{
// aqui irian las instrucciones en caso de que se este presionando el boton conectado al pin RE0
}
while(true){}
}

se que estoy haciendo algo mal porque no me sale o no se que me falte o que onda

mucho agradecere su ayuda
usa la logica de switch case:

por ejemplo

Código:
x=input_a() & 0b00000111; //Tomo solo los tres switches

switch(x){
case 0: //sentencia
case 1: //sentecnia
case ....
case 7: //ya que los tres interruptores toman un valor decimal de 7 cuando estan conectados los tres interruptores

}
 
hay varias formas yo nunca use la instrucción bit_test pero te muestro estas otras alternativas:

Código:
if(INPUT(PIN_E0))
{
//insertar aqui código

}
o definis una variable:

Código:
while(TRUE)
{
pulsador=INPUT(PIN_E0);
if(pulsador==1)
{
//inserte aqui codigo
}
}

o le das un nombre al pin
Código:
#bit BOTON = PORTE.0

if(BOTON)
{
//inserte aquí su codigo
}
La última es la mas cómoda, espero te sirva
 
Estaba por sugerirte lo mismo que el amigo
Vegetal Digital, pero creo que ya tienes suficientes ejemplos..
La verdad tampoco uso esta sentencia para leer puertos
Mas bien a nivel de bits, con if, o con la sentencia switch case, como sugiere otro amigo en el foro..:aplauso:
 
Estoy usando un pic 16F877 con un LCD 4X20 en CCS,lo conecto al puerto B en la configuracion de 4 bits,cristal de 4 Mhz con el siguiente codigo:

PHP:
#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#include <LCD420.c>
#define use_portb_lcd TRUE

void main() {
 
 
 lcd_init();
 
 lcd_putc("\f Hernan Alberto A. \n");
 lcd_putc("Ejemplo LCD en CCS C");
 
}
Ya me estoy volviendo loco!!!:enfadado: y no me funciona,puse este codigo,por lo simple,estoy haciendo las cosas muy simples pero nada! Habre puesto bien los fuses? Solo se me iluminan las lineas 1 y 3. Alguien puede decirme que podra ser?
 
Última edición por un moderador:
Arriba