ibrahim edhem
/
landscope
metal detector software
lcd.c
- Committer:
- xmen
- Date:
- 2011-03-19
- Revision:
- 0:88f4eeea871a
File content as of revision 0:88f4eeea871a:
#include "cbn1768.h" #include "lcd.h" /*----------------------------------------------------------*\ | Exported | \*----------------------------------------------------------*/ volatile unsigned char Font=0; #define LCD_RESET_PIN (1<<10) #define LCD_CS_PIN (1<<6) /* SSPSR - bit definitions. */ #define TFE 0x01 #define TNF 0x02 #define RNE 0x04 #define RFF 0x08 #define BSY 0x10 /*----------------------------------------------------------*\ | Delay | \*----------------------------------------------------------*/ void Delay(unsigned int dly) { unsigned int i; for (; dly>0; dly--) for (i=0; i<5000; i++); } /*----------------------------------------------------------*\ | ILI9325 SSP Initialize | \*----------------------------------------------------------*/ void SSP_Init(void) { PCONP |= 1<<10; // PINSEL0 |= (1<<13); //ssel1-p0.6 PINSEL0 |= (1<<15); //sck1-p0.7 PINSEL0 |= (1<<17); //mosi1-p0.8 PINSEL0 |= (1<<19); //sck1-p0.9 SSP1CR0 = (0x01 << 8) | // SCR ����SPIʱ�ӷ�Ƶ (0x01 << 7) | // CPHA ʱ�������λ,��SPIģʽ��Ч (0x01 << 6) | // CPOL ʱ�������,��SPIģʽ��Ч (0x00 << 4) | // FRF ֡��ʽ 00=SPI,01=SSI,10=Microwire,11=���� (0x07 << 0); // DSS ��ݳ���,0000-0010=����,0011=4λ,0111=8λ,1111=16λ SSP1CR1 = (0x00 << 3) | // SOD �ӻ�������,1=��ֹ,0=���� (0x00 << 2) | // MS ���ѡ��,0=���,1=�ӻ� (0x01 << 1) | // SSE SSPʹ��,1=����SSP�������豸ͨ�� (0x00 << 0); // LBM ��дģʽ //SSPCPSR = 0x02; // PCLK��Ƶֵ SSP1CPSR = 0x04; // PCLK��Ƶֵ SSP1IMSC = 0x07; // �ж���μĴ��� SSP1ICR = 0x03; // �ж����Ĵ��� } /*----------------------------------------------------------*\ | ILI9325 Write Byte | \*----------------------------------------------------------*/ unsigned char LCD_Access(unsigned char byte) { // �ȴ�SPIF��λ�����ȴ���ݷ������ /* Wait if TNF cleared, Tx FIFO is full. */ while ((SSP1SR & TNF) == 0); SSP1DR = byte; /* Wait if RNE cleared, Rx FIFO is empty. */ while ((SSP1SR & RNE) == 0); return SSP1DR; } /*-----------------------------------------------------------------------------*\ | LCD_WriteReg : Writes to the selected LCD register. | | Input : - LCD_Reg: address of the selected register. | | - LCD_RegValue: value to write to the selected register. | | Output : None | | Return : None | \*-----------------------------------------------------------------------------*/ void LCD_WriteReg(unsigned short LCD_Reg, unsigned short LCD_RegValue) { FIO0CLR = LCD_CS_PIN; // write register index LCD_Access( 0x70 ); // RS=0:register; RW=0:write. -- write Index LCD_Access( 0x00 ); LCD_Access( LCD_Reg & 0xFF ); FIO0SET = LCD_CS_PIN; // write register data //Delay(1); FIO0CLR = LCD_CS_PIN; LCD_Access( 0x72 ); // RS=1:data; RW=0:write. -- write Index LCD_Access( LCD_RegValue>>8 ); LCD_Access( LCD_RegValue & 0xFF ); FIO0SET = LCD_CS_PIN; } void LCD_Reg(unsigned short LCD_Reg) { FIO0CLR = LCD_CS_PIN; // write register index LCD_Access( 0x70 ); // RS=0:register; RW=0:write. -- write Index LCD_Access( 0x00 ); LCD_Access( LCD_Reg & 0xFF ); FIO0SET = LCD_CS_PIN; } /*-----------------------------------------------------------------------------*\ | LCD_ReadReg : Reads the selected LCD Register. | | Input : None | | Output : None | | Return : LCD Register Value. | \*-----------------------------------------------------------------------------*/ unsigned short LCD_ReadReg(unsigned char LCD_Reg) { unsigned short Val; FIO0CLR = LCD_CS_PIN; // write register index LCD_Access( 0x70 ); // RS=0:register; RW=0:write. -- write Index LCD_Access( 0x00 ); LCD_Access( LCD_Reg & 0xFF ); FIO0SET = LCD_CS_PIN; // read register data //Delay(1); FIO0CLR = LCD_CS_PIN; LCD_Access( 0x73 ); // RS=1:data; RW=1:read. -- read Index LCD_Access( 0x00 ); // dummy read one byte Val = LCD_Access( 0 ) << 8; Val |= LCD_Access( 0 ); FIO0SET = LCD_CS_PIN; return Val; } /*-----------------------------------------------------------------------------*\ | LCD_WriteRAM : Writes to the LCD RAM. | | Input : - RGB_Code: the pixel color in RGB mode (5-6-5). | | Output : None | | Return : None | \*-----------------------------------------------------------------------------*/ void LCD_WriteRAM(unsigned short RGB_Code) { FIO0CLR = LCD_CS_PIN; LCD_Access( 0x72 ); // RS=1:data; RW=0:write. -- write data LCD_Access( RGB_Code>>8 ); LCD_Access( RGB_Code & 0xFF ); FIO0SET = LCD_CS_PIN; } /*----------------------------------------------------------*\ | ILI9325 Initialize | \*----------------------------------------------------------*/ void LCD_Init(void) { unsigned short ID; PINSEL1 &= ~0x000000FC; // ����SPI�ܽ���� PINSEL1 |= 0x000000A8; // ����SPI�ܽ���� FIO0DIR |= LCD_CS_PIN | LCD_RESET_PIN; // CS/DC/RST FIO0CLR = (1<<18); FIO0SET = LCD_CS_PIN; FIO0CLR = LCD_RESET_PIN; SSP_Init(); Delay(50); /* delay 50 ms */ FIO0SET=LCD_RESET_PIN; Delay(50); /* delay 50 ms */ ID = LCD_ReadReg( 0x0000 ); // Read driver IC ID if ( (ID != 0x9325) && (ID != 0x9328) ) return; // the ID must be 0x9325 or 0x9328 Delay(50); /* delay 50 ms */ //************* Start Initial Sequence **********// LCD_WriteReg(0x00E7, 0x0010); // Set internal timing LCD_WriteReg(0x0000, 0x0001); // Start Oscillation //LCD_WriteReg(0x0001, 0x0100); // set SS and SM bit LCD_WriteReg(0x0001, 0x0000); // set SS and SM bit LCD_WriteReg(0x0002, 0x0700); // set 1 line inversion LCD_WriteReg(0x0003, (1<<12)|(1<<5)|(1<<4)|(1<<3) ); // 65K LCD_WriteReg(0x0004, 0x0000); // Resize register LCD_WriteReg(0x0008, 0x0207); // set the back porch and front porch LCD_WriteReg(0x0009, 0x0000); // set non-display area refresh cycle ISC[3:0] LCD_WriteReg(0x000A, 0x0000); // FMARK function LCD_WriteReg(0x000C, 0x0001); // RGB interface setting: 16 bit LCD_WriteReg(0x000D, 0x0000); // Frame marker Position LCD_WriteReg(0x000F, 0x0000); // RGB interface polarity //*************Power On sequence ****************// LCD_WriteReg(0x0010, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB LCD_WriteReg(0x0011, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] LCD_WriteReg(0x0012, 0x0000); // VREG1OUT voltage Delay(50); // Delay 50ms LCD_WriteReg(0x0013, 0x0000); // VDV[4:0] for VCOM amplitude Delay(200); // Delay 50ms LCD_WriteReg(0x0010, 0x1590); // SAP, BT[3:0], AP, DSTB, SLP, STB LCD_WriteReg(0x0011, 0x0227); // R11h=0x0221 at VCI=3.3V, DC1[2:0], DC0[2:0], VC[2:0] Delay(50); // Delay 50ms LCD_WriteReg(0x0012, 0x009C); // External reference voltage= Vci; Delay(50); // Delay 50ms LCD_WriteReg(0x0013, 0x1900); // VDV[4:0] for VCOM amplitude LCD_WriteReg(0x0029, 0x0023); // VCM[5:0] for VCOMH LCD_WriteReg(0x002B, 0x000E); // Frame Rate = 40Hz Delay(50); // Delay 50ms LCD_WriteReg(0x0020, 0x0000); // GRAM horizontal Address LCD_WriteReg(0x0021, 0x0000); // GRAM Vertical Address Delay(50); // Delay 50ms // ----------- Adjust the Gamma Curve ----------// LCD_WriteReg(0x0030, 0x0007); LCD_WriteReg(0x0031, 0x0707); LCD_WriteReg(0x0032, 0x0006); LCD_WriteReg(0x0035, 0x0704); LCD_WriteReg(0x0036, 0x1F04); LCD_WriteReg(0x0037, 0x0004); LCD_WriteReg(0x0038, 0x0000); LCD_WriteReg(0x0039, 0x0706); LCD_WriteReg(0x003C, 0x0701); LCD_WriteReg(0x003D, 0x000F); Delay(50); // Delay 50ms //------------------ Set GRAM area ---------------// LCD_WriteReg(0x0050, 0x0000); // Horizontal GRAM Start Address LCD_WriteReg(0x0051, 0x00EF); // Horizontal GRAM End Address LCD_WriteReg(0x0052, 0x0000); // Vertical GRAM Start Address LCD_WriteReg(0x0053, 0x013F); // Vertical GRAM Start Address LCD_WriteReg(0x0060, 0xA700); // Gate Scan Line //LCD_WriteReg(0x0060, 0x2700); // Gate Scan Line LCD_WriteReg(0x0061, 0x0001); // NDL,VLE, REV LCD_WriteReg(0x006A, 0x0000); // set scrolling line //-------------- Partial Display Control ---------// LCD_WriteReg(0x0080, 0x0000); LCD_WriteReg(0x0081, 0x0000); LCD_WriteReg(0x0082, 0x0000); LCD_WriteReg(0x0083, 0x0000); LCD_WriteReg(0x0084, 0x0000); LCD_WriteReg(0x0085, 0x0000); //-------------- Panel Control -------------------// LCD_WriteReg(0x0090, 0x0010); LCD_WriteReg(0x0092, 0x0000); LCD_WriteReg(0x0093, 0x0003); LCD_WriteReg(0x0095, 0x0110); LCD_WriteReg(0x0097, 0x0000); LCD_WriteReg(0x0098, 0x0000); //----------------- display ON -------------------// LCD_WriteReg(0x0007, 0x0133); // 262K color and display ON LCD_WriteReg(0x0020, 0x0000); LCD_WriteReg(0x0021, 0x0000); } /*-----------------------------------------------------------------------------*\ | LCD_SetCursor : Sets the cursor position. | | Input : - Xpos: specifies the X position. | | - Ypos: specifies the Y position. | \*-----------------------------------------------------------------------------*/ void LCD_SetCursor(unsigned short Xpos, unsigned short Ypos) { LCD_WriteReg(R33, Xpos); LCD_WriteReg(R32, Ypos); } /*-----------------------------------------------------------------------------*\ | LCD_SetArea : Sets a display window | \*-----------------------------------------------------------------------------*/ void LCD_SetArea( unsigned short x0, unsigned short y0, unsigned short x1, unsigned short y1 ) { LCD_SetCursor(x0, y0); /* Horizontal GRAM Start Address */ LCD_WriteReg(R80, y0); /* Horizontal GRAM End Address */ LCD_WriteReg(R81, y1); /* Vertical GRAM Start Address */ LCD_WriteReg(R82, x0); /* Vertical GRAM End Address */ LCD_WriteReg(R83, x1); } /*-----------------------------------------------------------------------------*\ | LCD_RectangleFill : Displays a rectangle filled | \*-----------------------------------------------------------------------------*/ void LCD_Rectangle( unsigned short x0, unsigned short y0, unsigned short x1, unsigned short y1, unsigned short Color ) { int x,y; LCD_SetArea(x0,y0,x1,y1); LCD_Reg( R34 ); /* Prepare to write GRAM */ for (x=0;x<=x1-x0;x++) for (y=0;y<=y1-y0;y++) LCD_WriteRAM( Color ); } /*-----------------------------------------------------------------------------*\ | LCD_Clear : Clears the hole LCD. | \*-----------------------------------------------------------------------------*/ void LCD_Clear_Screen( unsigned short Color ) { LCD_Rectangle( 0,0, 319,239, Color ); } /*-----------------------------------------------------------------------------*\ | LCD_SetPixel : Displays a pixel. | \*-----------------------------------------------------------------------------*/ void LCD_SetPixel( unsigned short x, unsigned short y, unsigned short Color ) { LCD_SetArea(x,y,x,y); LCD_Reg( R34 ); /* Prepare to write GRAM */ LCD_WriteRAM( Color ); } /*-----------------------------------------------------------------------------*\ | LCD_PutChar8x16 : Displays a 8x16 pixel charactor | \*-----------------------------------------------------------------------------*/ #include "8x16.h" void LCD_PutChar8x16(unsigned short x, unsigned short y, char c, unsigned int f, unsigned int b) { register unsigned int i,j; LCD_SetArea(x,y,x+8-1,y+16-1); LCD_Reg( R34 ); /* Prepare to write GRAM */ for (i=0; i<16;i++) { unsigned char m=Font8x16[c*16+i]; for (j=0;j<8;j++) { if ((m&0x80)) LCD_WriteRAM( f ); else LCD_WriteRAM( b ); m<<=1; } } } /*-----------------------------------------------------------------------------*\ | LCD_PutChar8x8 : Displays a 8x8 pixel charactor | \*-----------------------------------------------------------------------------*/ #include "8x8h.h" void LCD_PutChar8x8(unsigned short x, unsigned short y, char c, unsigned int f, unsigned int b) { register unsigned int i,j; LCD_SetArea(x,y,x+8-1,y+8-1); LCD_Reg( R34 ); /* Prepare to write GRAM */ for (i=0; i<8;i++) { unsigned char m=Font8x8[c][i]; for (j=0;j<8;j++) { if ((m&0x80)) LCD_WriteRAM( f ); else LCD_WriteRAM( b ); m<<=1; } } } /*-----------------------------------------------------------------------------*\ | LCD_PutGB1616 : Displays a Chinese charactor use small libary | \*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*\ | LCD_PutChar : Displays a charactor on Font | \*-----------------------------------------------------------------------------*/ void LCD_PutChar(unsigned short x, unsigned short y, char c, unsigned int f, unsigned int b) { if ( Font ) LCD_PutChar8x8( x, y, c, f, b ); else LCD_PutChar8x16( x, y, c, f, b ); } /*-----------------------------------------------------------------------------*\ | LCD_PutString : Displays a string | \*-----------------------------------------------------------------------------*/ void LCD_PutString(unsigned short x, unsigned short y, char *s, unsigned int f, unsigned int b) { register unsigned char l=0; while (*s) { if ( *s < 0x80 ) { LCD_PutChar(x+l*8,y,*s,f,b); s++; l++; } else { // LCD_PutGB1616(x+l*8,y,(unsigned char *)s,f,b); s+=2; l+=2; } } } void LCD_RESIM_YATAY(int x0,int y0,int g,int y,int rg,int ry, const unsigned char bmp[]) { int i,j; int p=0; int c; LCD_SetArea(x0,y0,x0+g-1,y0+y-1); LCD_Reg( R34 ); /* Prepare to write GRAM */ for (j= 0;j<y;j++) { p=0; for ( i = x0; i<x0+g; i++ ) { c = bmp[p+1+j*rg*2] | (bmp[p +j*rg*2]<<8) ; LCD_WriteRAM(c); p = p + 2; } } } /*----------------------------------------------------------*\ | END OF FILE | \*----------------------------------------------------------*/