/*寫命令到LCD中*/
void SendCommandToLCD(uchar com)
{
CheckState();//狀態檢查,LCD是否忙
RS=0; //向LCD發送命令。RS=0寫指令,RS=1寫數據
RW=0;//R/W=“L” ,E=“H→L”數據被寫到 IR 或 DR
DATA=com; //com :命令
EN=1;//EN下降源
_nop_();
_nop_();
EN=0;
}
/*設置頁 0xb8是頁的首地址*/
void SetLine(uchar page)
{
page=0xb8|page; //1011 1xxx 0<=page<=7 設定頁地址--X 0-7,8行為一頁64/8=8,共8頁
SendCommandToLCD(page);
}
/*設定顯示開始行,0xc0是行的首地址*/
void SetStartLine(uchar startline)
{
startline=0xc0|startline; //1100 0000
SendCommandToLCD(startline); //設置從哪行開始:0--63,一般從0 行開始顯示
}
/*設定列地址--Y 0-63 ,0x40是列的首地址*/
void SetColumn(uchar column)
{
column=column &0x3f; //column最大值為64,越出 0=<column<=63
column= 0x40|column; //01xx xxxx
SendCommandToLCD(column);
}
/*開關顯示,0x3f是開顯示,0x3e是關顯示*/
void SetOnOff(uchar onoff)
{
onoff=0x3e|onoff; //0011 111x,onoff只能為0或者1
SendCommandToLCD(onoff);
}
/*寫顯示數據 */
void WriteByte(uchar dat)
{
CheckState();//狀態檢查,LCD是否忙
RS=1; //RS=0寫指令,RS=1寫數據
RW=0;////R/W=“L” ,E=“H→L”數據被寫到 IR 或 DR
DATA=dat;//dat:顯示數據
EN=1; //EN下降源
_nop_();
_nop_();
EN=0;
}
/*選擇屏幕screen: 0-全屏,1-左屏,2-右屏*/
void SelectScreen(uchar screen)
{
switch(screen)
{ case 0: cs1=0;//全屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
case 1: cs1=0;//左屏
_nop_(); _nop_(); _nop_();
cs2=1;
_nop_(); _nop_(); _nop_();
break;
case 2: cs1=1;//右屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
}
}
/*清屏screen: 0-全屏,1-左屏,2-右*/
void ClearScreen(uchar screen)
{
uchar i,j;
SelectScreen(screen);
for(i=0;i<8;i++) //控制頁數0-7,共8頁
{
SetLine(i);
SetColumn(0);
for(j=0;j<64;j++) //控制列數0-63,共64列
{
WriteByte(0x00); //寫點內容,列地址自動加1
}
}
}
/*延時程序*/
void delay(uint z)
{
uint i,j;
for(i=0; i<z; i++)
for(j = 0; j < 110; j++);
}
/*初始化LCD*/
void InitLCD()
{
CheckState();
SelectScreen(0);
SetOnOff(0); //關顯示
SelectScreen(0);
SetOnOff(1); //開顯示
SelectScreen(0);
ClearScreen(0);//清屏
SetStartLine(0); //開始行:0
}
void GUI_Point(uchar x,uchar y,uchar flag)
{
uchar x_Dyte,x_byte; //定義列地址的字節位,及在字節中的哪1位
uchar y_Dyte,y_byte; //定義為上下兩個屏(取值為0,1),行地址(取值為0~31)
uchar GDRAM_hbit;
uchar GDRAM_lbit;
uchar shuju;
/***X,Y坐標互換,即普通的X,Y坐標***/
x_Dyte=y/16; //計算在16個字節中的哪一個
x_byte=y&0x0f; //計算在該字節中的哪一位
y_Dyte=x/32; //0為上半屏,1為下半屏
y_byte=x&0x1f; //計算在0~31當中的哪一行
GDRAM_hbit=shuju&0xF0; //讀取當前顯示高8位數據
GDRAM_lbit=shuju&0x0F; //讀取當前顯示低8位數據
_nop_();
_nop_();
_nop_();
if(flag==1)
{
SetStartLine(0x80+y_byte); //設定行地址(y坐標)
SetColumn(0x80+x_Dyte); //設定列地址(x坐標)
if(y_Dyte<32)
{
SelectScreen(2);
}
else
{
SelectScreen(0);
}
if(x_byte<8) //判斷其在高8位,還是在低8位
{
WriteByte(GDRAM_hbit|(0X01<<(7-x_byte))); //顯示GDRAM區高8位數據
WriteByte(GDRAM_lbit); //顯示GDRAM區低8位數據
}
else
{
WriteByte(GDRAM_hbit);
WriteByte(GDRAM_lbit|(0x01<<(15-x_byte)));
}
}
else
{
WriteByte(0x00); //清除GDRAM區高8位數據
WriteByte(0x00); //清除GDRAM區低8位數據
}
}
/**********讀取當前地址的LCD顯示數據**********/
void Read_data()
{
uchar shuju;
RS=1; // D/I=1,代表數據
RW=1; // R/W=1.讀取
delay(10);
EN=1;
delay(100);
shuju=DATA; //讀取當前顯示的數據
_nop_();
EN=0;
return;
}
void hualinex(uchar x0,uchar x1,uchar y,uchar flag)
{
uchar temp;
if(x0>x1)
{
temp=x1;
x1=x0;
x0=temp;
}
for(;x0<=x1;x0++)
GUI_Point(x0, y,flag);
}
/*主函數*/
void main()
{
InitLCD();//初始12864
ClearScreen(0);
SetStartLine(0);//顯示開始行
while(1)
{
hualinex(0,127,0,1);
}
}