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

📄 lcd320.c

📁 在移植成功ucos核的基础上扩充了该操作系统的许多没有功能。如文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
	rLCDSADDR1= (0x3<<27) |(LCDBANK<<21)|LCDBASEU;//| ((((U32)LCDBuffer16)>>1)&0x7ffffff);
	    //256-color, LCDBANK, LCDBASEU
	rLCDSADDR2= (0<<29)|(0<<21)|LCDBASEL;
	rLCDSADDR3= (640/2)|(0<<9);
	    //No virtual screen. 
	//rREDLUT=0xfca86420;
	//rGREENLUT=0xfca86420;
	//rBLUELUT=0xfffff840;
	rREDLUT=0xfca86420;
	rGREENLUT=0xfca86420;
	rBLUELUT=0xfffffa50;

	
	rLCDCON1=LCDCON1_ENVID|0<<1|0<<2|0<<3|(2<<5)|1<<7|(0x3<<8)|(0x3<<10)|(CLKVAL<<12);//|LCDCON1_MMODE;
	    // enable,8B_SNGL_SCAN,WDLY=16clk,WLH=16clk,CLKVAL=?
	for(i=0;i<640*480/4;i++)
		*(pLCDBuffer16+i)=0x0;

	Delay(500);
    LCDDisplayOpen(TRUE); 
}

#endif

/*void LCDBkLight(U8 isOpen)
{
	if(isOpen){
		rPDATC|=LCDBkLightPin;
	}
	else{
		rPDATC&=~LCDBkLightPin;
	}
}*/

void LCDDisplayOpen(U8 isOpen)
{

    if(isOpen){
      	rPDATB&=~LCDDisplayPin;
              }
   	else{
        rPDATB|=LCDDisplayPin;
	          }
}

U8 LCDTxtBuffer[LCDRow][LCDColumn];
int LCDCurrentPrnTxt=0;	//打印文本所在的行
int LCDCurrentPrnTxtx=0;
int LCDCurrentDspTxt=0;
U8 LCDIsprnOverPage=FALSE;	//是否滚动屏幕

void LCD_TxtRefresh(int LCDCurrentDspTxtl)
{
	int i,j,k,showrow;
	unsigned int data;
	U8 txtdata;

#if (LCDTYPE==LCDTYPE_320x240x16GRAY)

        if(LCDdspMode!=DspTxtMode)
		 return;
	for(j=0;j<LCDHEIGHT;j++){
		for(i=0;i<LCDColumn;i++){
			data=0;
			showrow=LCDCurrentDspTxtl+j/LCDTxtMode_TxtHeight;
			if(showrow>LCDRow-1)
				showrow-=LCDRow;
			txtdata=LCDTxtBuffer[showrow][i];
			if(txtdata>=128)
				txtdata=' ';
			txtdata=LCDTxtData[txtdata][j%LCDTxtMode_TxtHeight];
			for(k=7;k>=0;k--){
				data<<=4;
				data|=((txtdata>>k)&0x1)*0xf;
			}
			*(pLCDBuffer16+i+j*40)=data;
		}
	}
#elif ((LCDTYPE==LCDTYPE_320x240x256COLOR) ||(LCDTYPE==LCDTYPE_640x480x256STN))
	unsigned char *pLCDBuffer=(unsigned char *)pLCDBuffer16;
       if(LCDdspMode!=DspTxtMode)
		 return;
		 	
	for(j=0;j<LCDHEIGHT;j++){
		for(i=0;i<LCDColumn;i++){
			data=0;
			showrow=LCDCurrentDspTxtl+j/LCDTxtMode_TxtHeight;
			if(showrow>LCDRow-1)
				showrow-=LCDRow;
			txtdata=LCDTxtBuffer[showrow][i];
			if(txtdata>=128)
				txtdata=' ';
			txtdata=LCDTxtData[txtdata][j%LCDTxtMode_TxtHeight];

			*pLCDBuffer=((txtdata>>4)&0x1)*0xff;
			pLCDBuffer++;
			*pLCDBuffer=((txtdata>>5)&0x1)*0xff;
			pLCDBuffer++;
			*pLCDBuffer=((txtdata>>6)&0x1)*0xff;
			pLCDBuffer++;
			*pLCDBuffer=((txtdata>>7)&0x1)*0xff;
			pLCDBuffer++;
			*pLCDBuffer=((txtdata)&0x1)*0xff;
			pLCDBuffer++;
			*pLCDBuffer=((txtdata>>1)&0x1)*0xff;
			pLCDBuffer++;
			*pLCDBuffer=((txtdata>>2)&0x1)*0xff;
			pLCDBuffer++;
			*pLCDBuffer=((txtdata>>3)&0x1)*0xff;
			pLCDBuffer++;
		}
	}
#endif
}

extern char tbuf[];
void LCD_printf(const char *format,...)
{
	int i,j=0,k=0;
	va_list v_list;
	char *ptr;

	va_start(v_list, format);     // Initialize variable arguments. 
	vsprintf(tbuf, format, v_list ); 
	va_end(v_list);

	ptr= tbuf;

	if(LCDdspMode!=DspTxtMode)
		return;

	/*格式化字符串*/
	for(i=0;ptr[i]!=0;i++){
		if(ptr[i]=='\n'){	//换行
		      for(j=LCDCurrentPrnTxtx;j<LCDColumn;j++)	//补齐空格
				LCDTxtBuffer[LCDCurrentPrnTxt][j]=0;
	       	LCDCurrentPrnTxt++;
			LCDCurrentPrnTxtx=0;
			if(LCDCurrentPrnTxt>LCDRow-1){
				LCDCurrentPrnTxt-=LCDRow;
				LCDIsprnOverPage=TRUE;
			}
			if(LCDIsprnOverPage)
				k=2;
			 else k=1;
			break;
		}
		else{
			if(LCDCurrentPrnTxtx<LCDColumn)
				LCDTxtBuffer[LCDCurrentPrnTxt][LCDCurrentPrnTxtx++]=ptr[i];
		}
	}
	switch(k){
		case 0:  if(LCDIsprnOverPage)
				   LCDCurrentDspTxt=LCDCurrentPrnTxt+1;
		            for(j=LCDCurrentPrnTxtx;j<LCDColumn;j++)	//补齐空格
				    LCDTxtBuffer[LCDCurrentPrnTxt][j]=0;
			      break;
             case 1:  break;
             case 2:  LCDCurrentDspTxt=LCDCurrentPrnTxt;
             	            break;
		}	 
	
	LCD_TxtRefresh(LCDCurrentDspTxt);
}

void LCD_ChangeMode(U8 mode)
{
	LCDdspMode=mode;
	if(LCDdspMode==DspGraMode)
		LCD_Refresh();
	 else  LCD_TxtRefresh(LCDCurrentDspTxt);	
}

void LCD_Refresh()
{
	int i,j;
	U32 lcddata;
	U32 pixcolor;	//一个像素点的颜色
	U32 *p=pLCDBuffer16;
	U8* pbuf=(U8*)LCDBuffer[0];

	if(LCDdspMode!=DspGraMode)
		return;

#if (LCDTYPE==LCDTYPE_320x240x16GRAY)
	for(i=0;i<LCDWIDTH*LCDHEIGHT/8;i++){
		lcddata=0;
		for(j=28;j>=0;j-=4){
			pixcolor=0xf-(pbuf[0]+pbuf[1]+pbuf[2])/48;	//变换RGB色彩为灰度
			lcddata|=pixcolor<<j;
			pbuf+=4;
		}
		*(pLCDBuffer16+i)=lcddata;
	}
#elif ((LCDTYPE==LCDTYPE_320x240x256COLOR)||(LCDTYPE==LCDTYPE_640x480x256STN))

	for(i=0;i<LCDWIDTH*LCDHEIGHT/4;i++){
		lcddata=0;
		for(j=24;j>=0;j-=8){
			pixcolor=(pbuf[0]&0xe0)|((pbuf[1]>>3)&0x1c)|(pbuf[2]>>6);	//变换RGB
				//		R			G					B
			lcddata|=pixcolor<<j;
			pbuf+=4;
		}
		*p=lcddata;
		p++;
	}
#endif
}

//文本模式下清除屏幕?
void LCD_Cls() 
{
	LCDCurrentPrnTxt=0;	//打印文本所在的行
	LCDIsprnOverPage=FALSE;
		
	memset(LCDTxtBuffer,0,LCDRow*LCDColumn);
	LCD_TxtRefresh(LCDCurrentPrnTxt);
}
void LCD_TestShow()
{

int i,j,k;
U32 jcolor;


  for (i=0;i<7;i++)
     {  switch (i)
        { 
           case 0: jcolor=0x000000e0;  //R   红色
                   break;
           case 1: jcolor=0x0000d0e0;  //R  and G 橙色
                   break;
           case 2: jcolor=0x0000e0e0;   //R  and G 黄
                   break;
           case 3: jcolor=0x0000e000;  //G  绿色
                   break;
           case 4: jcolor=0x00e0e000;  //G  B   青色
                   break;
           case 5: jcolor=0x00e00000;  //B    蓝色
                   break;
           case 6: jcolor=0x00e000e0;  //R  and B   紫色
                   break;
         }
       
      for (k=0;k<48;k++)
        for (j=i*45+2;j<i*45+45+2;j++) 
          LCDBuffer[k][j]=jcolor; 
      for (k=192;k<240;k++)
        for (j=i*45+2;j<i*45+45+2;j++) 
          LCDBuffer[k][j]=jcolor; 


        
      }
 

  jcolor=0x000000ff;
  for (i=49;i<191;i++)
      {if (i==96||i==144)
         jcolor<<=8;
       for (j=2;j<317;j++)  
          LCDBuffer[i][j]=jcolor;    //画RGB三色水平条纹
       }

jcolor=0x00000000;
for(i=49;i<191;i++)
 for (j=89;j<232;j++) 
       LCDBuffer[i][j]=jcolor; //画黑色方块

jcolor=0x00e0e0e0;
for(i=84;i<156;i++)
 for (j=124;j<196;j++) 
       LCDBuffer[i][j]=jcolor; //画白色方块
       
for (j=0;j<320;j++) {
       LCDBuffer[48][j]=jcolor; //画一条白线
 	LCDBuffer[191][j]=jcolor; }
for (j=0;j<240;j++) {
       LCDBuffer[j][0]=jcolor; //画一条白线
 	LCDBuffer[j][319]=jcolor; }

 	
    LCD_Refresh() ;     




}

⌨️ 快捷键说明

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