📄 lcd320240.h
字号:
contain <<= (8-x_end_mode);
for(j=locate_y;j<y_end;j++)
{
data_begin=read_data(x_begin,j,area);//因为前后都是同一个字节
data_end=data_begin;
data_begin >>= (x_begin_mode);
data_begin <<= (x_begin_mode);
data_end <<= (x_end_mode);
data_end >>= (x_end_mode);
display_char( x_begin,j,area,contain|(data_begin|data_end) );
}
}
else
for(j=locate_y;j<y_end;j++)
{
data_begin=read_data(x_begin,j,area);
data_begin >>= (x_begin_mode);
data_begin <<= (x_begin_mode);
contain_begin=contain;
contain_begin <<= (8-x_begin_mode);
contain_begin >>= (8-x_begin_mode);
display_char( x_begin, j, area, contain_begin|data_begin );
LCD_locate_xy(x_begin+1,j,area);
for(i=x_begin+1;i<x_end;i++)
{
LCD_write_cmd( MWRITE ); // 当前位置写入数据指令
LCD_write_data( contain ); // 写入显示字符代码
}
data_end=read_data(x_end,j,area);
data_end <<= (x_end_mode);
data_end >>= (x_end_mode);
contain_end=contain;
contain_end >>= (8-x_end_mode);
contain_end <<= (8-x_end_mode);
display_char( x_end, j, area, contain_end|data_end );
}
}
else
{
for(j=locate_y;j<locate_y+y;j++)
for(i=locate_x;i<locate_x+x;i++)
{
display_char(i,j,1,0);
}
}
}
//-----------------------------------------------------------------------------
//在(locate_x,locate_y),(范围为40*240)处显示分辨率为x*y的图片
//-------------------------------------------------------------------------------
void draw_picture_flash(uint locate_x,uint locate_y,uchar area,uint x,uint y,uchar flash *bmp)
{
uint i,j,k=0;
uint col=locate_x+x/8;
uint row=locate_y+y;
for(i=locate_x;i<col;i++)
{
for(j=locate_y;j<row;j++)
{
LCD_locate_xy(i,j,area);
LCD_write_cmd( MWRITE );
LCD_write_data( bmp[k] );
k++;
}
}
}
//--------------------------------------------------------------------------------
//在(locate_x,locate_y),(范围达320*240)处显示分辨率为x*y的图片
//-------------------------------------------------------------------------------
void draw_anywhere(uint locate_x,uint locate_y,uchar area,uint x,uint y,uchar col_num,uchar flash *bmp)
{
uint i,j,across;
uchar row_count=0;//已写行数
uchar x_begin=locate_x>>3, x_end=x_begin+col_num; //算出长的前后地址
uchar y_end=locate_y+y; //算出宽的末地址
uchar x_begin_mode=0, x_end_mode=0; //x前后端余数
uchar data_begin=0, data_end=0; //每一行的前后两端的字节数据
uchar bmp_begin=0,bmp_end=0; //图片的开头结尾暂存
uint page_count=0,addr_exc=0,whole_exc=0;
uchar row_buffer1[30],row_buffer2[30];//行显存
for(i=0;i<30;i++)
{
row_buffer1[i]=0;
row_buffer2[i]=0;
}
/////////求出前后边沿偏移量///////////
x_begin_mode = (8-locate_x%8);
x_end_mode = 8-x_begin_mode;
for(j=locate_y;j<y_end;j++)
{
////////////读取前后边沿数据//////////////////////////
data_begin=read_data(x_begin,j,area); //读取开头边沿值
data_begin >>= x_begin_mode;
data_begin <<= x_begin_mode;
data_end=read_data(x_end,j,area); //读取结尾边沿值
data_end <<= x_end_mode;
data_end >>= x_end_mode;
//////////////////////循环横向跨写,写入显存row_buffer1///////////////////////////
for(across=0; across<col_num; across++ )
{
whole_exc=across*y+row_count;
row_buffer1[across] = bmp[whole_exc];
}
bmp_begin=row_buffer1[0];
bmp_begin >>= (8-x_begin_mode);
bmp_end=row_buffer1[across-1];
bmp_end <<= 8-x_end_mode;
//////////////////////////数据移位放进显存row_buffer2并写进LCD//////////////////////////////////////
row_buffer2[0] = data_begin|bmp_begin;
for(across=1; across<col_num; across++)//将缓冲区(一行)内容作右移
{
row_buffer2[across] = (row_buffer1[across-1]<<x_begin_mode)|(row_buffer1[across]>>(8-x_begin_mode));
}
row_buffer2[across] = data_end|bmp_end;
for(across=0;across<=col_num;across++)//将右移后的内容写入LCD
display_char(x_begin+across,j,2,row_buffer2[across]);
row_count++;
}
}
//--------------------------------------------------------------------------------
//图像方式显示一串字符
//-------------------------------------------------------------------------------
void show_string ( uchar x, uchar y,uchar flash *string)
{
uint i=0,temp;
while(string[i])
{
temp=string[i]-32;
temp<<=4;
draw_picture_flash(x,y,2,8,16,ASCALL+temp);
i++;
x++;
}
}
//-------------------------------------------------------------------------------
//显示整型数据n
//---------------------------------------------------------------------
void number(unsigned char x,unsigned char y,unsigned int n)
{
unsigned char i=0,length=0,a[7]={0,0,0,0,0,0,0};
unsigned int nx=n,j=0,temp;
for(i=0;i<6;i++)
{
if(nx>0)length++;
nx/=10;
}
nx=n;
for(i=length;i>0;i--)
{
a[i-1]=nx%10+48;
nx=nx/10;
}
if(n==0)a[0]='0';
while(a[j])
{
temp=a[j]-32;
temp<<=4;
draw_picture_flash(x,y,2,8,16,ASCALL+temp);
j++;
x++;
}
}
//---------------------------------------------------------------------
//功能:在第y行,x列处显示16进制数据n
//------------------------------------------------------------------------------------------
void number16(unsigned char x,unsigned char y,unsigned int n)
{
unsigned char i=0,a[7]={0,0,0,0,0,0,0};
unsigned int nx=n,j=0,temp;
if(nx<=0xFF)
{
a[3]=nx%16;
nx/=16;
a[2]=nx%16;
for(i=2;i<4;i++)
{
if(a[i]<10)a[i]+=48;
else a[i]+=55;
}
a[4]=0x00;
}
else
{
a[5]=nx%16;
nx/=16;
a[4]=nx%16;
nx/=16;
a[3]=nx%16;
nx/=16;
a[2]=nx%16;
for(i=2;i<6;i++)
{
if(a[i]<10)a[i]+=48;
else a[i]+=55;
}
}
a[1]='x';
a[0]='0';
while(a[j])
{
temp=a[j]-32;
temp<<=4;
draw_picture_flash(x,y,2,8,16,ASCALL+temp);
j++;
x++;
}
}
//------------------------------------------------------------------------------------------
//显示浮点数
//---------------------------------------------------------------------
void number_float(unsigned char x,unsigned char y,float n)
{
uchar i=0,numlength=0,xlength=0,zlength=0,flag=0;//numlength是数长,xlength是小数长度,zlength是整数长度
uchar a[10]={0,0,0,0,0,0,0,0,0,0};
uint j,temp;
float ftemp;
long int ltemp=0;
if(n<0)
{
n=-n;
flag=1;
}
ftemp=n;
//该循环计算出小数长度
for(i=0;i<6;i++)
{
ltemp=ftemp; //去掉小数
if(ftemp>ltemp)
{
ftemp=ftemp*10;
ltemp=ftemp;
xlength++;
}
}
ltemp=n; //去掉小数
//该循环计算出整数长zlength
for(i=0;i<6;i++)
{
if(ltemp>=1)
{
ltemp=ltemp/10;
zlength++;
}
}
if(n<1)
zlength=1;
numlength=zlength+xlength; //计算原数字及小数点的长度
//将n去掉小数点放进ftemp
ftemp=n;
for(i=xlength;i>0;i--)
ftemp=ftemp*10;
//如果是负数,则置负号
if(flag==1)
{
numlength++;
zlength++;
}
//将ftemp变为长整型放进字符数组a[]
ltemp=ftemp;
for(i=numlength;i>zlength;i--)
{
a[i]=ltemp%10+48;
ltemp/=10;
}
a[zlength]='.';
for(i=zlength;i>0;i--)
{
a[i-1]=ltemp%10+48;
ltemp/=10;
}
a[numlength+1]=0;
ltemp=n;
if(ltemp==n)a[numlength]=0x00; //如果该n是整数则去掉小数点
if(flag==1)a[0]='-';
while(a[j])
{
temp=a[j]-32;
temp<<=4;
draw_picture_flash(x,y,2,8,16,ASCALL+temp);
j++;
x++;
}
}
//汉字显示
//------------------------------------------------------------------------------------------
void hanzi(uchar locate_x,uchar locate_y,uchar x,uchar y,uchar n,uchar flash *zi)
{
uchar i;
uint zikuan=x/8,zichang=zikuan*y;
for(i=0;i<n;i++)
{
draw_picture_flash(locate_x+zikuan*i,locate_y,2,x,y,zi+zichang*i);
}
}
//------------------------------------------------------------------------------------------
//在第y行,x列画一点
//------------------------------------------------------------------------------------------
void draw_dot(uint x,uint y)//会对文字模式进行返白
{
uchar row,col,b,dot;
uchar data;//读取该处原先的内容
col=x/8;
row=y;
b=x%8;
dot=0x80>>b;
data=read_data(col,row,2);
display_char(col,row,2,data|dot);
}
//------------------------------------------------------------------------------------------
//在第y行,x列擦除一点
//------------------------------------------------------------------------------------------
void clear_dot(uint x,uint y)
{
uchar row,col,b,dot;
uchar data;//读取该处原先的内容
col=x/8;
row=y;
b=x%8;
dot=0x80>>b;
dot=~dot;
data=read_data(col,row,2);
display_char(col,row,2,data&dot);
}
//------------------------------------------------------------------------------------------
//取绝对值
//------------------------------------------------------------------------------------------
uint my_abs(float x)
{
if(x>=0)return x;
else return (-x);
}
//在第(x1,y1),(x2,y2)之间画直线
//------------------------------------------------------------------------------------------
void line(float x1,float y1,float x2,float y2)
{
int i=x1,j=y1;
float a=(y2-y1)/(x2-x1),b=(y1-y2)*x1/(x2-x1)+y1;//方程y=ax+b的系数
int step_x,step_y;
if(x1<x2)step_x=1;
else step_x=-1;
if(y1<y2)step_y=1;
else step_y=-1;
if(my_abs(x2-x1)>=my_abs(y2-y1))
{
for(i=x1;i!=x2;i+=step_x)
{
j=a*i+b;
draw_dot(i,j);
}
}
else
for(j=y1;j!=y2;j+=step_y)
{
i=(j-b)/a;
draw_dot(i,j);
}
}
//------------------------------------------------------------------------------------------
//在第(x1,y1),(x2,y2)之间画矩形
//------------------------------------------------------------------------------------------
void box(uint x1,uint y1,uint x2,uint y2)
{
int x=x1,y=y1;
int step_x,step_y;
if(x1<x2)step_x=1;
else step_x=-1;
if(y1<y2)step_y=1;
else step_y=-1;
for(x=x1;x!=x2;x+=step_x)
{
draw_dot(x,y1);
draw_dot(x,y2);
}
for(y=y1;y!=y2+1;y+=step_y)
{
draw_dot(x1,y);
draw_dot(x2,y);
}
}
//------------------------------------------------------------------------------------------
//画圆
//------------------------------------------------------------------------------------------
void circuit(uint x1,uint y1,uint r)
{
uint x,y,h;
for(x=x1-r;x<=x1+r;x++)
{
h=sqrt(r*r-(x-x1)*(x-x1));
y=y1+h;
draw_dot(x,y);
y=y1-h;
draw_dot(x,y);
}
for(y=y1-r;y<=y1+r;y++)
{
h=sqrt(r*r-(y-y1)*(y-y1));
x=x1+h;
draw_dot(x,y);
x=x1-h;
draw_dot(x,y);
}
}
/*=========================================================================================*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -