📄 12864.h
字号:
void delay(uint x)//11.0592M延时函数10uS
{
uint a,b;
for(a=x;a>0;a--)
for(b=8;b>0;b--);
}
/*写指令到LCD*/
/*RS=L,RW=L,E=H脉冲,D0--D7=指令码。*/
void write_cmd(uchar cmd)
{
LCD_EN=0;
busyloop();
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delay(2);
LCD_EN=1;
LCD_EN=0;
}
/*写数据到LCD*/
/*RS=H,RW=L,E=H脉冲,D0--D7=指令码。*/
void write_dat(uchar dat)
{
LCD_EN=0;
busyloop();
LCD_RS=1;
LCD_RW=0;
P0=dat;
delay(1);
LCD_EN=1;
LCD_EN=0;
}
/*读数据*/
/*RS=H,RW=H,E=H脉冲,D0--D7=指令码。*/
uchar read_dat()
{
uchar dat;
LCD_EN = 0;
busyloop();
LCD_RS = 1;
LCD_RW = 1;
LCD_EN = 1;
dat=P0;
return (dat);
}
/*设定显示位置*/
void lcd_pos(uchar X,uchar Y)//X行 Y列
{
uchar pos;
if(X==0)
{X=0x80;}
else if(X==1)
{X=0x90;}
else if(X==2)
{X=0x88;}
else if(X==3)
{X=0x98;}
pos=X+Y;
write_cmd(pos);//显示地址
}
/*LCD初始化设置*/
void lcd_int()
{
RST=1;
LCD_PSB=1;//并口方式
write_cmd(0x30);//基本操作
write_cmd(0x0c);//开显示,关光标
write_cmd(0x01);//清屏
}
void busyloop() //忙检测
{
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
Lcd=0xff;
while((Lcd&0x80)==0x80);
LCD_EN=0;
}
void photodisplay1(uchar *bmp) //由下向上移动显示
{
uchar i,j,*add;
//write_cmd(0x34); //写数据时,关闭图形显示
for(i=32;i>0;i--)//下半平面显示
{
add=bmp+16*(i+31);
write_cmd(0x80+i-1);
write_cmd(0x88);
for(j=0;j<16;j++)
{
write_dat(*add++);
//delay(300);//调节显示快慢
}
}
for(i=32;i>0;i--)
{
add=bmp+16*(i-1);// 上平面显示
write_cmd(0x80+i-1); //先写入水平坐标值
write_cmd(0x80); //写入垂直坐标值
for(j=0;j<16;j++) //再写入两个8位元的数据
{
write_dat(*add++);
//delay(300);
}
}
//write_cmd(0x36); //写完数据,开图形显示
}
void photodisplay(uchar *bmp)//由上下移动显示
{
uchar i,j;
//write_cmd(0x34); //写数据时,关闭图形显示
for(i=0;i<32;i++)// 上平面显示
{
write_cmd(0x80+i); //先写入水平坐标值
write_cmd(0x80); //写入垂直坐标值
for(j=0;j<16;j++) //再写入两个8位元的数据
{
write_dat(*bmp++);
//delay(300);
}
}
for(i=0;i<32;i++)//下半平面显示
{
write_cmd(0x80+i);
write_cmd(0x88);
for(j=0;j<16;j++)
{
write_dat(*bmp++);
//delay(300);
}
}
//write_cmd(0x36); //写完数据,开图形显示
}
void play() //清屏
{
uchar i,j;
write_cmd(0x34); //写数据时,关闭图形显示
for(i=0;i<32;i++)
{
write_cmd(0x80+i); //先写入水平坐标值
write_cmd(0x80); //写入垂直坐标值
for(j=0;j<16;j++) //再写入两个8位元的数据
write_dat(0);
}
for(i=0;i<32;i++)
{
write_cmd(0x80+i);
write_cmd(0x88);
for(j=0;j<16;j++)
write_dat(0);
}
write_cmd(0x36); //写完数据,开图形显示
}
void Point(uchar x,uchar y,uchar flag)//画点 (0,0,127,63)
{
uchar x_Dyte,x_byte,GDRAM_hbit; //定义列地址的字节位,及在字节中的哪1位
uchar y_Dyte,y_byte,GDRAM_lbit; //定义为上下两个屏(取值为0,1),行地址(取值为0~31)
write_cmd(0x36); //绘图模式命令
/***X,Y坐标互换,即普通的X,Y坐标***/
x_Dyte=x/16; //计算在16个字节中的哪一个
x_byte=x&0x0f; //计算在该字节中的哪一位
y_Dyte=y/32; //0为上半屏,1为下半屏
y_byte=y&0x1f; //计算在0~31当中的哪一行
write_cmd(0x80+y_byte); //设定行地址(y坐标)
write_cmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏
read_dat();
GDRAM_hbit=read_dat(); //读取当前显示高8位数据
GDRAM_lbit=read_dat(); //读取当前显示低8位数据
if(flag==1)
{
write_cmd(0x80+y_byte); //设定行地址(y坐标)
write_cmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏
if(x_byte<8) //判断其在高8位,还是在低8位
{
write_dat(GDRAM_hbit|(0X01<<(7-x_byte))); //显示GDRAM区高8位数据
write_dat(GDRAM_lbit); //显示GDRAM区低8位数据
}
else
{
write_dat(GDRAM_hbit);
write_dat(GDRAM_lbit|(0x01<<(15-x_byte)));
}
}
else
{
write_cmd(0x80+y_byte); //设定行地址(y坐标)
write_cmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏
if(x_byte<8) //判断其在高8位,还是在低8位
{
write_dat(GDRAM_hbit & ~(0X01<<(7-x_byte))); //显示GDRAM区高8位数据
write_dat(GDRAM_lbit); //显示GDRAM区低8位数据
}
else
{
write_dat(GDRAM_hbit);
write_dat(GDRAM_lbit & ~(0x01<<(15-x_byte)));
}
}
}
int fabs1(char a)//求绝对值函数
{
char b;
if(a>=0)b=a;
else b=-a;
return (b);
}
void Line(uchar x0,uchar y0,uchar x1,uchar y1)//划线(0,0,127,63)
{
int temp;
int dx,dy; //定义起点到终点的横、纵坐标增加值
int s1,s2,status,i;
int Dx,Dy,sub;
dx=x1-x0;
if(dx>=0)s1=1; //X的方向是增加的
else s1=-1; //X的方向是降低的
dy=y1-y0; //判断Y的方向是增加还是降到的
if(dy>=0)s2=1;
else s2=-1;
Dx=fabs1(x1-x0); //计算横、纵标志增加值的绝对值
Dy=fabs1(y1-y0);
if(Dy>Dx) //
{ //以45度角为分界线,靠进Y轴是status=1,靠近X轴是status=0
temp=Dx;
Dx=Dy;
Dy=temp;
status=1;
}
else status=0;
/********判断垂直线和水平线*****/
//if(dx==0) //横向上没有增量,画一条水平线
//GUI_XLine(x0,y0,y1,1);
//if(dy==0) //纵向上没有增量,画一条垂直线
//GUI_YLine(x0,y0,x1,1);
/*********Bresenham算法画任意两点间的直线***/
sub=2*Dy-Dx; //第1次判断下个点的位置
for(i=0;i<Dx;i++)
{
Point(x0,y0,1); //画点
if(sub>=0)
{
if(status==1)x0+=s1; //在靠近Y轴区,x值加1
else y0+=s2; //在靠近X轴区,y值加1
sub-=2*Dx; //判断下下个点的位置
}
if(status==1)y0+=s2;
else x0+=s1;
sub+=2*Dy;
}
}
/****************************************************************************
* 名称:plotC(int x,int y,int xc,int yc,unsigned char colour)
* 功能:八分点画圆函数
* 入口参数:x 指定线起点所在行的位置
* y 指定线起点所在列的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
****************************************************************************/
void plotC(int x,int y,int xc,int yc,unsigned char colour)
{
Point(xc+x,yc+y,colour);
Point(xc+x,yc-y,colour);
Point(xc-x,yc+y,colour);
Point(xc-x,yc-y,colour);
Point(xc+y,yc+x,colour);
Point(xc+y,yc-x,colour);
Point(xc-y,yc+x,colour);
Point(xc-y,yc-x,colour);
}
void Circle(int xc,int yc,int r,unsigned char colour)//画圆 xc, yc圆心 r半径
{
int x,y,d;
y = r;
d = 3 - (r + r);
x = 0;
while(x <= y)
{
plotC(x,y,xc,yc,colour);
if(d < 0) d += (x + x + x + x) + 6;
else
{
d+=((x - y) + (x - y) + (x - y) + (x - y)) + 10;
y = y - 1;
}
x = x + 1;
}
}
void Draw(uchar x,uchar y,const uchar *pin)
{ //画16x16的图画。X,Y 图画左上角坐标
uchar i,j;
uchar X_byte=x/16; //计算在列的那个位元上(一行共16个位元)
uchar Y_Dyte=y/31; //上下屏标志位
uchar Y_byte=y&0x1f; //0~31行中哪一行
for(j=0;j<16;j++)
{
write_cmd(0x80+Y_byte+j); //计算行地址
write_cmd(0x80+X_byte+8*Y_Dyte); //8*Y_Dyte上下屏标志,确定列地址
delay(1);
write_dat(*pin++); //显示高8位数据
write_dat(*pin++); //显示低8位数据
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -