⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 LPC2148驱动320240的初始化代码
💻 C
字号:
#include "lcd.h"
#include "lpc214x.h"
Uchar8 SYSTEMSET_code[8] = {0x30, 0x87, 0x07, 0x28, 0x42, 0xf0, 0x28, 0x00}; //P1-P8参数
Uchar8 SCRTAB_code[10] = {0x00, 0x00, 0xf0, 0x00, 0x40, 0x80, 0x00, 0xf0, 0x00, 0x00}; //P1-P10参数
void LCD_INIT(void);
//void DISPON(void);
void delay(int n);
void clear(void);
void Line(void)	;
void  pixelw(Uint32 x,Uint32 y, char attr) ;
void Linexy(unsigned int x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char attr) 			  ;
void  LCD_CMD(unsigned char cmd)  ;
void  LCD_DATA(unsigned char cmd)  ;
void  LCD_Cursorxy( char x, char y);
void test(void);
int main()
 {
// int i;
    delay(5000);
    PINSEL0 &= LCD_PINSEL0;		        //PINSEL0的管脚定义不变
	PINSEL1 &= LCD_PINSEL1;             //使p0.29和p0.30为GPIO口
	PINSEL2 &= LCD_PINSEL2;				//P1口的P1[31:26]用作调试端口,P1[25:16]用作I/0口 
	IO0DIR |= RDA0_0DIR;                 //设置P0.29和P0.30为输出引脚
	IO1DIR |= WRCS_1DIR | Data_1DIR;    //设置P1.16 - P1.25为输出引脚 
	
 //   LCD_CMD(0x40);
//	LCD_DATA(0x30);
//	LCD_CMD(0x59);
//	LCD_DATA(0x0f);
//l1:
	LCD_INIT();
	delay(5000);
//	DISPON();
//	delay(5000);

	clear();
	 LCD_CMD(0x59);
	LCD_DATA(DispOnP1);

	//设置光标地址
	LCD_CMD(0x4c);

	LCD_CMD(0x46);
	LCD_DATA(0x00);
	LCD_DATA(0x00);
    LCD_CMD(0x42);


//	LCD_DATA(0x55);
//	LCD_DATA(0x55);
//	LCD_DATA(0x55);
//	LCD_DATA(0x55);
//	LCD_DATA(0x55);
    

//	LCD_CMD(0x4f);
//	LCD_CMD(0x59);
//	LCD_DATA(0x54);
//  for(i=0;i<10000;i++)
//	Line() ;
 //  Linexy(0,(Uchar8)20,(Uchar8)300,(Uchar8)200,(Uchar8)0) ;
// delay(50000);
  // test();
	while(1) {
//	goto l1;
   // Line() ;
//	Linexy(0,(Uchar8)20,(Uchar8)300,(Uchar8)100,(Uchar8)1) ;
//	delay(5000);
//  LCD_INIT();
//	DISPON();
 //  clear();
 //  LCD_CMD(0x59);
	LCD_DATA(0x45);
    
  
 // test();
	}

 }

void LCD_INIT()
{
	int i;

	LCD_CMD(0x40);	  //写系统设置命令
	for(i = 0 ; i<8; i++)
	{
		LCD_DATA(ParaSysTable[i]); //P1-P8参数
	}
    delay50ns(20);	//延时1us

	LCD_CMD(Scroll);		//写显示区域设定命令 
	for(i = 0 ; i<10; i++)
	{
		LCD_DATA(ParaScrTableA[i]);		//P1-P10参数
	}
   delay50ns(20);	//延时1us

    LCD_CMD(HdotScr);   //写入点位移设置指令 
    LCD_DATA(HdotScrP1);          //写入P1参数,点位移0
	delay50ns(20); 			   	//延时1us

    LCD_CMD(Ovlay);     //写入区域合成设定指令 
    LCD_DATA(OvlayP1);          //写入P1参数,L1,L2,L3简单或合成 
	delay50ns(20);			   	//延时1us

	LCD_CMD(CsrForm);     //写入光标形状设定指令 
    LCD_DATA(CsrFormP1);    //写入P1参数 8列 
    LCD_DATA(CsrFormP2);        //写入P2参数 8行 
	delay50ns(20);
 }


//写SYSETMSET命令,SYSTEMSET = 0x40;

 /*
   int i=0;
   LCD_CMD(0x40);
   delay(100);
//写SYSTEMSET_CODE数据,P1-P8参数;
    for(i=0;i<8;i++)
	{
	   LCD_DATA(SYSTEMSET_code[i]);
//	   delay(60);
	}

	delay(10);
 }

void  DISPON()
{
	
	//显示区设置命令
	int i; 
	  LCD_CMD(0x44);
	 //SCROLL 参数 P1-P10
	  for(i = 0 ; i<10; i++)
	  {
		LCD_DATA(SCRTAB_code[i]);
	  }

	 //设置水平滚动的位置,
	  LCD_CMD(0x5a);
	  LCD_DATA(0x00);

	//设置显示区域的合成指令
	  LCD_CMD(0x5b);
	  LCD_DATA(0x04);
	 
	  //设置光标形状
	  LCD_CMD(0x5d);
	  LCD_DATA(0x07);
	  LCD_DATA(0x87);
	 

	  //设置屏幕
    
//	 LCD_CMD(0x59);
 //    LCD_DATA(0xff);
//	
	  delay(10);
 }

 */
void delay(int n)
{
	int i;
	for(i = 0; i<n; i++)
	{
	__asm
 	{
 	NOP;
	 }
	}

}

void  LCD_CMD(unsigned char cmd)  
 {  
	 unsigned char cmd1;
	 cmd1 = ((cmd&0x01)<<7)| ((cmd & 0x02)<<5) |((cmd & 0x04)<<3) | ((cmd & 0x08)<<1) |((cmd & 0x10)>>1) | ((cmd & 0x20)>>3) | ((cmd & 0x40)>>5)  | ((cmd & 0x80)>>7) ;
	 IO1PIN =((IO1PIN&0xFF00FFFF)|(cmd1<<16));//
     L_LCD_CS();
	 H_LCD_A0();
	delay50ns(1);

	 H_LCD_RD();
	 H_LCD_WR();
	 delay50ns(1);

	 L_LCD_WR();
	 delay50ns(4);

	 H_LCD_WR();
	 delay50ns(1);

	 H_LCD_CS();
	 H_LCD_A0();
	 delay50ns(1);

	 H_LCD_RD();
	 H_LCD_WR();
	 delay50ns(1);

	  	  	  
}  

void  LCD_DATA(unsigned char cmd)  
 {  
     unsigned char cmd1;
	 cmd1 = ((cmd&0x01)<<7)| ((cmd & 0x02)<<5) |((cmd & 0x04)<<3) | ((cmd & 0x08)<<1) |((cmd & 0x10)>>1) | ((cmd & 0x20)>>3) | ((cmd & 0x40)>>5)  | ((cmd & 0x80)>>7) ;
	 IO1PIN =((IO1PIN&0xFF00FFFF)|(cmd1<<16));//
	 
	 L_LCD_CS();
	 L_LCD_A0(); 
	 delay50ns(1);

	 H_LCD_RD();
	 H_LCD_WR();
	 delay50ns(1);

	 L_LCD_WR();
	delay50ns(4);

	 H_LCD_WR();
	 delay50ns(1);

	 H_LCD_CS();
	 L_LCD_A0();
	 delay50ns(1);

	 H_LCD_RD();
	 H_LCD_WR();

	 delay50ns(1); 	  	  
}  
 void clear()
 {
 	  int i;
   	  LCD_CMD(0x4c);
	  delay(100);
	  LCD_CMD(0x46);
      LCD_DATA(0x8);
	  LCD_DATA(0x8);
	  delay(100);
	  LCD_CMD(0x42);

	  for(i = 0 ; i<32768; i++)
	  {
		   LCD_DATA(0x00);
	  }
	  	 delay(1000);
 }

 void Line()
 {
	    LCD_CMD(0x4c);
		LCD_CMD(0x46);
		LCD_DATA(0x30);
		LCD_DATA(0x40);
	    LCD_CMD(0x42);
		LCD_DATA(0x55);
 }

/*********************************************************************************************************
** 函数名称: LCD_Cursorxy()
** 函数功能 :光标位置
** 入口参数 : x,y为光标的座标
** 出口参数 :无
*********************************************************************************************************/
 void  LCD_Cursorxy( char x, char y)
{
    LCD_DATA(CsrW);
    LCD_DATA(x);
    LCD_DATA(y);
}

/*********************************************************************************************************
** 函数名称 : pixelw(),控制320×240的屏,图形区从2580开始
** 函数功能 :LCD绘点.消点子函数
** 入口参数 : x绘点/消点的x座标,y绘点/消点的y座标,attr为1表示在该座标下画一个点,为其它表示消除该座标下的点.
** 出口参数 :无
*********************************************************************************************************/

void  pixelw(Uint32 x,Uint32 y, char attr)   //描一点 x:0--319 y:0--239
{
      Uint32 addr;
      Uint32 dat;

      addr=y*40+(x)/8+0x2580; 
      LCD_Cursorxy(addr%256,addr/256);       
      LCD_CMD(MREAD); 
     // dat=LCD_DATARead();
	  dat =  0x55;
      LCD_Cursorxy(addr%256,addr/256);
      LCD_CMD(mWrite);
	  if(attr==0x01)
	  { 
           switch (x%8)
        { 
           case 0 :LCD_DATA((dat | 0x00400000)>>15);break;
           case 1 :LCD_DATA((dat | 0x00200000)>>15);break;
           case 2 :LCD_DATA((dat | 0x00100000)>>15);break;
           case 3 :LCD_DATA((dat | 0x00080000)>>15);break;
           case 4 :LCD_DATA((dat | 0x00040000)>>15);break;
           case 5 :LCD_DATA((dat | 0x00020000)>>15);break;
           case 6 :LCD_DATA((dat | 0x00010000)>>15);break;
           case 7 :LCD_DATA((dat | 0x00008000)>>15);break;
         }
	   }
	   else
	   { 
	       switch (x%8)
         { 
           case 0 :LCD_DATA((dat &~0x00400000)>>15);break;
           case 1 :LCD_DATA((dat &~0x00200000)>>15);break;
           case 2 :LCD_DATA((dat &~0x00100000)>>15);break;
           case 3 :LCD_DATA((dat &~0x00080000)>>15);break;
           case 4 :LCD_DATA((dat &~0x00040000)>>15);break;
           case 5 :LCD_DATA((dat &~0x00020000)>>15);break;
           case 6 :LCD_DATA((dat &~0x00010000)>>15);break;
           case 7 :LCD_DATA((dat &~0x00008000)>>15);break;
         }
		}
}


 /*
*********************************************************************************************************
** 函数名称 : Linexy(),画线。任意方向的斜线,直线数学方程    aX+bY=1
** 函数功能 :LCD图形方式下画线操作
** 入口参数 :x0,y0,xt,yt直线段的两个端点,attr表示绘线还是消线.
** 出口参数 :无
*********************************************************************************************************
*/

void Linexy(unsigned int x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char attr) 
{ 
    register unsigned char t; 
    int    xerr=0,yerr=0,delta_x,delta_y,distance; 
    int    incx,incy; 
    unsigned int row,col; 
    delta_x    = xt-x0;                            //计算坐标增量 
    delta_y    = yt-y0; 
    col    = x0; 
    row    = y0; 
    if(delta_x>0) incx=1;                        //设置单步方向 
    else  
    { 
        if( delta_x==0    ) incx=0;                //垂直线 
        else {incx=-1;delta_x=-delta_x;} 
    } 
    if(delta_y>0) incy=1; 
    else 
    { 
        if( delta_y==0    ) incy=0;                //水平线 
        else {incy=-1;delta_y=-delta_y;} 
    } 
    if(    delta_x    > delta_y )    distance=delta_x;    //选取基本增量坐标轴 
    else distance=delta_y; 

    for( t=0;t <= distance+1; t++ ) 
    {                                            //画线输出 
        pixelw(col,row,attr);                //画点 
        xerr +=    delta_x    ; 
        yerr +=    delta_y    ; 
         
        if(    xerr > distance    ) 
        { 
            xerr-=distance; 
            col+=incx; 
        } 
        if(    yerr > distance    ) 
        { 
            yerr-=distance; 
            row+=incy; 
        } 
    } 
}


void test()
{
    int i;
    LCD_CMD(0x5d);
	LCD_DATA(0X0F);
	LCD_DATA(0x0F);
	 //设置屏幕
    
	 LCD_CMD(0x59);
     LCD_DATA(0xff);
	 //显示区设置命令
 	 
	  LCD_CMD(0x44);
//	  SCROLL 参数 P1-P10
	  for(i = 0 ; i<10; i++)
	  {
		LCD_DATA(SCRTAB_code[i]);
	  }

	 //设置水平滚动的位置,
//	  LCD_CMD(0x5a);
//	  LCD_DATA(0x00);

	//设置显示区域的合成指令
//	  LCD_CMD(0x5b);
//	  LCD_DATA(0x04);
	 
	  //设置光标形状
	  LCD_CMD(0x5d);
	  LCD_DATA(0x07);
	  LCD_DATA(0x87);
	 

	  //设置屏幕
    
	 LCD_CMD(0x59);
     LCD_DATA(0xff);
	
	  delay(10);
}


 /**********************************************************************************
*	函数	:delay50ns()
*	函数功能:延时count * 50ns 
*	参数	:Uint32 count
*   返回值	:无
************************************************************************************/
void delay50ns(Uint32 count)
{
	int i;
	for(i = 0; i< count ; i++)
	__asm
	{
	  NOP;
	  NOP;
	  NOP;
	}
}

/****************************************************************************************
*	函数	:delay1us()
*	函数功能:延时count * 1us
*********************************************************************************************/
void  delay1us(Uint32 count)
{
	int i;
	for(i = 0; i<count ; i++)
	{
		delay50ns(20);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -