Autor Tema: PIC18F458.  (Leído 1619 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado tone04

  • PIC10
  • *
  • Mensajes: 9
PIC18F458.
« en: 10 de Marzo de 2013, 03:47:24 »
Este codigo lo hice en el MPLAB con C18, pero no se si se pueda hacer en PIC compiler mas facil o parecido, y no se si pueda sustituir el teclado matricial por 4 push buttom, y ponerle un contador y que este se envie al lcd y que aparezcan mensajes en el lcd y luego poderlos enviar a puerto serie espero su ayuda y respuestas saludos a todos.
#define MX_PIC

//Defines for microcontroller
#define P18F458
#define MX_EE
#define MX_EE_TYPE3
#define MX_EE_SIZE 256
#define MX_SPI
#define MX_SPI_C
#define MX_SPI_SDI 4
#define MX_SPI_SDO 5
#define MX_SPI_SCK 3
#define MX_UART
#define MX_UART_C
#define MX_UART_TX 6
#define MX_UART_RX 7
#define MX_I2C
#define MX_MI2C
#define MX_I2C_C
#define MX_I2C_SDA 4
#define MX_I2C_SCL 3
#define MX_PWM
#define MX_PWM_CNT 1
#define MX_PWM_TRIS1 trisc
#define MX_PWM_1 2

//Functions
#include <system.h>
#pragma CLOCK_FREQ 4000000

//Configuration data
#pragma DATA 0x300000, 0xff
#pragma DATA 0x300001, 0x21
#pragma DATA 0x300002, 0xc
#pragma DATA 0x300003, 0xe
#pragma DATA 0x300004, 0xff
#pragma DATA 0x300005, 0xff
#pragma DATA 0x300006, 0x80
#pragma DATA 0x300007, 0xff
#pragma DATA 0x300008, 0xf
#pragma DATA 0x300009, 0xc0
#pragma DATA 0x30000a, 0xf
#pragma DATA 0x30000b, 0xe0
#pragma DATA 0x30000c, 0xf
#pragma DATA 0x30000d, 0x40

//Internal functions
#include "C:\Program Files (x86)\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//Macro function declarations


//Variable declarations
char FCV_KEYPAD;
char FCV_IN;
char FCV_CON;


//Defines:

/**** Macro Substitutions ****
portc = RTS Port
trisc = RTS Data Direction
portc = CTS Port
trisc = CTS Data Direction
0 = RTS Pin
4 = CTS Pin
1 = UART Selection      (0-SW / 1-UART1 / 2-UART2)
0 = Flow Control      (0-Off / 1-On)
0 = Debug Enable      (0-Off / 1-On)
0 = Echo Enable      (0-Off / 1-On)
4 = UART TXSTA Value
25 = UART SPBRG Value
RS232_1376786 = Unique ID
Unused = Bitbanged Receive Port Register
Unused = Bitbanged Receive Data Direction Register
Unused = Bitbanged Receive Pin
Unused = Bitbanged Transmit Pin
7 = Bitbanged BAUD Rate Delay
0 = Timout   Selection   (0-Legacy / 1-MS Timeout)
0 = Data Size         (0-8 bits / 1-9 bits / 2-7 bits & Only available on BitBanged components)
0 = Parity Enable      (0-No Parity / 1-Odd Parity / 2-Even Parity)
0 = Legacy Return      (0-Legacy mode return 255 / 1-New mode return MSB err flags)
Unused = Bitbanged Transmit Port Register
Unused = Bitbanged Transmit Data Direction Register
******************************/

#define RS232_1376786_RTS_PORT         portc
#define RS232_1376786_RTS_TRIS         trisc
#define RS232_1376786_CTS_PORT         portc
#define RS232_1376786_CTS_TRIS         trisc
#define RS232_1376786_RTS_PIN         0
#define RS232_1376786_CTS_PIN         4
#define RS232_1376786_UART            1
#define RS232_1376786_TOUT           0
#define RS232_1376786_DATASIZE         0
#define RS232_1376786_PARITY         0
#define RS232_1376786_LEGACY_RV         0

#if (0 == 1)
     #define RS232_1376786_HARDWARE
#endif

#if (0 == 1)
     #define RS232_1376786_DEBUG
#endif

#if (0 == 1)
     #define RS232_1376786_ECHO
#endif

#if (RS232_1376786_UART == 0)
   #define RS232_1376786_RX_PORT      Unused
   #define RS232_1376786_RX_TRIS      Unused
   #define RS232_1376786_SW_RX         Unused
   #define RS232_1376786_SW_TX         Unused
   #define RS232_1376786_SW_BAUD      7
   #define RS232_1376786_TX_PORT      Unused
   #define RS232_1376786_TX_TRIS      Unused
#else
   #define RS232_1376786_TXSTA_VAL     4
   #define RS232_1376786_SPBRG_VAL     25
   #define RS232_1376786_SW_BAUD      0
#endif

#if (RS232_1376786_LEGACY_RV == 0)
   #if (RS232_1376786_DATASIZE == 1)
      #pragma error "RS232 Component cannot combine 9-bit data mode with legacy return value of 255 please check the Component properties"
   #endif
#endif

#define RS232_1376786_STATUS_LOOP      0
#define RS232_1376786_STATUS_TIMEOUT   1
#define RS232_1376786_STATUS_RXBYTE   2





//RS2320: //Macro function declarations

void FCD_RS2320_SendRS232Char(short nChar);
void FCD_RS2320_SendRS232String(char* String, char MSZ_String);
short FCD_RS2320_ReceiveRS232Char(short nTimeout);
void FCD_RS2320_ReceiveRS232String(char* FCR_RETVAL, char FCR_RETVAL_SIZE, char nTimeout, char NumBytes);
void FCD_RS2320_RS232_Delay();
//Defines:

/**** Macro Substitutions ****
{'1','4','7','*','2','5','8','0','3','6','9','#'} = Key List (Numbers)
{1,4,7,10,2,5,8,0,3,6,9,11} = Key List (Characters)
trisd = Row Data Direction Register
portd = Row Port Register
3 = Number Of Columns
4 = Number Of Rows
trisd = Column Data Direction Register
portd = Column Port Register
1 = Column 1 mask
2 = Column 2 mask
4 = Column 3 mask
16 = Column 4 mask
16 = Row 1 mask
32 = Row 2 mask
64 = Row 3 mask
128 = Row 4 mask
******************************/




//KeyPad0: //Macro function declarations

char FCD_KeyPad0_GetKeypadNumber();
char FCD_KeyPad0_GetKeypadAscii();
//Defines:

/**** Macro Substitutions ****
portb = D1 Port
trisb = D1 Data Direction
portb = D2 Port
trisb = D2 Data Direction
portb = D3 Port
trisb = D3 Data Direction
portb = D4 Port
trisb = D4 Data Direction
portb = RS Port
trisb = RS Data Direction
portb = E Port
trisb = E Data Direction
0 = Data 1_Pin
1 = Data 2 Pin
2 = Data 3 Pin
3 = Data 4 Pin
4 = RS Pin
5 = Enable Pin
LCD_1966758 = Unique Component Reference Number
2 = Row Count
16 = Column Count
******************************/

   //component connections
   #define LCD_1966758_PORT0    portb
   #define LCD_1966758_TRIS0    trisb
   #define LCD_1966758_PORT1    portb
   #define LCD_1966758_TRIS1    trisb
   #define LCD_1966758_PORT2    portb
   #define LCD_1966758_TRIS2    trisb
   #define LCD_1966758_PORT3    portb
   #define LCD_1966758_TRIS3    trisb
   #define LCD_1966758_PORT4    portb
   #define LCD_1966758_TRIS4    trisb
   #define LCD_1966758_PORT5    portb
   #define LCD_1966758_TRIS5    trisb
   #define LCD_1966758_BIT0       0
   #define LCD_1966758_BIT1       1
   #define LCD_1966758_BIT2       2
   #define LCD_1966758_BIT3       3
   #define LCD_1966758_RS         4
   #define LCD_1966758_E          5
   #define LCD_1966758_ROWCNT   2
   #define LCD_1966758_COLCNT   16

   #ifdef _BOOSTC
     #define LCD_1966758_DELAY   delay_10us(10)
   #endif
   #ifdef _C2C_
     #define LCD_1966758_DELAY   delay_us(100)
   #endif
   #ifndef LCD_1966758_DELAY
     #define LCD_1966758_DELAY   delay_us(100)
   #endif




//LCDDisplay0: //Macro function declarations

void FCD_LCDDisplay0_RawSend(char in, char mask);
void FCD_LCDDisplay0_Start();
void FCD_LCDDisplay0_Clear();
void FCD_LCDDisplay0_PrintASCII(char Character);
void FCD_LCDDisplay0_Command(char in);
void FCD_LCDDisplay0_Cursor(char x, char y);
void FCD_LCDDisplay0_PrintNumber(short Number);
void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String);
void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions);
void FCD_LCDDisplay0_ClearLine(char Line);
void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7);



//RS2320: //Macro implementations


void FCD_RS2320_SendRS232Char(short nChar)
{
   
   #if (RS232_1376786_UART == 0)

      char dMask;
      char idx;
      char count = 8;

      #ifdef RS232_1376786_HARDWARE
         //wait until CTS is low
         while ((RS232_1376786_CTS_PORT & (1 << RS232_1376786_CTS_PIN) ) != 0);
      #endif

      #if(RS232_1376786_DATASIZE == 1)
         count = 9;
      #endif
      #if(RS232_1376786_DATASIZE == 2)
         count = 7;
      #endif

      clear_bit(RS232_1376786_TX_PORT, RS232_1376786_SW_TX);      // Send Start bit
      FCD_RS2320_RS232_Delay();

      for (idx = 0; idx < count; idx++)
      {
         dMask = nChar & 0x01;                     // Mask off data bit

         if (dMask)
            set_bit(RS232_1376786_TX_PORT, RS232_1376786_SW_TX);
         else
            clear_bit(RS232_1376786_TX_PORT, RS232_1376786_SW_TX);

         FCD_RS2320_RS232_Delay();
         nChar = nChar >> 1;                        // Move to next data bit
      }

      set_bit(RS232_1376786_TX_PORT, RS232_1376786_SW_TX);         // Send Stop bit
      FCD_RS2320_RS232_Delay();

   #endif

   #if (RS232_1376786_UART == 1)

      #ifndef MX_UART
         #pragma error "Chip does not have UART capability"
      #endif

      set_bit(txsta, TXEN);
      while ((pir1 & (1 << TXIF)) == 0);

      #ifdef RS232_1376786_HARDWARE
         //wait until CTS is low
         while ((RS232_1376786_CTS_PORT & (1 << RS232_1376786_CTS_PIN) ) != 0);
      #endif

      #if(RS232_1376786_DATASIZE == 1)
         if (test_bit(nChar, 8))
            set_bit(txsta, TX9D);
         else
            clear_bit(txsta, TX9D);
      #endif

      txreg = nChar;

   #endif

   #if (RS232_1376786_UART == 2)

      #ifndef MX_UART2
         #pragma error "Chip does not have second UART capability"
      #endif

      set_bit(txsta2, TXEN);
      while ((pir3 & (1 << TX2IF)) == 0);

      #ifdef RS232_1376786_HARDWARE
         //wait until CTS is low
         while ((RS232_1376786_CTS_PORT & (1 << RS232_1376786_CTS_PIN) ) != 0);
      #endif

      #if(RS232_1376786_DATASIZE == 1)
         if (test_bit(nChar, 8))
            set_bit(txsta2, TX9D);
         else
            clear_bit(txsta2, TX9D);
      #endif

      txreg2 = nChar;

   #endif

}

void FCD_RS2320_SendRS232String(char* String, char MSZ_String)
{
      char idx;
      for(idx = 0; idx < MSZ_String; idx++)
      {
         if (String[idx] == 0)
            break;

         else FCD_RS2320_SendRS232Char(String[idx]);
      }
}

short FCD_RS2320_ReceiveRS232Char(short nTimeout)
{
   
      char delay1 = 0;
      char delay2 = 0;
      char regcheck = 0;
      char dummy = 0;
      short retVal = 512;
      char bWaitForever = 0;
      char rxStatus = RS232_1376786_STATUS_LOOP;
      char idx;
      char count = 8;

      #if (RS232_1376786_LEGACY_RV == 0)
         retVal = 255;
      #endif

      #if (RS232_1376786_UART == 1)
         #ifndef MX_UART
            #pragma error "Chip does not have UART capability"
         #endif
      #endif

      #if (RS232_1376786_UART == 2)
         #ifndef MX_UART2
            #pragma error "Chip does not have second UART capability"
         #endif
      #endif

      #ifdef RS232_1376786_HARDWARE
         //ready to accept data
         clear_bit(RS232_1376786_RTS_PORT, RS232_1376786_RTS_PIN);
      #endif

      if (nTimeout == 255)
         bWaitForever = 1;

      #if (RS232_1376786_UART == 1)
         set_bit(rcsta, CREN);
      #endif

      #if (RS232_1376786_UART == 2)
         set_bit(rcsta2, CREN);
      #endif

      while (rxStatus == RS232_1376786_STATUS_LOOP)
      {
         #if (RS232_1376786_UART == 0)
            regcheck = test_bit(RS232_1376786_RX_PORT, RS232_1376786_SW_RX);   //Test for start bit
            if (regcheck == 0)
               regcheck = 1;
            else regcheck = 0;
         #endif

         #if (RS232_1376786_UART == 1)
            regcheck = (pir1 & (1 << RCIF));
         #endif

         #if (RS232_1376786_UART == 2)
            regcheck = (pir3 & (1 << RC2IF));
         #endif

         if (regcheck != 0)
         {
            rxStatus = RS232_1376786_STATUS_RXBYTE;
         }
         else
         {
            if (bWaitForever == 0)
            {
               //don't wait forever, so do timeout thing...
               if (nTimeout == 0)
               {
                  rxStatus = RS232_1376786_STATUS_TIMEOUT;
               }
               else
               {
                  if (RS232_1376786_TOUT)
                  {
                     delay_10us(5);
                     delay1 = delay1 + 1;
                     if(delay1 == 20)
                     {
                        nTimeout = nTimeout - 1;
                        delay1 = 0;
                     }
                  }
                  else
                  {
                     //decrement timeout
                     delay1 = delay1 - 1;
                     if (delay1 == 0)
                     {
                        nTimeout = nTimeout - 1;
                     }
                  }
               }
            }
         }
      }

      if (rxStatus == RS232_1376786_STATUS_RXBYTE)
      {
         #if (RS232_1376786_UART == 0)
            regcheck = 0;
         #endif

         #if (RS232_1376786_UART == 1)
            regcheck = (rcsta & (1 << FERR));
         #endif

         #if (RS232_1376786_UART == 2)
            regcheck = (rcsta2 & (1 << FERR));
         #endif

         if (regcheck != 0)
         {
            #if (RS232_1376786_UART == 1)
               dummy = rcreg;      //need to read the rcreg to clear FERR
            #endif

            #if (RS232_1376786_UART == 2)
               dummy = rcreg2;      //need to read the rcreg to clear FERR
            #endif

            #ifdef RS232_1376786_DEBUG
               FCD_RS2320_SendRS232Char('<');
               FCD_RS2320_SendRS232Char('F');
               FCD_RS2320_SendRS232Char('E');
               FCD_RS2320_SendRS232Char('R');
               FCD_RS2320_SendRS232Char('R');
               FCD_RS2320_SendRS232Char('>');
            #endif

            #if (RS232_1376786_LEGACY_RV == 1)
               retVal = 0x400;               //Framing Error Flag
            #endif
         }
         else
         {
            #if (RS232_1376786_UART == 0)
               regcheck = 0;
            #endif

            #if (RS232_1376786_UART == 1)
               regcheck = (rcsta & (1 << OERR));
            #endif

            #if (RS232_1376786_UART == 2)
               regcheck = (rcsta2 & (1 << OERR));
            #endif

            if (regcheck != 0)
            {
               //need to read the rcreg to clear error
               #if (RS232_1376786_UART == 1)
                  clear_bit(rcsta, CREN);
                  set_bit(rcsta, CREN);
               #endif

               #if (RS232_1376786_UART == 2)
                  clear_bit(rcsta2, CREN);
                  set_bit(rcsta2, CREN);
               #endif

               #ifdef RS232_1376786_DEBUG
                  FCD_RS2320_SendRS232Char('<');
                  FCD_RS2320_SendRS232Char('O');
                  FCD_RS2320_SendRS232Char('E');
                  FCD_RS2320_SendRS232Char('R');
                  FCD_RS2320_SendRS232Char('R');
                  FCD_RS2320_SendRS232Char('>');
               #endif

               #if (RS232_1376786_LEGACY_RV == 1)
                  retVal = 0x800;               //Overrun Error Flag
               #endif

            }
            else
            {
               #if (RS232_1376786_UART == 0)

                  #if(RS232_1376786_DATASIZE == 1)
                     count = 9;
                  #endif

                  FCD_RS2320_RS232_Delay();
                  for (idx = 0; idx < count; idx++)
                  {
                     retVal = retVal >> 1;

                     if(count == 9)
                     {
                        if (test_bit(RS232_1376786_RX_PORT, RS232_1376786_SW_RX))
                           retVal = retVal | 0x100;
                     }
                     else
                     {
                        if (test_bit(RS232_1376786_RX_PORT, RS232_1376786_SW_RX))
                           retVal = retVal | 0x80;
                     }
                     FCD_RS2320_RS232_Delay();
                  }
               #endif

               #if (RS232_1376786_UART == 1)
                  retVal = rcreg;          //no error, so rx byte is valid

                  #if(RS232_1376786_DATASIZE == 1)
                     if(test_bit(rcsta, RX9D));
                        retVal = retVal | 0x100;
                  #endif

               #endif

               #if (RS232_1376786_UART == 2)
                  retVal = rcreg2;          //no error, so rx byte is valid

                  #if(RS232_1376786_DATASIZE == 1)
                     if(test_bit(rcsta2, RX9D));
                        retVal = retVal | 0x100;
                  #endif

               #endif

               #ifdef RS232_1376786_ECHO
                  FCD_RS2320_SendRS232Char(retVal);
               #endif
            }
         }
      }
      #ifdef RS232_1376786_HARDWARE
         //not ready to accept data
         set_bit(FC_RS232_RTS_PORT, FC_RS232_RTS_PIN);
      #endif

      return (retVal);
}

void FCD_RS2320_ReceiveRS232String(char* FCR_RETVAL, char FCR_RETVAL_SIZE, char nTimeout, char NumBytes)
{
      char idx;
      short in;

      #if ( RS232_1376786_LEGACY_RV == 0 )
         #define RS232_TO    255
      #else
         #define RS232_TO    256
      #endif

      if (NumBytes > FCR_RETVAL_SIZE)
         NumBytes = FCR_RETVAL_SIZE;

      for (idx = 0; idx < NumBytes; idx++)
      {
         in = FCD_RS2320_ReceiveRS232Char(nTimeout);
         if(in < RS232_TO)
            FCR_RETVAL[idx] = in & 0xFF;
         else
            break;
      }

      if (idx < FCR_RETVAL_SIZE)
         FCR_RETVAL[idx] = 0;

      #undef RS232_TO
}

void FCD_RS2320_RS232_Delay()
{
      unsigned int iterations;
      unsigned int delay = RS232_1376786_SW_BAUD;

      for (iterations = 0; iterations < delay; iterations++);
}



//KeyPad0: //Macro implementations


char FCD_KeyPad0_GetKeypadNumber()
{
      //get matrices for rows and columns
      #if (3 == 1)
         #define KPAD_COL_MTX {1}
         #define KPAD_COL_MASK (1)
      #endif
      #if (3 == 2)
         #define KPAD_COL_MTX {1,2}
         #define KPAD_COL_MASK (1|2)
      #endif
      #if (3 == 3)
         #define KPAD_COL_MTX {1,2,4}
         #define KPAD_COL_MASK (1|2|4)
      #endif
      #if (3 == 4)
         #define KPAD_COL_MTX {1,2,4,16}
         #define KPAD_COL_MASK (1|2|4|16)
      #endif
      #if (4 == 1)
         #define KPAD_ROW_MTX {16}
         #define KPAD_ROW_MASK (16)
      #endif
      #if (4 == 2)
         #define KPAD_ROW_MTX {16,32}
         #define KPAD_ROW_MASK (16|32)
      #endif
      #if (4 == 3)
         #define KPAD_ROW_MTX {16,32,64}
         #define KPAD_ROW_MASK (16|32|64)
      #endif
      #if (4 == 4)
         #define KPAD_ROW_MTX {16,32,64,128}
         #define KPAD_ROW_MASK (16|32|64|128)
      #endif

      #ifndef KPAD_COL_MTX
         #pragma error Keypad error: column count is not 1-4
      #endif
      #ifndef KPAD_ROW_MTX
         #pragma error Keypad error: row count is not 1-4
      #endif

      //store keys and pin connections into a constant array
      rom char* mtxKeysAsNumbers = {1,4,7,10,2,5,8,0,3,6,9,11};
      rom char* mtxCols = KPAD_COL_MTX;
      rom char* mtxRows = KPAD_ROW_MTX;

      //set up i/o of port (rows = inputs, columns = outputs)
      trisd = (trisd | KPAD_ROW_MASK);
      trisd = (trisd & ~KPAD_COL_MASK);      //BR

      char iCol;
      char iRow;
      char c_ip;
      for (iCol=0; iCol<3; iCol++)
      {
         //output the appropriate column high
         portd = mtxCols[iCol];

         //delay
         nop();nop();nop();nop();
         nop();nop();nop();nop();
         nop();nop();nop();nop();

         //read the port
         c_ip = portd;

         //check for a hit
         for (iRow=0; iRow<4; iRow++)
         {
            if ((c_ip & mtxRows[iRow]) != 0)
            {
               //found it!
               goto found_key;
            }
         }
      }

      //if it gets here, it has not been found...
      return (255);

     found_key:
      return (mtxKeysAsNumbers[(iCol*4) + iRow]);

     #undef KPAD_COL_MTX
     #undef KPAD_ROW_MTX
     #undef KPAD_COL_MASK
     #undef KPAD_ROW_MASK

}

char FCD_KeyPad0_GetKeypadAscii()
{
      //get matrices for rows and columns
      #if (3 == 1)
         #define KPAD_COL_MTX {1}
         #define KPAD_COL_MASK (1)
      #endif
      #if (3 == 2)
         #define KPAD_COL_MTX {1,2}
         #define KPAD_COL_MASK (1|2)
      #endif
      #if (3 == 3)
         #define KPAD_COL_MTX {1,2,4}
         #define KPAD_COL_MASK (1|2|4)
      #endif
      #if (3 == 4)
         #define KPAD_COL_MTX {1,2,4,16}
         #define KPAD_COL_MASK (1|2|4|16)
      #endif
      #if (4 == 1)
         #define KPAD_ROW_MTX {16}
         #define KPAD_ROW_MASK (16)
      #endif
      #if (4 == 2)
         #define KPAD_ROW_MTX {16,32}
         #define KPAD_ROW_MASK (16|32)
      #endif
      #if (4 == 3)
         #define KPAD_ROW_MTX {16,32,64}
         #define KPAD_ROW_MASK (16|32|64)
      #endif
      #if (4 == 4)
         #define KPAD_ROW_MTX {16,32,64,128}
         #define KPAD_ROW_MASK (16|32|64|128)
      #endif

      #ifndef KPAD_COL_MTX
         #pragma error Keypad error: column count is not 1-4
      #endif
      #ifndef KPAD_ROW_MTX
         #pragma error Keypad error: row count is not 1-4
      #endif

      //store keys and pin connections into a constant array
      rom char* mtxKeysAsChars = {'1','4','7','*','2','5','8','0','3','6','9','#'};
      rom char* mtxCols = KPAD_COL_MTX;
      rom char* mtxRows = KPAD_ROW_MTX;

      //set up i/o of port (rows = inputs, columns = outputs)
      trisd = (trisd | KPAD_ROW_MASK);
      trisd = (trisd & ~KPAD_COL_MASK);

      char iCol;
      char iRow;
      char c_ip;
      for (iCol=0; iCol<3; iCol++)
      {
         //output the appropriate column high
         portd = mtxCols[iCol];

         //delay
         nop();nop();nop();nop();
         nop();nop();nop();nop();
         nop();nop();nop();nop();

         //read the port
         c_ip = portd;

         //check for a hit
         for (iRow=0; iRow<4; iRow++)
         {
            if ((c_ip & mtxRows[iRow]) != 0)
            {
               //found it!
               goto found_key;
            }
         }
      }

      //if it gets here, it has not been found...
      return (255);

     found_key:
      return (mtxKeysAsChars[(iCol*4) + iRow]);

     #undef KPAD_COL_MTX
     #undef KPAD_ROW_MTX
     #undef KPAD_COL_MASK
     #undef KPAD_ROW_MASK

}



//LCDDisplay0: //Macro implementations


void FCD_LCDDisplay0_RawSend(char in, char mask)
{
      unsigned char pt;

      clear_bit(LCD_1966758_PORT0, LCD_1966758_BIT0);
      clear_bit(LCD_1966758_PORT1, LCD_1966758_BIT1);
      clear_bit(LCD_1966758_PORT2, LCD_1966758_BIT2);
      clear_bit(LCD_1966758_PORT3, LCD_1966758_BIT3);
      clear_bit(LCD_1966758_PORT4, LCD_1966758_RS);
      clear_bit(LCD_1966758_PORT5, LCD_1966758_E);
      pt = ((in >> 4) & 0x0f);
      if (pt & 0x01)
          set_bit(LCD_1966758_PORT0, LCD_1966758_BIT0);
      if (pt & 0x02)
          set_bit(LCD_1966758_PORT1, LCD_1966758_BIT1);
      if (pt & 0x04)
          set_bit(LCD_1966758_PORT2, LCD_1966758_BIT2);
      if (pt & 0x08)
          set_bit(LCD_1966758_PORT3, LCD_1966758_BIT3);
      if (mask)
          set_bit(LCD_1966758_PORT4, LCD_1966758_RS);
      LCD_1966758_DELAY;
      set_bit (LCD_1966758_PORT5, LCD_1966758_E);
      LCD_1966758_DELAY;
      clear_bit (LCD_1966758_PORT5, LCD_1966758_E);
      pt = (in & 0x0f);
      LCD_1966758_DELAY;
      clear_bit(LCD_1966758_PORT0, LCD_1966758_BIT0);
      clear_bit(LCD_1966758_PORT1, LCD_1966758_BIT1);
      clear_bit(LCD_1966758_PORT2, LCD_1966758_BIT2);
      clear_bit(LCD_1966758_PORT3, LCD_1966758_BIT3);
      clear_bit(LCD_1966758_PORT4, LCD_1966758_RS);
      clear_bit(LCD_1966758_PORT5, LCD_1966758_E);
      if (pt & 0x01)
          set_bit(LCD_1966758_PORT0, LCD_1966758_BIT0);
      if (pt & 0x02)
          set_bit(LCD_1966758_PORT1, LCD_1966758_BIT1);
      if (pt & 0x04)
          set_bit(LCD_1966758_PORT2, LCD_1966758_BIT2);
      if (pt & 0x08)
          set_bit(LCD_1966758_PORT3, LCD_1966758_BIT3);
      if (mask)
          set_bit(LCD_1966758_PORT4, LCD_1966758_RS);
      LCD_1966758_DELAY;
      set_bit (LCD_1966758_PORT5, LCD_1966758_E);
      LCD_1966758_DELAY;
      clear_bit (LCD_1966758_PORT5, LCD_1966758_E);
      LCD_1966758_DELAY;
}

void FCD_LCDDisplay0_Start()
{
   
      clear_bit(LCD_1966758_TRIS0, LCD_1966758_BIT0);
      clear_bit(LCD_1966758_TRIS1, LCD_1966758_BIT1);
      clear_bit(LCD_1966758_TRIS2, LCD_1966758_BIT2);
      clear_bit(LCD_1966758_TRIS3, LCD_1966758_BIT3);
      clear_bit(LCD_1966758_TRIS4, LCD_1966758_RS);
      clear_bit(LCD_1966758_TRIS5, LCD_1966758_E);

      Wdt_Delay_Ms(12);

      FCD_LCDDisplay0_RawSend(0x33, 0);
      Wdt_Delay_Ms(2);
      FCD_LCDDisplay0_RawSend(0x33, 0);
      Wdt_Delay_Ms(2);
      FCD_LCDDisplay0_RawSend(0x32, 0);
      Wdt_Delay_Ms(2);
      FCD_LCDDisplay0_RawSend(0x2c, 0);
      Wdt_Delay_Ms(2);
      FCD_LCDDisplay0_RawSend(0x06, 0);
      Wdt_Delay_Ms(2);
      FCD_LCDDisplay0_RawSend(0x0c, 0);
      Wdt_Delay_Ms(2);

      //clear the display
      FCD_LCDDisplay0_RawSend(0x01, 0);
      Wdt_Delay_Ms(2);
      FCD_LCDDisplay0_RawSend(0x02, 0);
      Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_Clear()
{
   
      FCD_LCDDisplay0_RawSend(0x01, 0);
      Wdt_Delay_Ms(2);
      FCD_LCDDisplay0_RawSend(0x02, 0);
      Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_PrintASCII(char Character)
{
   
      FCD_LCDDisplay0_RawSend(Character, 0x10);

}

void FCD_LCDDisplay0_Command(char in)
{
   
      FCD_LCDDisplay0_RawSend(in, 0);
      Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_Cursor(char x, char y)
{
   
     #if (LCD_1966758_ROWCNT == 1)
       y=0x80;
     #endif

     #if (LCD_1966758_ROWCNT == 2)
      if (y==0)
         y=0x80;
      else
         y=0xc0;
     #endif

     #if (LCD_1966758_ROWCNT == 4)
      if (y==0)
         y=0x80;
      else if (y==1)
         y=0xc0;

      #if (LCD_1966758_COLCNT == 16)
         else if (y==2)
            y=0x90;
         else
            y=0xd0;
      #endif

      #if (LCD_1966758_COLCNT == 20)
         else if (y==2)
            y=0x94;
         else
            y=0xd4;
      #endif
     #endif

      FCD_LCDDisplay0_RawSend(y+x, 0);
      Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_PrintNumber(short Number)
{
   
      short tmp_int;
      char tmp_byte;
      if (Number < 0)
      {
         FCD_LCDDisplay0_RawSend('-', 0x10);
         Number = 0 - Number;
      }

      tmp_int = Number;
      if (Number >= 10000)
      {
         tmp_byte = tmp_int / 10000;
         FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

         while (tmp_byte > 0)
         {
            tmp_int = tmp_int - 10000;
            tmp_byte--;
         }
      }
      if (Number >= 1000)
      {
         tmp_byte = tmp_int / 1000;
         FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

         while (tmp_byte > 0)
         {
            tmp_int = tmp_int - 1000;
            tmp_byte--;
         }
      }
      if (Number >= 100)
      {
         tmp_byte = tmp_int / 100;
         FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

         while (tmp_byte > 0)
         {
            tmp_int = tmp_int - 100;
            tmp_byte--;
         }
      }
      if (Number >= 10)
      {
         tmp_byte = tmp_int / 10;
         FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

         while (tmp_byte > 0)
         {
            tmp_int = tmp_int - 10;
            tmp_byte--;
         }
      }
      FCD_LCDDisplay0_RawSend('0' + tmp_int, 0x10);

}

void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String)
{
   
      char idx;
      for (idx=0; idx<MSZ_String; idx++)
      {
         if (String[idx]==0)
         {
            break;
         }
         FCD_LCDDisplay0_RawSend(String[idx], 0x10);
      }

}

void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions)
{
   
      char cmd = 0;
      char count;

      //Choose the direction
      switch (Direction)
      {
         case 0:
         case 'l':
         case 'L':

            cmd = 0x18;
            break;

         case 1:
         case 'r':
         case 'R':

            cmd = 0x1C;
            break;

         default:
            break;
      }

      //If direction accepted then scroll the specified amount
      if (cmd)
      {
         for (count = 0; count < Num_Positions; count++)
            FCD_LCDDisplay0_Command(cmd);
      }

}

void FCD_LCDDisplay0_ClearLine(char Line)
{
   
      char count;
      char rowcount;

      //Define number of columns per line
      #if (LCD_1966758_ROWCNT == 1)
         rowcount=80;
      #endif

      #if (LCD_1966758_ROWCNT == 2)
         rowcount=40;
      #endif

      #if (LCD_1966758_ROWCNT == 4)
         #if (LCD_1966758_COLCNT == 16)
            rowcount=16;
         #endif
         #if (LCD_1966758_COLCNT == 20)
            rowcount=20;
         #endif
      #endif

      //Start at beginning of the line
      FCD_LCDDisplay0_Cursor (0, Line);

      //Send out spaces to clear line
      for (count = 0; count < rowcount; count++)
         FCD_LCDDisplay0_RawSend(' ', 0x10);

      //Move back to the beginning of the line.
      FCD_LCDDisplay0_Cursor (0, Line);

}

void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7)
{
      //set CGRAM address
      FCD_LCDDisplay0_RawSend(64 + (nIdx << 3), 0);
      delay_ms(2);

      //write CGRAM data
      FCD_LCDDisplay0_RawSend(d0, 0x10);
      FCD_LCDDisplay0_RawSend(d1, 0x10);
      FCD_LCDDisplay0_RawSend(d2, 0x10);
      FCD_LCDDisplay0_RawSend(d3, 0x10);
      FCD_LCDDisplay0_RawSend(d4, 0x10);
      FCD_LCDDisplay0_RawSend(d5, 0x10);
      FCD_LCDDisplay0_RawSend(d6, 0x10);
      FCD_LCDDisplay0_RawSend(d7, 0x10);

      //Clear the display
      FCD_LCDDisplay0_RawSend(0x01, 0);
      delay_ms(2);
      FCD_LCDDisplay0_RawSend(0x02, 0);
      delay_ms(2);
}

//Macro implementations

void main()
{
   
   //Initialisation
   adcon1 = 0x07;

   
   #if (RS232_1376786_UART == 0)
      set_bit(RS232_1376786_RX_TRIS, RS232_1376786_SW_RX);      // Receive pin is a input
      clear_bit(RS232_1376786_TX_TRIS, RS232_1376786_SW_TX);   // Transmit pin is a output
      set_bit(RS232_1376786_TX_PORT, RS232_1376786_SW_TX);      // Transmit pin is default high
   #endif

   #if (RS232_1376786_UART == 1)
      txsta = RS232_1376786_TXSTA_VAL;                  // 8-bit, async, low speed, off
      spbrg = RS232_1376786_SPBRG_VAL;                  // set the baud rate
      rcsta = 0;                                // 8-bit, disabled

      if(RS232_1376786_DATASIZE == 1)
      {
         set_bit(txsta, TX9);                     // 9-bit TX
         set_bit(rcsta, RX9);                       // 9-bit RX
      }

      set_bit(rcsta, SPEN);                        // turn on serial interface
   #endif

   #if (RS232_1376786_UART == 2)

      txsta2 = RS232_1376786_TXSTA_VAL;                  // 8-bit, async, low speed, off
      spbrg2 = RS232_1376786_SPBRG_VAL;                  // set the baud rate
      rcsta2 = 0;                                   // 8-bit, disabled

      if(RS232_1376786_DATASIZE == 1)
      {
         set_bit(txsta2, TX9);                  // 9-bit TX
         set_bit(rcsta2, RX9);                       // 9-bit RX
      }

      set_bit(rcsta2, SPEN);                        // turn on serial interface
   #endif

   #ifdef RS232_1376786_HARDWARE
      set_bit(FC_RS232_CTS_TRIS, FC_RS232_CTS_PIN);   //CTS is an input
      clear_bit(FC_RS232_RTS_TRIS, FC_RS232_RTS_PIN);   //RTS is an output
      set_bit(FC_RS232_RTS_PORT, FC_RS232_RTS_PIN);    //not ready to accept data
   #endif


   //Interrupt initialisation code
   


   //Loop
   //Loop: While 1
   while (1)
   {
      //Call Component Macro
      //Call Component Macro: LCDDisplay(0)::Start
      FCD_LCDDisplay0_Start();


      //Loop
      //Loop: While 1
      while (1)
      {
         //Call Component Macro
         //Call Component Macro: keypad=KeyPad(0)::GetKeypadAscii
         FCV_KEYPAD = FCD_KeyPad0_GetKeypadAscii();


         //Call Component Macro
         //Call Component Macro: in=RS232(0)::ReceiveRS232Char(5)
         FCV_IN = FCD_RS2320_ReceiveRS232Char(5);


         //Decision
         //Decision: keypad < 255?
         if (FCV_KEYPAD < 255)
         {
            //Call Component Macro
            //Call Component Macro: RS232(0)::SendRS232Char(keypad)
            FCD_RS2320_SendRS232Char(FCV_KEYPAD);


            //Loop
            //Loop: While keypad < 255
            while (FCV_KEYPAD < 255)
            {
               //Call Component Macro
               //Call Component Macro: keypad=KeyPad(0)::GetKeypadAscii
               FCV_KEYPAD = FCD_KeyPad0_GetKeypadAscii();


            }


         }


         //Decision
         //Decision: in < 255?
         if (FCV_IN < 255)
         {
            //Call Component Macro
            //Call Component Macro: LCDDisplay(0)::PrintASCII(in)
            FCD_LCDDisplay0_PrintASCII(FCV_IN);


            //Calculation
            //Calculation:
           

            //Call Component Macro
            //Call Component Macro: RS232(0)::SendRS232Char(in)
            FCD_RS2320_SendRS232Char(FCV_IN);


         }


      }


   }


   mainendloop: goto mainendloop;
}

void interrupt(void)
{
}


Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
Re: PIC18F458.
« Respuesta #1 en: 13 de Marzo de 2013, 19:16:58 »
¿Y si explicas que quieres hacer con tu código? Es mas fácil que tener que intuirlo leyéndolo  :tongue:

Asi podrán ayudarte mejor con tu problema  ;-)

Un saludo.
Alberto Aragón Marqueses
albertomarqueses.wordpress.com


 

anything