Dspic33fj16gs504 use spi to drive 12232 lcd

Status
Not open for further replies.

cnjxlxp

Newbie level 3
Joined
Jun 4, 2010
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,320
MY LCD DRIVE IC IS ST7920:
AND HERE ST7920'S DATASHEET
**broken link removed**
MY CODE AS BELOW: DISPLAY NOTHING ON LCD
#include <p33fj16gs504.h>
#include<spi.h>
_FWDT(FWDTEN_OFF)//7.37MHZ


//lcd2232F Serial interface(ST7920)
#define uint unsigned int
#define uchar unsigned char

void delay_100us(uint x) //
{
uint j;
uchar i;
for(j=0;j<x;j++)
{
for(i=0;i<71;i++); //71
}
}


void send_command(uchar command_data)
{ unsigned char tmp;
uchar command_data_h,command_data_l;
// delay_1ms(100);
SPI1BUF=0xf8;
while(_SPITBF);
tmp = SPI1BUF;
command_data_h=command_data&0xf0;
SPI1BUF=command_data_h;
while(_SPITBF);
tmp = SPI1BUF;
command_data_l=command_data&0x0f;
command_data_l=command_data_l<<4;
SPI1BUF=command_data_l;
while(_SPITBF);
tmp = SPI1BUF;
}

void send_data(uchar command_data)
{ unsigned char tmp;
uchar command_data_h,command_data_l;
// delay_1ms(100);
SPI1BUF=0xfa;
while(_SPITBF);
tmp = SPI1BUF;
command_data_h=command_data&0xf0;
SPI1BUF=command_data_h;
while(_SPITBF);
tmp = SPI1BUF;
command_data_l=command_data<<4;
command_data_l=command_data_l&0xF0;
SPI1BUF=command_data_l;
while(_SPITBF);
tmp = SPI1BUF;
}

void lcd_init()
{
uchar command_data;
delay_100us(1000);
command_data=0x30;
send_command(command_data); //FUNCTION SET>100us 8-bit MPU interface , basic instruction set
delay_100us(2);//200us
command_data=0x30;
send_command(command_data);//FUNCTION SET >37us 8-bit MPU interface , basic instruction set
delay_100us(1);//100us
command_data=0x30;
send_command(command_data);
delay_100us(1);
command_data=0x30;
send_command(command_data);
delay_100us(1);
command_data=0x08;
send_command(command_data); //dispaly on/off control>100us Display, cursor and blink are ALL OFF
delay_100us(2);//200us
command_data=0x01;
send_command(command_data); //display clear>10ms
delay_100us(101);//10.1ms
command_data=0x06;
send_command(command_data); //entry mode set /*Cursor move to right ,DDRAM address counter (AC) plus 1 */
delay_100us(1);//100us
command_data=0x0E;
send_command(command_data); //dispaly on
delay_100us(1);//100us
command_data=0x80;
send_command(command_data);
delay_100us(1);//100us
send_data(0x41);//display 'A'
delay_100us(1000);
}

void SPI_INIT(void)
{
__builtin_write_OSCCONL(OSCCON&0xBF); // to clear IOLOCK

RPOR6=0X0807;//00 001000 00 000111 //IO FUNC DEFINE RP12=SDO,RP13=SCK

__builtin_write_OSCCONL(OSCCON|0x40); //to set IOLOCK

_SPI1IF=0;
_SPI1IE=1;
_SPI1IP=5;
SPI1CON1=0X0120;//0000 0001 0010 0000
SPI1CON2=0X0000;
SPI1STAT=0X0000; //0000 0000 0000 0000
_SPIEN=1;
}

main()
{
SPI_INIT();
lcd_init();
while(1);

}

void __attribute__((__interrupt__)) _SPI1Interrupt(void)

{
IFS0bits.SPI1IF=0;
}

THANKS!
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…