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,
)
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,
)
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)
{
}