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