📄 st7529.c
字号:
}
SetLcdReg(LineAddSet); // line address set
WriteLcdData(TITLEHIGH+(MAXLINE-1)*LINEHIGH+12);
WriteLcdData(160-BOOMHIGH);
h=160-BOOMHIGH-(TITLEHIGH+(MAXLINE-1)*LINEHIGH+12)+1;
SetLcdReg(MemWrite);//DATA WRITE
for(i=0;i<h;i++)
{
for(j=0;j<54;j++) Dis_Drv2B3P(0);
}
DrowLine(TITLEHIGH-5);
DrowLine(160-BOOMHIGH);
}
void StateClear(void) //清除状态拦
{
int32 i,j;
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(0x1f);// START COLUMN
WriteLcdData(0x54);// ENDCOLUMN
SetLcdReg(LineAddSet); // line address set
WriteLcdData(0);
WriteLcdData(TITLEHIGH-4);
SetLcdReg(MemWrite);//DATA WRITE
for(i=0;i<TITLEHIGH-5;i++)
{
for(j=0;j<54;j++) Dis_Drv2B3P(0);
}
SetLcdReg(LineAddSet); // line address set
WriteLcdData(160-BOOMHIGH+1);
WriteLcdData(159);
SetLcdReg(MemWrite);//DATA WRITE
for(i=0;i<BOOMHIGH;i++)
{
for(j=0;j<54;j++) Dis_Drv2B3P(0);
}
}
void Display61(uint8 x,uint8 y,const uint8 *pic) //在(x,y)处开始的9*12的区域显示pic,主要用于ASCII
{
uint8 u8t,j;
SetLcdReg(LineAddSet); // line address set
WriteLcdData(y);
WriteLcdData(y+11);
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(32+x/3);// START COLUMN
WriteLcdData(32+x/3+2);// ENDCOLUMN
SetLcdReg(MemWrite);//DATA WRITE
for(j=0;j<12;++j)
{
u8t=pic[j]>>5;
Dis_Drv2B3P(u8t);
u8t=(pic[j]&0x1C)>>2;
Dis_Drv2B3P(u8t);
u8t=(pic[j]&0x03)<<1;
Dis_Drv2B3P(u8t);
}
}
void Display6(uint8 x,uint8 y,const uint8 *pic) //在(x,y)处开始的6*12的区域显示pic,主要用于显示小数字(在SystemState.c中用)
{
uint8 u8t,j;
SetLcdReg(LineAddSet); // line address set
WriteLcdData(y);
WriteLcdData(y+11);
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(32+x/3);// START COLUMN
WriteLcdData(32+x/3+1);// ENDCOLUMN
SetLcdReg(MemWrite);//DATA WRITE
for(j=0;j<12;++j)
{
u8t=pic[j]>>5;
Dis_Drv2B3P(u8t);
u8t=(pic[j]&0x1C)>>2;
Dis_Drv2B3P(u8t);
}
}
void Display12(uint8 x,uint8 y,const uint8 *pic) //在(x,y)处开始的12*12的区域显示pic,主要用于汉字
{
uint8 u8t,j;
SetLcdReg(LineAddSet); // line address set
WriteLcdData(y);
WriteLcdData(y+15);
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(32+x/3);// START COLUMN
WriteLcdData(32+x/3+3);// ENDCOLUMN
SetLcdReg(MemWrite);//DATA WRITE
for(j=0;j<12;++j)
{
u8t=pic[j*2]>>5;
Dis_Drv2B3P(u8t);
u8t=(pic[j*2]&0x1C)>>2;
Dis_Drv2B3P(u8t);
u8t=((pic[j*2]&0x03)<<1)|((pic[j*2+1]&0x80)>>7);
Dis_Drv2B3P(u8t);
u8t=(pic[j*2+1]&0x70)>>4;
Dis_Drv2B3P(u8t);
}
}
void Display9(uint8 x,uint8 y,const uint8 *pic) //在(x,y)处开始的9*12的区域显示pic 用于显示大数字
{
uint8 u8t,j;
SetLcdReg(LineAddSet); // line address set
WriteLcdData(y);
WriteLcdData(y+15);
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(32+x/3);// START COLUMN
WriteLcdData(32+x/3+2);// ENDCOLUMN
SetLcdReg(MemWrite);//DATA WRITE
for(j=0;j<12;++j)
{
u8t=pic[j*2]>>5;
Dis_Drv2B3P(u8t);
u8t=(pic[j*2]&0x1C)>>2;
Dis_Drv2B3P(u8t);
u8t=((pic[j*2]&0x03)<<1)|((pic[j*2+1]&0x80)>>7);
Dis_Drv2B3P(u8t);
}
}
void Display18(uint8 x,uint8 y,const uint8 *pic) //在(x,y)处开始的18*18的区域显示pic 用于显示工作象限
{
uint8 u8t,j;
SetLcdReg(LineAddSet); // line address set
WriteLcdData(y);
WriteLcdData(y+17);
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(32+x/3);// START COLUMN
WriteLcdData(32+x/3+5);// ENDCOLUMN
SetLcdReg(MemWrite);//DATA WRITE
for(j=0;j<18;++j)
{
u8t=pic[j*3]>>5;
Dis_Drv2B3P(u8t);
u8t=(pic[j*3]&0x1C)>>2;
Dis_Drv2B3P(u8t);
u8t=((pic[j*3]&0x03)<<1)|((pic[j*3+1]&0x80)>>7);
Dis_Drv2B3P(u8t);
u8t=(pic[j*3+1]&0x70)>>4;
Dis_Drv2B3P(u8t);
u8t=(pic[j*3+1]&0x0E)>>1;
Dis_Drv2B3P(u8t);
u8t=((pic[j*3+1]&0x01)<<2)|((pic[j*3+2]&0xC0)>>6);
Dis_Drv2B3P(u8t);
}
}
void Dis_ASCII(uint8 x,uint8 y,uint8 c) //显示ASCII(32~126)
{
Display61(x,y,ASCII612+(c-32)*12); //因为所取字库是从32开始取的,所以从(c-32)处取字库
}
void ReadGBToBuf(uint8 *ToBuf,uint8 *GbBuf) //读取国标码汉字GbBuf字库到ToBuf
{
int i,j;
i=*GbBuf-0xa0;j=GbBuf[1]-0xa0;
fnAT45DBXXX_Read(ToBuf,(HZK12+(94*(i-1)+(j-1))*24l),24);
}
void Dis_GB(uint8 x,uint8 y,uint8 *GbBuf) //显示汉字
{
ReadGBToBuf(Dis_HZK12Buf,GbBuf);
Display12(x,y,Dis_HZK12Buf);
}
/*****************显示第y行显示缓冲的内容,该屏内容的起始显示行为start**************/
void DisplayLin(int32 y,int32 start)
{
uint8 u8t;
uint32 i,j,line;
line=(y-start+3*MAXLINE)%MAXLINE*LINEHIGH+TITLEHIGH; //y换算为起始点纵坐标
y%=MAXLINE;
/**************画定显示区域**********************/
SetLcdReg(LineAddSet); // line address set
WriteLcdData( line-1 );
WriteLcdData( line+12 );
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(0x1f);// START COLUMN
WriteLcdData(0x54);// ENDCOLUMN
y*=12; //数据存储的启始行
SetLcdReg( MemWrite ); // Entry Memory Write Mode
for(j=0;j<54;j++) Dis_Drv2B3P(0);
for( j = 0; j < 12 ; j++ ) //向指定显示区域中填入显示数据
{
u8t=0;
for( i = 0 ; i < 6 ; i++ )
{
u8t|=(Dis_ScrBuf[y+j][i*3]&0x80)>>7;
Dis_Drv2B3P(u8t);
u8t=(Dis_ScrBuf[y+j][i*3]&0x70)>>4;
Dis_Drv2B3P(u8t);
u8t=((Dis_ScrBuf[y+j][i*3]&0x0E)>>1);
Dis_Drv2B3P(u8t);
u8t=((Dis_ScrBuf[y+j][i*3]&0x01)<<2)|((Dis_ScrBuf[y+j][i*3+1]&0xC0)>>6);
Dis_Drv2B3P(u8t);
u8t=(Dis_ScrBuf[y+j][i*3+1]&0x38)>>3;
Dis_Drv2B3P(u8t);
u8t=(Dis_ScrBuf[y+j][i*3+1]&0x07);
Dis_Drv2B3P(u8t);
u8t=Dis_ScrBuf[y+j][i*3+2]>>5;
Dis_Drv2B3P(u8t);
u8t=(Dis_ScrBuf[y+j][i*3+2]&0x1C)>>2;
Dis_Drv2B3P(u8t);
u8t=((Dis_ScrBuf[y+j][i*3+2]&0x03)<<1);
}
u8t|=(Dis_ScrBuf[y+j][18]&0x80)>>7;
Dis_Drv2B3P(u8t);
u8t=(Dis_ScrBuf[y+j][18]&0x70)>>4;
Dis_Drv2B3P(u8t);
u8t=((Dis_ScrBuf[y+j][18]&0x0E)>>1);
Dis_Drv2B3P(u8t);
u8t=((Dis_ScrBuf[y+j][18]&0x01)<<2)|((Dis_ScrBuf[y+j][19]&0xC0)>>6);
Dis_Drv2B3P(u8t);
u8t=(Dis_ScrBuf[y+j][19]&0x38)>>3;
Dis_Drv2B3P(u8t);
u8t=(Dis_ScrBuf[y+j][19]&0x07);
Dis_Drv2B3P(u8t);
}
for(j=0;j<54;j++) Dis_Drv2B3P(0);
}
/*****************显示缓冲的内容,该屏内容的起始显示行为start**************/
void DisPlayBuf(int32 start)
{
int32 i;
for(i=0;i<MAXLINE;i++)
{
DisplayLin(i,start);
}
}
/*****************在(x,y)处显示n个像素的数据缓冲的内容**************/
void DisPlay_DatBuf(int32 x,int32 y,int32 n)
{
uint8 u8t;
int32 s32t1,s32t2,i,j,k=0;
SetLcdReg(LineAddSet); // line address set
WriteLcdData( y );
WriteLcdData( y+11 );
u8t=0;
x/=3; //计算起始列,由于模块3像素为一列,显示以3像素下对齐,即显示实际横坐标为(x/3)*3
if(n%3!=0) //计算一共显示的列数,3像素上对齐,即n=7时为3列,n=12时为4列
{ s32t1=n/3+1;}
else
{ s32t1=n/3; }
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(32+x); // START COLUMN
WriteLcdData(31+x+s32t1); // END COLUMN 32+x+s32t1-1
s32t2=n%8; //计算最后一个缓冲字节中有多少像素
n/=8;
SetLcdReg( MemWrite );
for( j = 0; j < 12 ; j++ ) //向指定显示区域中填入显示数据
{
for( i = 0 ; i < n ; i++ )
{
u8t=Dis_DatLineBuf[j][i]>>5;
Dis_Drv2B3P(u8t);
u8t=(Dis_DatLineBuf[j][i]&0x1C)>>2;
Dis_Drv2B3P(u8t);
u8t=((Dis_DatLineBuf[j][i]&0x03)<<1);
if(!(++i<n))
{k=1;break;} //k记最后一个缓冲整字节后中留下几个像素还没显示
u8t|=(Dis_DatLineBuf[j][i]&0x80)>>7;
Dis_Drv2B3P(u8t);
u8t=(Dis_DatLineBuf[j][i]&0x70)>>4;
Dis_Drv2B3P(u8t);
u8t=((Dis_DatLineBuf[j][i]&0x0E)>>1);
Dis_Drv2B3P(u8t);
u8t=((Dis_DatLineBuf[j][i]&0x01)<<2);
if(!(++i<n))
{k=2;break;}
u8t|=((Dis_DatLineBuf[j][i]&0xC0)>>6);
Dis_Drv2B3P(u8t);
u8t=(Dis_DatLineBuf[j][i]&0x38)>>3;
Dis_Drv2B3P(u8t);
u8t=(Dis_DatLineBuf[j][i]&0x07);
Dis_Drv2B3P(u8t);
u8t=0; k=0;
}
if(s32t2) //如果最后一个整字节后还有需要显示的像素
{
switch(k) //结合记最后一个整字节后中还没显示像素进行显示
{
case 0:u8t=Dis_DatLineBuf[j][n]>>5;
Dis_Drv2B3P(u8t);
if(s32t2<4) break;
u8t=(Dis_DatLineBuf[j][n]&0x1C)>>2;
Dis_Drv2B3P(u8t);
if(s32t2<7) break;
u8t=(Dis_DatLineBuf[j][n]&0x03)<<1;
Dis_Drv2B3P(u8t);
break;
case 1:u8t|=(Dis_DatLineBuf[j][n]&0x80)>>7;
Dis_Drv2B3P(u8t);
if(s32t2<2) break;
u8t=(Dis_DatLineBuf[j][n]&0x70)>>4;
Dis_Drv2B3P(u8t);
if(s32t2<5) break;
u8t=((Dis_DatLineBuf[j][n]&0x0E)>>1);
Dis_Drv2B3P(u8t);
break;
default:u8t|=((Dis_DatLineBuf[j][n]&0xC0)>>6);
Dis_Drv2B3P(u8t);
if(s32t2<3) break;
u8t=(Dis_DatLineBuf[j][n]&0x38)>>3;
Dis_Drv2B3P(u8t);
if(s32t2<6) break;
u8t=(Dis_DatLineBuf[j][n]&0x07);
Dis_Drv2B3P(u8t);
}
}
else
{ if(k) //送出最后没显示的数据
{ Dis_Drv2B3P(u8t); }
}
}
}
/*****************显示160*160的点阵图片**************/
void DisplayPic(const uint8 *pic)
{
uint8 u8t;
int32 j,i,s32t;
//OSMutexPend(St7529Mutex,0,&err);
/**************画定显示区域**********************/
SetLcdReg(LineAddSet); // line address set
WriteLcdData( 0 );
WriteLcdData( 159 );
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(0x1f);// START COLUMN
WriteLcdData(0x54);// ENDCOLUMN
SetLcdReg( MemWrite ); // Entry Memory Write Mode
for( j = 0; j < 160 ; j++ ) //向指定显示区域中填入显示数据
{
u8t=0;
s32t=j*20;
for( i = 0 ; i < 6 ; i++ )
{
u8t|=(pic[s32t+i*3]&0x80)>>7;
Dis_Drv2B3P(u8t);
u8t=(pic[s32t+i*3]&0x70)>>4;
Dis_Drv2B3P(u8t);
u8t=((pic[s32t+i*3]&0x0E)>>1);
Dis_Drv2B3P(u8t);
u8t=((pic[s32t+i*3]&0x01)<<2)|((pic[s32t+i*3+1]&0xC0)>>6);
Dis_Drv2B3P(u8t);
u8t=(pic[s32t+i*3+1]&0x38)>>3;
Dis_Drv2B3P(u8t);
u8t=(pic[s32t+i*3+1]&0x07);
Dis_Drv2B3P(u8t);
u8t=pic[s32t+i*3+2]>>5;
Dis_Drv2B3P(u8t);
u8t=(pic[s32t+i*3+2]&0x1C)>>2;
Dis_Drv2B3P(u8t);
u8t=((pic[s32t+i*3+2]&0x03)<<1);
}
u8t|=(pic[s32t+18]&0x80)>>7;
Dis_Drv2B3P(u8t);
u8t=(pic[s32t+18]&0x70)>>4;
Dis_Drv2B3P(u8t);
u8t=((pic[s32t+18]&0x0E)>>1);
Dis_Drv2B3P(u8t);
u8t=((pic[s32t+18]&0x01)<<2)|((pic[s32t+19]&0xC0)>>6);
Dis_Drv2B3P(u8t);
u8t=(pic[s32t+19]&0x38)>>3;
Dis_Drv2B3P(u8t);
u8t=(pic[s32t+19]&0x07);
Dis_Drv2B3P(u8t);
}
}
void LCD_Reset() //复位模块
{
LcdRestSet(0);
OSTimeDly(OS_TICKS_PER_SEC/2);
LcdRestSet(1);
OSTimeDly(OS_TICKS_PER_SEC/2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -