📄 display.c
字号:
char_data=*p++;
WriteData(char_data);
row+=1;
}
}
else
{
for(j=0;j<16;j++)
{
char_addr_point_set(row,col); //设置Vram地址
WriteCommand(0x0042);
char_data=*p++;
char_data^=0x00ff;
WriteData(char_data);
row+=1;
}
}
}
//***************************************************************************/
void showchar16(unsigned int row,unsigned int col,unsigned int chp,unsigned int attribute)
{// row:显示行 col:显示列 chp:显示第几个字. attribute:反色。1:显示字黑,0显示字白
unsigned int j,char_data;
const unsigned int *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地址
//显示光标右移,设置光标地址
WriteCommand(0x0042); // 写显示数据
char_data=*p++; //左8位
WriteData(char_data);
char_data=*p++; //右8位
WriteData(char_data);
row+=1;
}
}
else
{
for(j=0;j<16;j++)
{
char_addr_point_set(row,col); //设置Vram地址
WriteCommand(0x0042);
char_data=*p++;
char_data^=0x00ff;
WriteData(char_data);
char_data=*p++;
char_data^=0x00ff;
WriteData(char_data);
row+=1;
}
}
}
//***************************************************************************/
void showchar24(unsigned int row,unsigned int col,unsigned int chp,unsigned int attribute)
{// row:显示行 col:显示列 chp:显示第几个字. attribute:反色。1:显示字黑,0显示字白
unsigned int j,char_data;
const unsigned char *p;
p=&Cdot24lib[0];
chp=chp*72;
p=p+chp;
col/=8;
//-----------------------------------------
// 显示中文
//-----------------------------------------
if(attribute)
{
for(j=0;j<24;j++)
{
char_addr_point_set(row,col); //设置Vram地址
WriteCommand(0x0042);
char_data=*p++;
WriteData(char_data); //左8位
char_data=*p++;
WriteData(char_data); //中8位
char_data=*p++;
WriteData(char_data); //右8位
row+=1;
}
}
else
{
for(j=0;j<24;j++)
{
char_addr_point_set(row,col); //设置Vram地址
WriteCommand(0x0042);
char_data=*p++;
char_data^=0x00ff;
WriteData(char_data);
char_data=*p++;
char_data^=0x00ff;
WriteData(char_data);
char_data=*p++;
char_data^=0x00ff;
WriteData(char_data);
row+=1;
}
}
}
//***************************************************************************/
// 画水平线(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(0x4c);
wr_cmd_2(0x46,ipos);
wr_cmd_0(0x42);
for(i=0;i<length2;i++)
{
WriteData(0xff);
}
}
//==================================================
// 画点
//==================================================
void pixel(unsigned int PointY,unsigned int PointX) // PointY 行 PointX 列
{
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=ReadDataLcm();
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(x1==x2) // x1=x2,画垂直线
{
if(y1<=y2)
{
for(y=y1;y<=y2;y++)
{
pixel(y, x1);
}
}
else
{
for(y=y2;y<=y1;y++)
{
pixel(y, x1);
}
}
}
else
{
if( fabs(y1-y2) <= fabs(x1-x2)) // |k|<=1 // y行数 <= x列数
{
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(y, x);
}
}
else
{
for(x=x2;x<=x1;x++)
{
y=(unsigned int)(k*x+b);
pixel(y,x);
}
}
}
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(y,x);
}
}
else
{
for(y=y2;y<=y1;y++)
{
x=(unsigned int)(k*y+b);
pixel(y , x);
}
}
}
}
}
//==================================================
// 画圆
//==================================================
void circle(unsigned char OY,unsigned char OX,unsigned char R)//
{
unsigned int dx,dy,xx,rr,rs;
dy = R;
rr = R*R;
rs = R*71/100; //0.71R
for(dx=0;dx<=rs;)
{
dx++;
xx = dx*dx;
while((rr-xx)<(dy*dy))
{
dy--;
}
pixel(OY-dy,OX+dx); //第一象限
pixel(OY-dy,OX-dx); //第二象限
pixel(OY+dy,OX-dx); //第三象限
pixel(OY+dy,OX+dx); //第四象限
pixel(OY-dx,OX+dy); //第一象限
pixel(OY-dx,OX-dy); //第二象限
pixel(OY+dx,OX-dy); //第三象限
pixel(OY+dx,OX+dy); //第四象限
}
}
/***************显示一幅全屏图像******************/
void Displayonebmp (Uchar Area,Uchar const *puts) //参数Area为第几图层
{
Uint X;
Uchar i,j;
X=0;
WriteCommand(0x4c ); //设置光标为右移
WriteCommand( 0x46 ); //设置光标的地址
switch(Area)
{
case 1:WriteData( BasePart1 );break; //BasePart1
case 2:WriteData( BasePart2 );break;
case 3:WriteData( BasePart3 );break;
}
WriteCommand( 0x42 ); //允许MCU把数据写入到显示缓冲区去
for(i=0;i<240;i++)
{
for(j=0;j<40;j++)
{
WriteData(puts[X]);
X++;
}
}
}
void dispbmp(void)
{
Displayonebmp (1,bmp2);
}
//============================== 西文显示演示程序 ==============================
// 仅仅用于文本方式下的西文字符串显示,本函数只写入第3显示区
void TextDisp( Uchar Ox,Uchar Oy, Uchar const *ptr ) {
Uchar TexLength=0,ii;
Uint iTemp;
while(ptr[TexLength]>0x1f) {TexLength++;}; // 获取字串长度
iTemp = Oy*paraP9+Ox;
WriteCommand( 0x5d ); // 光标形状设置,代码0x5d
WriteData( 0x07 ); // 设置光标水平点为CSX=8
WriteData( 0x07 ); // 光标为块状形式,垂直点为CSY=8
WriteCommand( 0x5b ); // 显示合成方式设置.代码0x5b
WriteData( 0x01 ); // 设置参数:显示3区为文本属性,二重xor合成
WriteCommand( 0x59 ); // 写入指令DISP ON/OFF代码,后续参数:
WriteData( 0x56 ); // 01 01 01 10显示1~4区开显示,光标闪烁显示
iTemp = (Uint)Oy * paraP9 + Ox; // 光标位置到实际ram地址换算
WriteCommand( 0x4c ); // 自动右移光标指向
WriteCommand( 0x46 ); // 制定光标位置
WriteData( (Uchar)(iTemp &0xff) ); // 设置光标地址CSR
WriteData( (Uchar)(iTemp /256 + BasePart3) ); // 加入显示三区起始地址SAD2H
WriteCommand( 0x42 ); // 当前位置写入数据指令
for(ii=0;ii < TexLength;ii++) {
WriteData( ptr[ii] ); // 写入显示字符代码
}
DelayMs(350);
}
void text_1(void)
{
TextDisp( 0,13, StrForSample1 ); // 英文字符串的显示,演示光标自动移位
}
/*==============================================================================
; 汉字写入子程序(图形方式)。每次调用输出一个汉字
; 支持图形方式使用,完成汉字点阵码的输出。
; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
Ptr......汉字码,库内的排列编码,大型程序时请改用unsigned int类型
; 无返回数据。
==============================================================================*/
void PPutCdotInGraph( Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth ) //汉字写入子程序(图形方式)
{
Uint tempPtr,Optr;
Uchar tempCount1,tempCount2,nByte;
Optr = (Uint)Oy * paraP9 + Ox+0x04b0;
nByte = DotWidth/8;
WriteCommand( CsrDirD ); // 自动右移。
tempPtr = (Uint)Cnumber * DotWidth*nByte;
for (tempCount1=0;tempCount1<nByte;tempCount1++) {
WriteCommand( CsrW ); // 光标定位指令
WriteData( (Uchar)(Optr &0xff) ); // 设置光标地址CSR
WriteData( (Uchar)(Optr /256 ) );
WriteCommand( mWrite ); // ram写指令
switch(DotWidth){
case 8: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData( HZ8_DOT_LIB[tempPtr] ); // 写入数据
tempPtr += nByte;
}
break;
case 24: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData( Cdot24lib[tempPtr] ); // 写入数据
tempPtr += nByte;
}
break;
case 32: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData( Cdot32lib[tempPtr] ); // 写入数据
tempPtr += nByte;
}
break;
case 48: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData( Cdot48lib[tempPtr] ); // 写入数据
tempPtr += nByte;
}
break;
}
tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
Optr++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -