#include "config.h"
void delayus(uint t)
{
uint i;
for(i=0;i<t;i++);
}
void LCD12864_CheckBusy()
{
uchar BusyFlag,num;
num=10;
LCD128_RS=0;
LCD128_RW=1;
delayus(10);
BusyFlag=LCDdat&0x80;
LCD128_EN=0;
while(BusyFlag && (num--));
}
void TransferData(uchar dat,uchar mode)
{
LCD12864_CheckBusy();
LCD128_RS=mode;
LCD128_RW=0;
delayus(1);
LCDdat=dat;
LCD128_EN=1;
delayus(1);
LCD128_EN=0;
}
uchar LCD12864_RecData()
{
uchar temp;
LCD12864_CheckBusy();
LCD128_RS=1;
LCD128_RW=1;
LCD128_EN=1;
temp=LCDdat;
LCD128_EN=0;
return (temp);
}
void LCD12864_SetPos(uchar x,uchar y)
{
if (y>=64) {CS2=0;CS1=1;y=y-64;} //右屏显示
else {CS2=1;CS1=0;} //左屏显示
TransferData((0x40 | y),WrCom);
TransferData((0xb8 | x),WrCom);
}
void LCD12864_Init()
{
TransferData(LCD_BASIC_FUNCTION,WrCom);
delayus(10);
TransferData(LCD_DISPLAY_SET,WrCom);
delayus(10);
TransferData(LCD_CLEAR_SCREEN,WrCom);
delayus(10);
TransferData(LCD_POSSHIFT_RIGHT,WrCom);
delayus(10);
}
void DisCh(uchar x,uchar y,uchar *p)
{
uchar i;
for(i=0;i<16;i++)
{
LCD12864_SetPos(2*x,16*y+i);
TransferData(p[i],WrDat);
LCD12864_SetPos(2*x+1,16*y+i);
TransferData(p[i+16],WrDat);
}
}
void SetLine(uchar line) //line ->0....7
{
line=line & 0x07; //max 7
line=line | 0xb8;
TransferData(line,WrCom);
}
void SetColum(uchar colum) //colum->0....63
{
colum=colum & 0x3f; //max 64
colum=colum | 0x40;
TransferData(colum,WrCom);
}
//以下程序为PROTEUS仿真,带字库的
/***********************
12864设定初始显示位置
X为行的数目
Y为列的数目
***********************/
void LCD12864_SetPoint(uchar X,uchar Y)
{
uchar pos;
TransferData(0x30,WrCom);
if (X==1){X=0x80;}
else if(X==2){X=0x90;}
else if(X==3){X=0x88;}
else if(X==4){X=0x98;}
pos=X+Y;
TransferData(pos,WrCom);
}
/*****************************************
设置图像显示模式
select=0时,关闭图形显示模式
Select=1时,开启图形显示模式
LCD_EXTEND_FUNCTION为 扩展指令集
LCD_GRAPH_ON 打开绘图模式命令
LCD_GRAPH_OFF 关闭绘图模式命令
******************************************/
void LCD12864_SetMode(unsigned char Select)
{
TransferData(LCD_EXTERND_FUNCTION,WrCom);
if(Select){TransferData(LCD_GRAPH_ON,WrCom);}
else {TransferData(LCD_GRAPH_OFF,WrCom);}
}
/*************************************
向LCD指定起始位置写入一个字符串
*************************************/
void LCD12864_DisplayString(unsigned char x,unsigned char y,unsigned char *Str)
{
if((y>4)||(x>8)) return;
LCD12864_SetPoint(x,y);
while(*Str>0)
{ TransferData(*Str,WrDat); Str++;}
}
/*********************************************
向LCD写入一个8位的ASCII码
以显示相应的字符
**********************************************/
void LCD12864_SendASCII(uchar hang,uchar lie,char sign)
{
LCD12864_SetPoint(hang,lie);
TransferData(sign,WrDat);
}
/***************************************
向LCD指定坐标写入一个象素,象素颜色有两种,
0代表白(无显示),1代表黑(有显示)
****************************************/
void LCD12864_WritePixel(unsigned char x,unsigned char y,unsigned char color)
{
unsigned char x_Dyte,y_Dyte,x_bite; //定义列地址的字节位,及在字节中的哪1位
unsigned char GDRAM_hbit,GDRAM_lbit; //定义为上下两个屏(取值为0,1),行地址(取值为0~31)
x_Dyte=x/16;
x_bite=x&0x0f;
if(y<32)
{
y_Dyte=y;
}
else
{
y_Dyte=y-32;
x_Dyte=x_Dyte+8;
}
TransferData(LCD_EXTERND_FUNCTION,WrCom);
TransferData(LCD_GRAPH_ON,WrCom);
TransferData(0x80+y_Dyte,WrCom);
TransferData(0x80+x_Dyte,WrCom);
LCD12864_RecData();
GDRAM_hbit=LCD12864_RecData();
GDRAM_lbit=LCD12864_RecData();
if(x_bite<8)
{
switch(color)
{
case 0 :GDRAM_hbit&=(~(1<<(7-x_bite)));break; //set 0
case 1 :GDRAM_hbit|=(1<<(7-x_bite)); break; //set 1
case 2 :GDRAM_hbit^=(1<<(7-x_bite)); break; //qufan
default :break;
}
}
else
{
switch(color)
{
case 0 :GDRAM_lbit&=(~(1<<(15-x_bite)));break;
case 1 :GDRAM_lbit|=(1<<(15-x_bite)); break;
case 2 :GDRAM_lbit^=(1<<(15-x_bite)); break;
default :break;
}
}
TransferData(0x80+y_Dyte,WrCom);
TransferData(0x80+x_Dyte,WrCom);
TransferData(GDRAM_hbit,WrCom);
TransferData(GDRAM_lbit,WrCom);
TransferData(LCD_EXTERND_FUNCTION,WrCom);
TransferData(LCD_GRAPH_OFF,WrCom);
}
/***********************************************************
函数名: disp_picture
函数说明: 显示一幅128*64的图画
传入参数:图形指针*img
传出参数:无
返回值: 无
**********************************************************/
void LCD12864_DisplayPicAll(unsigned char *img)
{
unsigned char i,j;
LCD12864_SetMode(1);
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
TransferData(0X34,WrCom);
TransferData(0x80+j,WrCom);
TransferData(0x80+i,WrCom);
TransferData(0X30,WrCom);
TransferData(img[j*16+i*2],WrDat);
TransferData(img[j*16+i*2+1],WrDat);
}
}
for(j=32;j<64;j++)
{
for(i=0;i<8;i++)
TransferData(0X34,WrCom);
TransferData(0x80+j-32,WrCom);
TransferData(0x80+i+8,WrCom);
TransferData(0X30,WrCom);
TransferData(img[j*16+i*2],WrDat);
TransferData(img[j*16+i*2+1],WrDat);
}
LCD12864_SetMode(1);
}
/***************************************
向LCD指定位置画一条长度为Length的指定颜色的水平线
****************************************/
void LCD12864_DrawLineH(unsigned char x,unsigned char y,unsigned char Length,unsigned char Color)
{
unsigned char count;
if(Length==0)return;
LCD12864_SetMode(0);
for(count=0;count<Length;count++)
{LCD12864_WritePixel(x+count,y,Color);}
LCD12864_SetMode(1);
}
/***************************************
向LCD指定位置画一条长度为Length的指定颜色的垂直线
****************************************/
void LCD12864_DrawLineV(unsigned char x,unsigned char y,unsigned char Length,unsigned char Color)
{
unsigned char count;
if(Length==0) return;
for(count=0;count<Length;count++)
{LCD12864_WritePixel(x,y+count,Color);}
}
|