📄 lcd_12864.c
字号:
uchar s0;
uint dot_data,ori_data1,ori_data2;
uchar Column,move;
if(y_loc>31){
Column = x_loc/16;
y_loc = 63 - y_loc ;}
else
{
y_loc = 31 - y_loc ;
Column = (x_loc/16)+8;
}
move = x_loc%16;
/*wr_lcd (comm,0x34);
wr_lcd (comm,y+y_loc);
wr_lcd (comm,x1+Column);
wr_lcd (dat,0xbb);
wr_lcd (dat,0xaa);
wr_lcd (comm,0x36);*/
wr_lcd (comm,0x34);
wr_lcd (comm,y+y_loc);
wr_lcd (comm,x1+Column);
s0=Read_state();
ori_data1=Read_state();
ori_data2=Read_state();
if(move<8){
dot_data = 0x80>>move;
dot_data = dot_data | ori_data1;
wr_lcd (comm,0x34);
wr_lcd (comm,y+y_loc);
wr_lcd (comm,x1+Column);
wr_lcd (comm,0x30);
wr_lcd (dat,dot_data);
wr_lcd (dat,ori_data2);
wr_lcd (comm,0x36);
delay(20);
}
else{
move=move-8;
dot_data = 0x80>>move;
dot_data = dot_data | ori_data2;
wr_lcd (comm,0x34);
wr_lcd (comm,y+y_loc);
wr_lcd (comm,x1+Column);
wr_lcd (comm,0x30);
wr_lcd (dat,ori_data1);
wr_lcd (dat,dot_data);
wr_lcd (comm,0x36);
delay(20);
}
}
void Line(uchar a1,uchar b1,uchar a2,uchar b2)
{
//y1 = 64 - y1 ;
//y2 = 64 - y2 ;
char i;
char a,b;
float y_add;
a=a2-a1;
b=b2-b1;
if(a==0)//画竖线
{
if(b>0)
{ for(i=0;i<b;i++)//上升
Locat_Dot(a1,b1+i);
}
else if(b==0) //画点
Locat_Dot(a1,b1);
else //下降
{ for(i=b;i<0;i++)
Locat_Dot(a1,b1+i);
}
}
else y_add = b*1.000/a; //斜线:斜率
if(a>0)//正向
{
if((y_add<=1)&&(y_add>=-1))//0°~~ 45°到135°~~ 180°
{
for(i=0;i<a;i++)
{
delay(20);
b=b1+y_add*i;
Locat_Dot(a1+i,b);
}
}
else
{
if(b>0) //正向上升
{
for(i=0;i<b;i++)
{
a=a1+i/y_add;
Locat_Dot(a,b1+i);
}
}
else if(b==0)//水平线
{
for(i=0;i<a;i++)
Locat_Dot(a1+i,b1);
}
else //正向下降
{
for(i=b;i<0;i++)
{
a=a1+i/y_add;
Locat_Dot(a,b1+i);
}
}
}
}//正向
else if(a<0)//反向
{
if(y_add <=1&&y_add>=-1)//0°~ 45°到 135°~ 180°
{
for(i=a;i<0;i++)
{
b=b1+y_add*i;
Locat_Dot(a1+i,b);
}
}
else
{
if(b>0)
{
for(i=0;i<b;i++)
{
a=a1+i/y_add;
Locat_Dot(a,b1+i);
}
}
else if(b==0)
{
for(i=a;i<0;i++)
Locat_Dot(a1+i,b1);
}
else
{
for(i=b;i<0;i++)
{
a=a1+i/y_add;
Locat_Dot(a,b1+i);
}
}
}
}//x<0: 反向
}
/*----------------显示图形-----------------*/
void img_disp (uchar code *img)
{
uchar i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j);
wr_lcd (comm,x1+i);
wr_lcd (comm,0x30);
wr_lcd (dat,img[j*16+i*2]);
wr_lcd (dat,img[j*16+i*2+1]);
}
}
for(j=32;j<64;j++)
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j-32);
wr_lcd (comm,x2+i);
wr_lcd (comm,0x30);
wr_lcd (dat,img[j*16+i*2]);
wr_lcd (dat,img[j*16+i*2+1]);
}
}
wr_lcd (comm,0x36);
}
/*-------------下半屏显示图形--------------*/
void img_disp1 (uchar code *img)
{
uchar i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j);
wr_lcd (comm,x2+i);
wr_lcd (comm,0x30);
wr_lcd (dat,img[j*16+i*2]);
wr_lcd (dat,img[j*16+i*2+1]);
}
}
wr_lcd (comm,0x36);
}
/*--------------显示点阵----------------*/
void lat_disp (uchar data1,uchar data2)
{
uchar i,j,k,x;
x=x1;
for(k=0;k<2;k++)
{
for(j=0;j<16;j++)
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j*2);
wr_lcd (comm,x+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data1);
wr_lcd (dat,data1);
}
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j*2+1);
wr_lcd (comm,x+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data2);
wr_lcd (dat,data2);
}
}
x=x2;
}
wr_lcd (comm,0x36);
}
/*-----------------------------------------------*/
//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
uchar i,j;
for(j=0;j<yl;j++)
{
for(i=0;i<xl;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y0+j);
wr_lcd (comm,x0+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data1);
wr_lcd (dat,data2);
}
}
wr_lcd (comm,0x36);
}
/*--------------清DDRAM------------------*/
void clrram (void)
{
wr_lcd (comm,0x30);
wr_lcd (comm,0x01);
}
/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
chk_busy ();
if(dat_comm)
{
P0=P0|0x01; //data
delay(20);
P0=P0&0xfd; //write
delay(20);
}
else
{
P0=P0&0xfe; //command
delay(20);
P0=P0&0xfd; //write
delay(20);
}
data1=content; //output data or comm
P0=P0|0x04;
delay(50);
P0=P0&0xfb;
}
uint Read_state()
{
uint rd_data;
P2MDOUT=0x00;
data1=0xff;
chk_busy ( );
P0=P0|0x01; //rs=1;
delay(20);
P0=P0|0x02;//rw=1;
delay(20);
P0=P0|0x04;//e=1;
delay(20);
rd_data=data1;
delay(20);
P0=P0&0xfb;
P2MDOUT=0xff;
return( rd_data);
}
void chk_busy (void)
{
//P74OUT=0xf3;
data1=0xff;
_nop_();
delay(10);
P0=P0|0x02;
delay(20);
P0=P0&0xfe;
delay(20);
P0=P0|0x04;
delay(20);
P0 =P0&0xfb;
// while(data1&0x80);
delay(20);
//P74OUT=0xff;
}
void delay (uint us) //delay time
{
while(us--);
}
void delay1 (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<150;j++)
delay(1);
}
/*------------------主程序--------------------*/
void main ()
{
System_initial( );
Port_initial( ) ;
init_lcd ();
while (1)
{
/*
lat_disp (0x00,0x00);
chn_disp (tab1);
con_disp (0xff,0xff,0x8c,0x80,2,16);
delay1 (8000);
clrram();
lat_disp (0xcc,0xcc);
delay1 (8000);
lat_disp (0x00,0x00);
chn_disp1 (tab31);
img_disp1 (tab32);
delay1 (8000);
*/
clrram();
delay1 (80);
//lat_disp (0xff,0x00);
//delay1 (8000);
//img_disp (tab5);
lat_disp (0x00,0x00);
delay1 (80);
Line(0,0,30,10);
Line(0,50,30,50);
Line(0,50,40,30);
Line(20,50,30,60);
Line(10,0,10,60);
delay1 (8000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -