#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);}
}
|