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

📄 lcd320.c.bak

📁 ARM7 不带操作系统的LCD实验原代码
💻 BAK
字号:
#include <stdarg.h>
#include <stdio.h>


#include "..\inc\def.h"
#include "..\inc\44b.h"
#include "..\inc\LCD320.h"
#include "..\inc\ASCII_8X16.h"
#include "..\inc\HZ_8X16.h"



#define LCDCON1_ENVID		(1)
#define LCDCON1_INVVD		(1<<1)
#define LCDCON1_INVFRAME	(1<<2)
#define LCDCON1_INVLINE		(1<<3)
#define LCDCON1_INVCLK		(1<<4)
#define LCDCON1_MMODE		(1<<7)


#define L248 		(8)
#define CLKVAL		(10)	


#define M5D(n) ((n) & 0x1fffff)

extern void Delay(int time);
//////////////////LCD Information//////////////
#define LCDColumn	40
#define LCDRow		20
int LCD_txt_Start_Address;
#define LCDTxtMode_TxtWidth	8
#define LCDTxtMode_TxtHeight	16
#define LCDMapMode_Width        56
#define LCDMapMode_Height       56 
int LCD_start_AddressX;
int LCD_start_AddressY;
U8* pLCDBuffer16=(U8*)0xc000000;
U8* pLCDBuffer;
 U32 show_Row;
 U32 show_Column;

U8 LCDBuffer[LCDHEIGHT][LCDWIDTH];

U32 LCDdspMode=DspTxtMode;
void LCD_Init()
{
	int i;
	U32 LCDBASEU,LCDBASEL,LCDBANK;

	LCDDisplayOpen(FALSE);
	for(i=0;i<320*240;i++)
		*(pLCDBuffer16+i)=0x0;

	/////////////初始化LCD端口/////////////
	/*  PORT D GROUP for LCD                                                        */
	/*      I  I  I  I  O  O  O  O                                                      */
	/*      00 00 00 00 01 01 01 01                                                     */
	
	rPDATD= 0xff;
	rPCOND= 0xaaaa;
	rPUPD = 0x0;
	rPCONE|=0x01;
	rPCONC = 0x5f51ff00;
//        rPDATC=0x00;
        LCDDisplayOpen(FALSE);

	/////////////////////////////////////

	rLCDCON1=(0);//|(1<<5)|(0x3<<8)|(0x3<<10)|(CLKVAL<<12);
	    // disable,4B_SNGL_SCAN,WDLY=16clk,WLH=16clk,CLKVAL=?
	rLCDCON2=(240-1)|(119<<10)|(15<<21);
	    // LINEVAL=420-1 HOZVAL=320/4-1=79;LINEBANK=10;
	    //320x240LCD  LINEBLANK=10 (without any calculation) 
	LCDBANK=0xc000000>>22;//((U32)pLCDBuffer16)>>22;
	LCDBASEU=0x0;//((U32)pLCDBuffer16)&0x3fffff;
	LCDBASEL=LCDBASEU+160*240;//LCDBASEU+(320*8/16+0)*240
//	LCDBASEL =LCDBASEU + (PAGEWIDTH + OFFSIZE) x (LINEVAL +1)
	rLCDSADDR1= (0x3<<27) |(LCDBANK<<21)|LCDBASEU;//| ((((U32)LCDBuffer16)>>1)&0x7ffffff);
	    // color mode, LCDBANK, LCDBASEU
	rLCDSADDR2= (0<<29)|(0<<21)|LCDBASEL;
	rLCDSADDR3= (160) | ( 0<<9 );//(320*8/16)|( 0<<9 )
	    //No virtual screen. 
	rREDLUT=0xfca86420;
	rGREENLUT=0xfca86420;
	rBLUELUT=0xfffffa50;

	//The following value has to be changed for better display.
	//Select 4 levels among 16 gray levels.

	rLCDCON1=LCDCON1_ENVID|(2<<5)|(1<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL<<12);//|LCDCON1_MMODE;
	    // enable,4B_SNGL_SCAN,WDLY=16clk,WLH=16clk,CLKVAL=?

	Delay(2000);
	LCDBkLight(TRUE);

	LCDDisplayOpen(TRUE);
     

}
void LCD_ChangeMode(U8 mode)
{
	LCDdspMode=mode;
}


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

void LCDDisplayOpen(U8 isOpen)
{
	if(isOpen){
		rPDATC&=~LCDDisplayPin;//0x0;
	}
	else{
		rPDATC|=LCDDisplayPin;//0x400;
	}
}

U8 LCDTxtBuffer[LCDRow][LCDColumn];
int LCDCurrentPrnTxt=0;	//打印文本所在的行
U8 LCDIsprnOverPage=FALSE;	//是否滚动屏幕
void  LCD_PrintfS(U32 show_Row,U32 show_Column,const char *format,...)
    {char tbuf[256];char *ptr;
     U32 txtdata;
     unsigned char *pLCDBuffer=(unsigned char *)pLCDBuffer16;
     int i,j;
     U8 x,y;
	 va_list v_list;
	 
	 va_start(v_list, format);     // Initialize variable arguments. 
	 vsprintf(tbuf, format, v_list ); 
	 va_end(v_list);

	 ptr=tbuf;/*格式化字符串*/
     if(LCDdspMode!=DspTxtMode)return; 
	
	 for(;*ptr!=0;ptr++)
	 	  { switch(*ptr)
		        {case '\r':						/*回车 (归头)*/
			       show_Row=0;
			       break;
	            case '\n':						/*换行*/
			        show_Row++;
			        break;
			    default:
			    	if(*ptr<=128)
			    		{pLCDBuffer=pLCDBuffer16+show_Row*LCDWIDTH*LCDTxtMode_TxtHeight+show_Column*LCDTxtMode_TxtWidth;
			    	 for(j=0;j<LCDTxtMode_TxtHeight;j++)
		                     {txtdata=*ptr;
			     txtdata=ASCII_8X16[txtdata][j];
			  *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++;
			pLCDBuffer=pLCDBuffer+LCDWIDTH-LCDTxtMode_TxtWidth;
	         	}
                 show_Column++;
		         break;
		     }
             else 
             	{pLCDBuffer=pLCDBuffer16+show_Column*LCDHEIGHT*LCDTxtMode_TxtWidth+show_Row*LCDTxtMode_TxtHeight;
                 x=*ptr-0xa0;
	                y=*ptr++-0xa0;
                    txtdata=((x-1)*94+(y-1))*32;
                    txtdata=HZ_8X16[txtdata];
                 for(j=0;j<LCDTxtMode_TxtHeight;j++)
                    { *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++;
			pLCDBuffer=pLCDBuffer+LCDHEIGHT-LCDTxtMode_TxtWidth;
	         	}
                 show_Row++;
		         break;
                               }
	 }
 	}
}

void LCD_Column_Row(int m_Row,int m_Colum,U8 m_k)
{
       int j;
       int m_c;
       m_c=(m_Colum/4)*4+(3-m_Colum%4)+LCDTxtMode_TxtHeight*LCDCurrentPrnTxt*40+LCD_txt_Start_Address*8;  
       for( j=0;j<12;j++)
       {
        *(pLCDBuffer16+m_Row*12*40+j*40+m_c)=ASCII_8X16[m_k][j];
       }
}


void LCD_Refresh()
{
int i,j;
	U32 lcddata;
	U32 pixcolor;	//一个像素点的颜色
	U8* pbuf=(U8*)LCDBuffer[0];
	for(i=0;i<LCDWIDTH*LCDHEIGHT;i++){
	lcddata=0;
		for(j=24;j>=0;j-=8){
			pixcolor=(pbuf[0]&0xe0)|((pbuf[1]>>3)&0x1c)|(pbuf[2]>>6);	//变换RGB
			lcddata|=pixcolor<<j;
			pbuf+=4;
		}
		*(pLCDBuffer16+i)=lcddata;
	}
}

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





void LCD_ShowMove(int m_bit)
{
     int i,j,z,x=0,m_Row;
     U8 data,data1,data2,data3;
     U8 d1;
     data=data1=data2=data3=0;
     for(j=0;j<m_bit;j++)
     	{
     	for(x=0;x<LCDRow;x++)
     		{
     		m_Row=x*40*12;
	for(i=0;i<LCDColumn/4;i++)  //列数循环
		{
		for(z=0;z<LCDTxtMode_TxtHeight;z++)
			{
			d1=3+(i+1)*4;
			if(i==9)
				{
				data=0;
				}else{
             		 data=*(pLCDBuffer16+d1+LCDColumn*z+m_Row);
					}
             		 data1=*(pLCDBuffer16+d1-7+LCDColumn*z+m_Row);
             		 data2=*(pLCDBuffer16+d1-6+LCDColumn*z+m_Row);
             		 data3=*(pLCDBuffer16+d1-5+LCDColumn*z+m_Row);
             		 *(pLCDBuffer16+i*4+LCDColumn*z+m_Row)=data;
             		 *(pLCDBuffer16+1+i*4+LCDColumn*z+m_Row)=data1;
             		 *(pLCDBuffer16+2+i*4+LCDColumn*z+m_Row)=data2;
             		 *(pLCDBuffer16+3+i*4+LCDColumn*z+m_Row)=data3;
			}
		}
     	}
     	}
	
}




⌨️ 快捷键说明

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