📄 lcd320x240.c
字号:
data4=DATAPORT&0x00ff;
//=================================
RD=1; // rd=1 pb2
E=1; // ce=1 pb5
//=================================
set_DB_out();
//=================================
return(data4);
}
//==================================================
//==================================================
void clr_textram(void)
{
unsigned int i;
write_lcd_command(0x4c);
write_lcd_command(0x46);
write_lcd_data(0);
write_lcd_data(0);
write_lcd_command(0x42);
for(i=0;i<1200;i++)
{
write_lcd_data(0x20); // 文本区写数据 空格符
ClrWdt();
}
}
//==================================================
void clr_grphram(void)
{
unsigned int i;
write_lcd_command(0x4c);
write_lcd_command(0x46);
write_lcd_data(0xb0);
write_lcd_data(0x04);
write_lcd_command(0x42);
for(i=0;i<9600;i++)
{
write_lcd_data(0x00); // 图形区写数据 空格符
ClrWdt();
}
}
//==================================================
//==================================================
void lcm_init(void)
{
unsigned int i,*p;
Reset_lcd();
//---------------------------------
p=&dataTAB1[0];
write_lcd_command(0x0040);
for(i=0;i<8;i++)
{
write_lcd_data(*p++); // 写系统设置数据
}
p=&dataTAB2[0];
write_lcd_command(0x0044);
for(i=0;i<10;i++)
{
write_lcd_data(*p++); // 写显示控制数据
}
write_lcd_command(0x005a);
write_lcd_data(0x00);
write_lcd_command(0x005b);
write_lcd_data(0x0000); //0c
clr_textram();
clr_grphram();
write_lcd_command(0x0059);
write_lcd_data(0x14); //text graph on 04
//=================================
}
//==================================================
//==================================================
void wr_cmd_2(unsigned int uCmd,unsigned int uPar)
{
lcmcp=uCmd;
write_lcd_command(lcmcp);
lcmdp= uPar&0x00ff;
write_lcd_data(lcmdp);
lcmdp=uPar>>8;
lcmdp&=0x00ff;
write_lcd_data(lcmdp);
}
//==================================================
void wr_cmd_1(unsigned int uCmd,unsigned int uPar)
{
lcmcp=uCmd;
write_lcd_command(lcmcp);
lcmdp= uPar;
write_lcd_data(lcmdp);
}
//==================================================
void wr_cmd_0(unsigned int uCmd)
{
lcmcp=uCmd;
write_lcd_command(lcmcp);
}
//==================================================
// 画水平线(Y1=Y2) X=8*i
//==================================================
void lineH(unsigned int y1,unsigned int x1,unsigned int y2,unsigned int x2)
{
unsigned int i,ipos,length1,length2;
ipos=y1*40+x1/8+1200;
length1=y2*40+x2/8+1200;
length2=length1-ipos;
wr_cmd_0(0x004c);
wr_cmd_2(0x0046,ipos);
wr_cmd_0(0x0042);
for(i=0;i<length2;i++)
{
write_lcd_data(0x00ff);
}
}
//==================================================
// 画点
//==================================================
void pixel(unsigned int PointX,unsigned int PointY)
{
unsigned int i, StartAddr;
unsigned int dat,dat2,dat3;
StartAddr=PointY*40 + PointX/8 +1200;
dat=(unsigned int)(7-PointX%8); //产生点的数据
dat2=0x0001;
for(i=0;i<dat;i++)
{
dat2<<=1;
}
wr_cmd_0(0x004c);
wr_cmd_2(0x0046,StartAddr); //读该点所在单元地址内容
wr_cmd_0(0x0043);
dat3=read_lcd_data();
dat2|=dat3;
wr_cmd_0(0x004c);
wr_cmd_2(0x0046,StartAddr); //设置该点所在单元地址
wr_cmd_1(0x0042,dat2); // 画点位数据
}
//==================================================
// 画线(点--点)
//==================================================
void line(unsigned int y1,unsigned int x1,unsigned int y2,unsigned int x2)
{
unsigned int x,y;
float k,b;
if( abs(y1-y2) <= abs(x1-x2)) // |k|<=1
{
k=((float)y2-y1) / ((float)x2-x1) ;
b=y1-k*x1;
if( x1 <= x2 )
{
for(x=x1;x<=x2;x++)
{
y=(unsigned int)(k*x+b);
pixel(x, y);
}
}
else
{
for(x=x2;x<=x1;x++)
{
y=(unsigned int)(k*x+b);
pixel(x, y);
}
}
}
else
{
k=((float)x2-x1) / ((float)y2-y1) ;
b=x1-k*y1;
if( y1 <= y2 )
{
for(y=y1;y<=y2;y++)
{
x=(unsigned int)(k*y+b);
pixel(x , y);
}
}
else
{
for(y=y2;y<=y1;y++)
{
x=(unsigned int)(k*y+b);
pixel(x , y);
}
}
}
}
//=================================================
// 显示8*16点阵字符
//=================================================
void showchar8(unsigned int col,unsigned int row,unsigned int chp,unsigned int attribute)
{
unsigned int i,j,char_data,*p;
p=&HZ8_DOT_LIB[0];
chp=chp*16;
p=p+chp;
col/=8;
//=========================================
// 显示中文
//=========================================
if(attribute)
{
for(j=0;j<16;j++)
{
char_addr_point_set(row,col); //设置Vram地址
write_lcd_command(0x0042);
char_data=*p++;
write_lcd_data(char_data);
row+=1;
ClrWdt();
}
}
else
{
for(j=0;j<16;j++)
{
char_addr_point_set(row,col); //设置Vram地址
write_lcd_command(0x0042);
char_data=*p++;
char_data^=0x00ff;
write_lcd_data(char_data);
row+=1;
ClrWdt();
}
}
}
//==================================================
// // 显示16*16点阵字符
//==================================================
void showchar16(unsigned int col,unsigned int row,unsigned int chp,unsigned int attribute)
{
unsigned int i,j,char_data,*p;
p=&HZ16_DOT_LIB[0];
chp=chp*32;
p=p+chp;
col/=8;
//=========================================
// 显示中文
//=========================================
if(attribute)
{
for(j=0;j<16;j++)
{
char_addr_point_set(row,col); //设置Vram地址
write_lcd_command(0x0042);
char_data=*p++; //左8位
write_lcd_data(char_data);
char_data=*p++; //右8位
write_lcd_data(char_data);
row+=1;
ClrWdt();
}
}
else
{
for(j=0;j<16;j++)
{
char_addr_point_set(row,col); //设置Vram地址
write_lcd_command(0x0042);
char_data=*p++;
char_data^=0x00ff;
write_lcd_data(char_data);
char_data=*p++;
char_data^=0x00ff;
write_lcd_data(char_data);
row+=1;
ClrWdt();
}
}
}
//==================================================
void char_addr_point_set( unsigned int urow,unsigned int ucol)
{
unsigned int ipos;
ipos=urow*40+ucol+1200;
wr_cmd_0(0x004c);
wr_cmd_2(0x0046,ipos);
}
//==================================================
// 显示24*24点阵字符
//==================================================
void delaya(unsigned int dat)
{
unsigned int i,j,datnum;
datnum=dat;
for(i=0;i<datnum;i++)
{
for (j=0;j<1000;j++)
{
ClrWdt();
}
}
}
//==================================================
//eof
//==================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -