📄 lcd12864.c
字号:
#include"C8051F020.h" //串行通信方式
#define uchar unsigned char
#define uint unsigned int
#define comm 0
#define dat 1
uint table[8][64]={0}; // 不能写成 :uint code table[8][64]={0};
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<15;j++)
delay(1);
}
//-------------------------------------------
//-------------------------------------------
void wr_lcd (uchar dat_comm,uchar content)
{
uchar a,i,j;
delay (50);
a=content;
P3=P3|0x01; //cs
P3=P3&0xfb; //sclk=0;
P3=P3|0x02; //std=1;
for(i=0;i<5;i++)
{
P3=P3|0x04; //sclk=1;
P3=P3&0xfb; //sclk=0;
}
P3=P3&0xfd; //write /*RW*/
P3=P3|0x04; //sclk=1;
P3=P3&0xfb; //sclk=0;
if(dat_comm)
P3=P3|0x02; //data /*RS*/
else //command
P3=P3&0xfd;
P3=P3|0x04; //sclk=1;
P3=P3&0xfb; //sclk=0;
P3=P3&0xfd; //std=0;
P3=P3|0x04; //sclk=1;
P3=P3&0xfb; //sclk=0;
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
a=a<<1; /*a:要显示的内容;或指令*/
if(CY==1)P3=P3|0x02; //std=1; /*std=CY*/
else P3=P3&0xfd; //std=0;
P3=P3|0x04; //sclk=1;
P3=P3&0xfb; //sclk=0;
}
for(i=0;i<4;i++)
{
P3=P3&0xfd; //std=0;
P3=P3|0x04; //sclk=1;
P3=P3&0xfb; //sclk=0;
}
}
}
void Locat_Dot(uchar x_loc, uchar y_loc) //参数是液晶上的坐标 0~127,0~63
{
uint dot_data;
uchar Line,Column, move;
uchar first,second;
uchar x_axis, y_axis;
y_axis = 63-y_loc ;
x_axis = x_loc/16;
Line = y_axis;
if(y_loc<16)
{
Column=0x18+x_axis;
Line=31-Line;
}
if( (y_loc>16 )&&(y_loc>32))
{
Column=0x08+x_axis;
Line=31-Line;
}
if((y_loc>=32)&&(y_loc<48))
{
Column=0x10+x_axis;
Line=63-Line;
}
if(y_loc>=48)
{
Column=0x00+x_axis;
Line=63-Line;
}
move = x_loc%16;
dot_data = 0x8000>>move;
table[x_axis][y_axis] = table[x_axis][y_axis]|dot_data;
dot_data = table[x_axis][y_axis];
delay(100);
first = dot_data/256;
second = dot_data%256;
delay(200);
wr_lcd (comm,0x34);
wr_lcd (comm,0x80+Line);
wr_lcd (comm,0x80+Column);
wr_lcd (comm,0x30);
wr_lcd (dat,first);
wr_lcd (dat,second);
wr_lcd (comm,0x36);
delay(200);
}
void Line(uchar x1,uchar y1,uchar x2,uchar y2)
{
uchar i,x,y;
float y_add;
x=x2-x1;
y=y2-y1;
if(x==0)
{
if(y>0)
{ for(i=0;i<y;i++)
Locat_Dot(x1,y1+i);
}
else if(y==0)
Locat_Dot(x1,y1);
else
{ for(i=y;i<0;i++)
Locat_Dot(x1,y1+i);
}
}
else
y_add = y*1.000/x;
if(x>0)
{
if(y_add <=1&&y_add>=-1)
{
for(i=0;i<x;i++)
{ y=y1+y_add*i;
Locat_Dot(x1+i,y);
}
}
else
{
if(y>0)
{
for(i=0;i<y;i++)
{ x=x1+i/y_add;
Locat_Dot(x,y1+i);
}
}
else if(y==0)
{ for(i=0;i<x;i++)
Locat_Dot(x1+i,y1);
}
else
{
for(i=y;i<0;i++)
{ x=x1+i/y_add;
Locat_Dot(x,y1+i);
}
}
}
}
else if(x<0)
{
if(y_add <=1&&y_add>=-1)
{
for(i=x;i<0;i++)
{ y=y1+y_add*i;
Locat_Dot(x1+i,y);
}
}
else
{
if(y>0)
{
for(i=0;i<y;i++)
{ x=x1+i/y_add;
Locat_Dot(x,y1+i);
}
}
else if(y==0)
{ for(i=x;i<0;i++)
Locat_Dot(x1+i,y1);
}
else
{
for(i=y;i<0;i++)
{ x=x1+i/y_add;
Locat_Dot(x,y1+i);
}
}
}
}
delay(200);
}
/*------------------初始化-----------------*/
void init_lcd (void)
{
P3=P3|0x10; //RST
delay(20);
P3=P3&0xf7; //PSB=0;串行,P3.3=0
delay(20);
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
delay (100);
wr_lcd (comm,0x06); /*光标的移动方向*/
wr_lcd (comm,0x0c); /*开显示,关游标*/
delay(200);
}
/*---------------显示汉字或字符----------------*/
void character_dis(uchar code *chn)
{
uchar i,j;
wr_lcd (comm,0x30);
wr_lcd (comm,0x80);
for (j=0;j<4;j++)
{
for (i=0;i<16;i++)
wr_lcd (dat,chn[j*16+i]);
}
}
/*-----------上半屏显示汉字或字符------------*/
void upper_display (uchar code *chn)
{
uchar i,j;
wr_lcd (comm,0x30);
wr_lcd (comm,0x80);
j=0;
for (i=0;i<16;i++)
wr_lcd (dat,chn[j*16+i]);
wr_lcd (comm,0x90);
j=1;
for (i=0;i<16;i++)
wr_lcd (dat,chn[j*16+i]);
}
/*----------------显示图形-----------------*/
void graph (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,0x80+j);
wr_lcd (comm,0x80+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,0x80+j-32);
wr_lcd (comm,0x88+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 down_graph (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,0x80+j);
wr_lcd (comm,0x88+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 lattice_disp (uchar data1,uchar data2)
{
uchar i,j,k,x;
x=0x80;
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,0x80+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,0x80+j*2+1);
wr_lcd (comm,x+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data2);
wr_lcd (dat,data2);
}
}
x=0x88;
}
wr_lcd (comm,0x36);
delay(200);
}
/*-----------------------------------------------*/
//当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 clr_ddram (void)
{
wr_lcd (comm,0x30);
wr_lcd (comm,0x01);
delay (180);
}
/*--------------清GDRAM------------------*/
void clr_gdram (void)
{
lattice_disp(0x00,0x00);
delay(200);
}
/*
void Clr_gdram(void)
{
uchar x,y;
wr_lcd (comm,0x34); //开启扩充指令集 并关绘图显示
for(y=0;y<32;y++)
{
wr_lcd (comm,y+0x80); //行地址
wr_lcd (comm,0x80); //列地址
for(x=0;x<16;x++)
{
wr_lcd (dat,0x00);
wr_lcd (dat,0x00);
}
}
wr_lcd (comm,0x36); //开绘图显示
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -