12864串行传输,所有功能函数(包括绘图)

#include"delay.h"
#include"display.h"
#define uchar unsigned char
static char Miro_GDRAM[32][32];
char LCD_X,LCD_Y;
//清屏
void LCD_init(void)
{
delay_ms(100);
SET_LCD_PORT_DDR();
delay_ms(1);
CLE_Screen();
Write_Command(RE_ADDR);//显示地址归位
Write_Command(BASIC);//选择基本指令集
Write_Command(DISPLYAY_ON);//开显示
Write_Command(CURSOR_OFF);//光标关

}
//清屏
void CLE_Screen(void)
{
Write_Command(CLR_SCREEN);
delay_ms(7);
}
//
//向12864发送一个字节的数据
void Write_One_Date(unsigned char date)
{
unsigned char i;

SCLK_CLE;//时钟总线拉低
delay_us(1);
for(i=0;i<8;i++)//把数据送到线上去
{
if(date&0x80)
{SID_SET;}
else
{SID_CLE;}

delay_us(1);
SCLK_SET;//时钟总线拉高,数据传送给显示屏
delay_us(1);
SCLK_CLE;
delay_us(1);
date=date<<1;//高位先发
}
}

//发送命令
void Write_Command(unsigned char CMD)
{
CS_SET;
Write_One_Date(0xf8);//命令控制字
Write_One_Date(CMD&0xf0);//高位先发
Write_One_Date((CMD&0x0f)<<4);//低位转高
CS_CLE;
delay_us(90);

}

//发送一个字符
void Write_one_char(unsigned char dat)
{
CS_SET;
Write_One_Date(0xfa);
Write_One_Date(dat&0xf0);
Write_One_Date(dat<<4);
CS_CLE;
delay_us(90);
}
//在指定的位置显示一个字母
void Lcd_putsachar(unsigned char x,unsigned char y,char dat)
{
char addr;
switch(x)//计算显示的位置
{
case 0:
{addr=y+0x80;
break;
}
case 1:
{
addr=y+0x90;
break;
}
case 2:
{
addr=y+0x88;
break;
}
case 3:
{
addr=y+0x98;
break;
}
}
Write_Command(addr);//写地址到显示屏
Write_one_char(dat);//写数据
}
//从指定的位置开始显示汉字或字符
void Lcd_puts_any(unsigned char x,unsigned char y, char *p)
{
char addr,i;
switch(x)
{
case 0:
{addr=y+0x80;
break;
}
case 1:
{
addr=y+0x90;
break;
}
case 2:
{
addr=y+0x88;
break;
}
case 3:
{
addr=y+0x98;
break;
}
}
Write_Command(addr);
while(*p!='\0')//'\0'字符串结束标志
{
Write_one_char(*p);
p++;
}
}
//从LCD读取一个字节数据
char *Read_One_Date(void)
{
char i,*p;
char dat[30];
SET_READ_MODLE();//读数据模式
SCLK_CLE;
delay_us(1);
for(i=0;i<8;i++)
{
dat[i]=PORTE&8;
SCLK_SET;
delay_us(1);
SCLK_CLE;
delay_us(1);
}
p=dat;
return p;
}

//读取数据
Read_Date(void)
{
char *p1,*p2,i,s1=0,s2=0;
//CS_SET();
Write_One_Date(0xfc);//
p1=Read_One_Date();
p2=Read_One_Date();
for(i=0;i<8;i++)
{
s1+=*p1;
s2+=*p2;
p1++;
p2++;
}
return s1;
}

/* 不好使
//显示忙检测
Ckeck_busy(void)
{
char j;
CS_SET;
Write_One_Date(0xfc);
j=Read_Two_Date();
return(j);
CS_CLE;
}
*/

//写入绘图地址到lcd,先写的是Y坐标
void DRPIC_ready(void)
{
Write_Command(D

RPIC_OFF);//选择扩充指令集,关闭绘图

Write_Command(LCD_Y);
Write_Command(LCD_X);
Write_Command(BASIC);//使用基本指令集
}
//用于检测液晶屏是否有坏点
void Lcd_check(void)
{
char x,y;
for(x=0;x<16;x++)
for(y=0;y<32;y++)
{
LCD_Y=y+0x80; //行地址
LCD_X=x+0x80; //列地址
DRPIC_ready();
Write_one_char(0xff);
Write_one_char(0xff);
}
Write_Command(DRPIC_ON);
Write_Command(BASIC);
}
//清除GDRAM和Miro_GDRAM里的数据
void Lcd_clean(void)
{
char x,y;
char i,j;
for(x=0;x<16;x++)
for(y=0;y<32;y++)
{
LCD_Y=y+0x80; //行地址
LCD_X=x+0x80; //列地址
DRPIC_ready();
Write_one_char(0);//所有的寄存器都写了0
Write_one_char(0);
}
Write_Command(DRPIC_ON);
Write_Command(BASIC);
for(i=0;i<32;i++)
for(j=0;j<32;j++)
{Miro_GDRAM[i][j]=0;}

}


//将指定的坐标的点点亮
//
/*
void Draw_Point(unsigned char x,unsigned char y)
{
char l_r,point=0,X_dat=0,Y_dat=0;
char buffer_x;
buffer_x=x%128;
if(x/128>=1)
{
x=x-127;
Lcd_clean();
}

if(y>31)//竖直方向上Y属于上半部分
{
x=x/16+0x80;//计算x的区域,地址
y=63-y+0x80;//计算属于水平方向上的哪个行,地址
}
else
{
x=x/16+0x88;
y=31-y+0x80;
}

LCD_X=x;//0x81;
LCD_Y=y;//0x9f;
DRPIC_ready();
l_r=buffer_x%16;//判断左右哪个部分被点亮
{
if(l_r<7)//左部分
{
Y_dat=point|=(1<<(7-l_r));//由于是先发送的Y的地址
X_dat=0;
}
else//右部分
{
X_dat=point|=(1<<(15-l_r));
Y_dat=0;
}
}
Write_one_char(Y_dat);//写入这个横行中的那个点被点亮
Write_one_char(X_dat);
Write_Command(DRPIC_ON);
Write_Command(BASIC);
}
*/
Draw_Point(unsigned char x,unsigned char y)
{
char add_x,add_y;
char X_dat=0,Y_dat=0;
char buffer_x1,buffer_y1,buffer_x,buffer_y,buffer_x2,buffer_y2;
buffer_x2=buffer_x=buffer_x1=x;//缓存要写入的x与y
buffer_y2=buffer_y=buffer_y1=y;//
//写入绘图缓存
if(y<31)
{
y=31-y;
x=16+x/8;
buffer_x=7-buffer_x%8;
Miro_GDRAM[x][y]|=(1<}
else
{
y=62-y;
x=x/8;
buffer_x=7-buffer_x%8;
Miro_GDRAM[x][y]|=(1<}

//计算要写入目标的地址
if(buffer_y1>31)//竖直方向上Y属于上半部分
{
add_x=buffer_x1/16+0x80;//计算x的区域,地址
add_y=63-buffer_y1+0x80;//计算属于水平方向上的哪个行,地址
}
else
{
add_x=buffer_x1/16+0x88;
add_y=31-buffer_y1+0x80;
}

LCD_X=add_x;//0x81;
LCD_Y=add_y;//0x9f;

DRPIC_ready();//写入绘图地址到GDRAM

if((buffer_x2/8)%2==0)//判断写入的数据在该地址的左边还是右边
{
Y_dat=Miro_GDRAM[x][y];
X_dat=Miro_GDRAM[x+1][y];
}
else
{
Y_dat =Miro_GDRAM[x-1][y];
X_dat=Miro_GDRAM[x][y];
}



Write_one_char(Y_dat);//左半部


Write_one_char(X_dat);//右半部分

}

//画正方形
DrawRetic(uchar x0,uchar y0,uchar x1,uchar y1)//画正方形,x0,y0为左上角坐标,x1,y1为右下角坐标
{
uchar i;
for(i=0;i<=x1-x0;i++){ Draw_Point(x0+i,y0); Draw_Point(x0+i,y1); }
for(i=0;i<=y1-y0;i++){ Draw_Point(x0,y0+i); Draw_Point(x1,y0+i); }
}

/*void Draw_Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)
{ unsigned char d_x,d_y;
char x,y;
char buffer_x,buffer_y;
unsigned char i;
if((x1>x2)&&(y1>y2))
{

}
else if((x1y2))
{
buffer_x=x1;x1=x2;x2=buffer_x;
buffer_y=y1;y1=y2;y2=buffer_y;
}

{
if((x1{
d_x=x2-x1;
d_y=y2-y1;

}
}
}
*/
/*void Draw_Between(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)
{
char k;
k=(x1-x2)/(y1-y2);

y=(x-x1)/k;//得到曲线函数

}
*/

//绘制坐标轴,且带箭头横向分为16个小格,纵向分为8个小格
void Draw_str(void)
{
char i;
for(i=0;i<128;i++)
{
if(i<127)//不画最右下角的Y=1的点
if((i+1)%8==0)Draw_Point(i,1);
Draw_Point(i,0);
}
for(i=0;i<63;i++)
{
if(i<63)
if((i+1)%8==0)
Draw_Point(1,i);
Draw_Point(0,i);
}
Draw_Point(126,1);
Draw_Point(125,2);
Draw_Point(1,62);
Draw_Point(2,61);
Draw_Point(0,63);
}

相关文档
最新文档