//KS0180芯片128*64並口顯示液晶測試程序基於arduino平臺王進2014/9/27。
//如果程序很大,使用的ram芯片很小,可能就無法運行。如果不能運行,調用logo的部分可以刪除,這樣會大大減少RAM的使用。
//因為uno壞了,測試只在mega 2560成功。
//和ST7920芯片主要區別在於RAM地址的分配。註意RAM地址寫程序的分析。
//程序不使用庫文件,顯示程序不另外編寫子程序,主要是為了方便個人修改。
//////////////////////////////////////////////////////////////////////////////
//
int cs 1 = A0;//左半屏,高電平有效
int CS2 = a 1;//右半屏,高電平有效
int RS = 12;
int RW = 11;
int DB[] = {3,4,5,6,7,8,9,10 };//用數組定義總線需要的管腳DB 0-7。
int Enable = 2;
/////////////////////////////////////////////////////////////////////////
//位圖點陣數據表//
//內容是:南京周信電子,TEL025-66085988 //
//圖片尺寸:128 * 64 //
/////////////////////////////////////////////////////////////////////////
無符號字符標誌1[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
////////////////////////////////////////////////////////
//寫命令子程序
///////////////////////////////////////////////////////
void LcdCommandWrite(int value) {
digitalWrite(RS,0);
digitalWrite(RW,0);
int I = 0;
for(I = 3;我& lt= 10;I++) //總線分配
{
digitalWrite(i,value & amp01);//值和0001相給我。
值& gt& gt= 1;//值向右移動壹個位置。
}
digitalWrite(使能,1);
delayMicroseconds(1);
digitalWrite(使能,低電平);
delayMicroseconds(1);
}
//////////////////////////////////////////////////////
//寫數據子程序
/////////////////////////////////////////////////////
void LcdDataWrite(int value) {
//定義所有引腳
int I = 0;
digitalWrite(RS,1);
digitalWrite(RW,0);
//digitalWrite(DI,高);
//digitalWrite(RW,低);
for(I = DB[0];我& lt= DB[7];i++) {
digitalWrite(i,value & amp01);
值& gt& gt= 1;
}
digitalWrite(使能,高電平);
delayMicroseconds(1);
digitalWrite(使能,低電平);
delayMicroseconds(1);//延遲百萬分之壹秒
}
///////////////////////////////////////////////////
//輸出引腳聲明
//////////////////////////////////////////////////
無效設置(無效){
int I = 0;
for(I =啟用;我& lt= 12;i++) {
pinMode(i,輸出);
}
pinMode(A0,輸出);
pinMode(A1,輸出);
}
////////////////////////////////////////////
//循環主程序
/////////////////////////////////////////////////
無效循環(無效){
///////////////////////////////////////////////////////////////////////////////////////////
//初始化,因為KS0108芯片沒有初始化命令,需要給整個屏幕賦值0x00,否則會有雜點。
//找不到KS0108芯片的初始化命令,位圖調用總是有雜點,REST復位無法解決,所以采用了這種方法。
//////////////////////////////////////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
LCD command write(0x3e);//顯示關閉
int I = 0;
int yg,x,y;
內部溫度;
int tmp
for(yg = 0;yg & lt8;yg++)
{
x = yg+0x b8;//0xb8是家庭地址。
y = 0x40//0x40是第壹列地址。註意分析規範的RAM地址分布圖。
LcdCommandWrite(x);//寫入Y軸坐標
LcdCommandWrite(y);//寫入X軸坐標
tmp = yg * 64
for(I = 0;我& lt64;i++)
{
lcddata write(0x 00);
tmp++;
}
}
lcdcommandwite(0x3f);//顯示圖像
延時(1);
//////////////////////////////////////////////////////////
//顯示ZXET徽標
///////////////////////////////////////////////////////////
digitalWrite(CS1,1);//先顯示左半屏。
digitalWrite(CS2,0);
for(yg = 0;yg & lt8;yg++)
{
x = yg+0x b8;
y = 0x40
LcdCommandWrite(x);//寫入Y軸坐標
LcdCommandWrite(y);//寫入X軸坐標
tmp = 2 * yg * 64
for(I = 0;我& lt64;i++)
{
lcddata write(logo[tmp]);
tmp++;
}
}
lcdcommandwite(0x3f);//這裏直接連接右半屏顯示程序,沒有延遲。
////////////////////////
digitalWrite(CS1,0);//顯示右半邊屏幕
digitalWrite(CS2,1);
for(yg = 0;yg & lt8;yg++)
{
x = yg+0x b8;
y = 0x40
LcdCommandWrite(x);//寫入Y軸坐標
LcdCommandWrite(y);//寫入X軸坐標
tmp =(2 * yg+1)* 64;
for(I = 0;我& lt64;i++)
{
lcddata write(logo[tmp]);
tmp++;
}
}
lcdcommandwite(0x3f);
延時(3000);
///////////////////////////////////////////////////////////////
//顯示文本,還是用位圖數據調用,KS0108無字庫只能采用這種方法。
///////////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,0);
for(yg = 0;yg & lt8;yg++)
{
x = yg+0x b8;
y = 0x40
LcdCommandWrite(x);//寫入Y軸坐標
LcdCommandWrite(y);//寫入X軸坐標
tmp = 2 * yg * 64
for(I = 0;我& lt64;i++)
{
lcddata write(logo 1[tmp]);
tmp++;
}
}
lcdcommandwite(0x3f);
//////////////////////////////////////
digitalWrite(CS1,0);
digitalWrite(CS2,1);
for(yg = 0;yg & lt8;yg++)
{
x = yg+0x b8;
y = 0x40
LcdCommandWrite(x);//寫入Y軸坐標
LcdCommandWrite(y);//寫入X軸坐標
tmp =(2 * yg+1)* 64;
for(I = 0;我& lt64;i++)
{
lcddata write(logo 1[tmp]);
tmp++;
}
}
lcdcommandwite(0x3f);
延時(3000);
///////////////////////////////////////////////////////
//測試屏幕:全黑
////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
for(yg = 0;yg & lt8;yg++)
{
x = yg+0x b8;
y = 0x40
LcdCommandWrite(x);//寫入Y軸坐標
LcdCommandWrite(y);//寫入X軸坐標
for(I = 0;我& lt64;i++)
{
lcddata write(0x ff);
}
}
lcdcommandwite(0x3f);
延時(3000);
///////////////////////////////////////////////////////
//測試屏幕:全白
////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
for(yg = 0;yg & lt8;yg++)
{
x = yg+0x b8;
y = 0x40
LcdCommandWrite(x);//寫入Y軸坐標
LcdCommandWrite(y);//寫入X軸坐標
for(I = 0;我& lt64;i++)
{
lcddata write(0x 00);
}
}
lcdcommandwite(0x3f);
延時(3000);
///////////////////////////////////////////////////////
//測試屏幕:條紋數
////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
for(yg = 0;yg & lt8;yg++)
{
x = yg+0x b8;
for(I = 0;我& lt32;i++)
{
y = 0x 40+2 * I;
LcdCommandWrite(x);//寫入Y軸坐標
LcdCommandWrite(y);//寫入X軸坐標
lcddata write(0x ff);
}
}
lcdcommandwite(0x3f);
延時(3000);
}