📄 lcd320.c
字号:
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 + -