Sunteți pe pagina 1din 6

#include <p18f8722.

h>
#include <delays.h>
#include <spi.h>
#pragma config OSC=HS
#pragma config WDT=OFF
#define LEDPin LATDbits.LATD1 //Define LEDPin as PORT D Pin 1
#define LEDTris TRISDbits.TRISD1 //Define LEDTris as TRISD Pin 1
void
void
void
void
void
void
void
void
void
void
void

InitSPI(void);
InitPORTA_SPI(char);
InitPORTB_SPI(char);
WritePortA(char);
WritePortB(char);
d_write(char);
i_write(char);
LCDLine_1(void);
LCDLine_2(void);
LCDInit(void);
LCDErase(void);

//*****************************************************************
// Write to MCP923S17 Port A
//*****************************************************************
void WritePortA(char b)
{
LATAbits.LATA2 = 0;
SSPBUF = 0x40;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
SSPBUF = 0x12;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
SSPBUF = b;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
LATAbits.LATA2 = 1;
}
//*****************************************************************
// Write to MCP923S17 Port B
//*****************************************************************
void WritePortB(char b)
{
LATAbits.LATA2 = 0;
SSPBUF = 0x40;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
SSPBUF = 0x13;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
SSPBUF = b;
while(!PIR1bits.SSPIF);

PIR1bits.SSPIF = 0;
LATAbits.LATA2 = 1;
}
//*****************************************************************
// Send data to the display
//*****************************************************************
void d_write(char b)
{
WritePortA(0x80);
WritePortB(b);
WritePortA(0xC0);
WritePortA(0x00);
}
//*****************************************************************
// Send a command to the display
//*****************************************************************
void i_write(char b)
{
WritePortA(0x00);
Delay10TCYx(0);
WritePortB(b);
Delay10TCYx(0);
WritePortA(0x40);
Delay10TCYx(0);
WritePortA(0x00);
}
//*****************************************************************
// Write to line 1 of the display
//*****************************************************************
void LCDLine_1(void)
{
i_write(0x80);
}
//*****************************************************************
// Write to line 1 of the display
//*****************************************************************
void LCDLine_2(void)
{
i_write(0xC0);
}
//******************************************************************
// Function to write to the PORT
//******************************************************************
void InitWrite(char b)
{
WritePortA(0);
WritePortB(b);
Nop();
Nop();
Nop();
WritePortA(0x40);
Nop();
Nop();
Nop();
Nop();
Nop();

Nop();
Nop();
Nop();
Nop();
WritePortA(0);
}
//*****************************************************************
// Initialize MCP923S17 Port A
//*****************************************************************
void InitPortA_SPI(char b)
{
LATAbits.LATA2 = 0;
SSPBUF = 0x40;
/*
SSP1IF: MSSP1 Interrupt Flag bit
1 = The transmission/reception is complete (must be cleared in software)
0 = Waiting to transmit/receive
*/
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
SSPBUF = 0x00;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
SSPBUF = b;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
LATAbits.LATA2 = 1;
}
//*****************************************************************
// Initialize MCP923S17 Port B
//*****************************************************************
void InitPortB_SPI(char b)
{
LATAbits.LATA2 = 0;
SSPBUF = 0x40;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
SSPBUF = 0x01;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
SSPBUF = b;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF = 0;
LATAbits.LATA2 = 1;
}
//*****************************************************************
// Initialize MCP923S17 SPI
//*****************************************************************
void InitSPI(void)
{
// RC3 is connected to SCK: Serial clock input

TRISCbits.TRISC3 = 0;
// RC5 is connected to SI: Serial data I/O (MCP23017), Serial data input
(MCP23S17)
TRISCbits.TRISC5 = 0;
// SSPxCON1: MSSPx CONTROL REGISTER 1 (I2C MODE)
// SSPEN=1, 1 = Enables the serial port and configures the SDAx and SCLx
pins as the serial port pins
// SSPM<3:0>=0010, 0010 = SPI Master mode, clock = FOSC/64
// CKP=0, 0 = Holds clock low (clock stretch), used to ensure data setup
time
SSP1CON1 = 0x22; // 00100010
// CKE: SPI Clock Select bit
//
1 = Transmit occurs on transition from active to Idle clock st
ate
//
0 = Transmit occurs on transition from Idle to active clock st
ate
SSP1STATbits.CKE = 1;
//
SSP1IF: MSSP1 Interrupt Flag bit
//1 = The transmission/reception is complete (must be cleared in softwar
e)
//0 = Waiting to transmit/receive
PIR1bits.SSPIF = 0;
}
//******************************************************************
// LCD Initialization function
//******************************************************************
void LCDInit(void)
{
// RA2 connects CS: Chip Select (MCP23S17)
TRISAbits.TRISA2 = 0;
LATAbits.LATA2 = 1;
// SPI Sequential Write/Read
Delay10TCYx(0);
Delay10TCYx(0);
Delay10TCYx(0);
// RF6 is connected to RESET of expander: Hardware reset. Must be extern
ally biased.
TRISFbits.TRISF6 = 0;
LATFbits.LATF6 = 0;
Delay10TCYx(0);
LATFbits.LATF6 = 1; // RESET expander
InitSPI(); // see above
InitPortA_SPI(0);
InitPortB_SPI(0);
WritePortA(0);
Delay10TCYx(0);
InitWrite( 0b00111100 );

//0011NFxx

Delay10TCYx(0);
InitWrite( 0b00001100 );

//Display Off

Delay10TCYx(0);
InitWrite( 0b00000001 );

//Display Clear

Delay10TCYx(0);
InitWrite( 0b00000110 );

//Entry mode

}
void LCDErase(void)
{
// Clear display
InitWrite(0b00000001);
Delay10KTCYx(50);
}
void main()
{
unsigned char sentence[];
unsigned int i=0;
int delayy;
RCONbits.IPEN=0;

// disable priority system.

OSCCONbits.IRCF0 = 0;
OSCCONbits.IRCF1 = 0;
OSCCONbits.IRCF2 = 1;
// Initialize the LCD display.
LCDInit();
//LEDTris = 0;//Set LED Pin data direction to OUTPUT
//LEDPin = 1;//Set LED Pin
TRISD=0b00000000;
ADCON1 = 0b00001110;//VSS,VDD ref. AN0 analog only
ADCON0 = 0x00;//clear ADCON0 to select channel 0 (AN0)
ADCON2 = 0b00001010;//ADCON2 setup: Left justified, Tacq=2Tad, T
ad=32*Tosc (or Fosc/2)
ADCON0bits.ADON = 0x01;//Enable A/D module
while(1)
{
ADCON0bits.GO_DONE = 1;//Start A/D Conversion
while(ADCON0bits.GO_DONE != 0);//Loop here until A/D con
version completes
//delayy = ADRESH;//Set the delay to the 8 MSB
delayy = (((unsigned int)ADRESH)<<8)|(ADRESL);
//sentence[]= delayy;
delayy= delayy/51;
//delayy= ((char)delayy);
LATD= delayy;
//LEDPin = ~LEDPin;//Toggle LED Pin
// Switch ti LCD line 1 ( sends a command to the LCD to tell it
).
LCDLine_1(); // select line 1
//for(i=0;i<=15;i++)
//{
//d_write((unsigned char)ADRESH);
// Delay10KTCYx(50);
//}

Delay10KTCYx(1000);
LCDErase();
if (delayy > 0)
Delay1KTCYx(delayy);//Delay (argument of 250 wil
l delay 1 second at 1MHz since each instruction takes 4 cycles)
LATD=0x00;
Delay10KTCYx(1000);
}
}

S-ar putea să vă placă și