//基於arduino 平臺的KS0180芯片128*64並口顯示LCD測試程序by 王瑾 2014/9/27
//程序較大使用小RAM芯片可能無法運行,如無法運行可將調用logo部分刪除,會大幅減小RAM使用
//因為uno 壞了只在mega 2560測試成功
//和ST7920芯片主要是RAM地址的分布不同註意分析RAM地址寫程序
//程序沒有采用庫文件,顯示程序也沒有另寫子程序,主要是為了個人修改方便
//////////////////////////////////////////////////////////////////////////////
//
int CS1=A0;//左半屏,高電平有效
int CS2=A1;//右半屏,高電平有效
int RS = 12;
int RW = 11;
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用數組來定義總線需要的管腳DB 0-7
int Enable = 2;
/////////////////////////////////////////////////////////////////////////
// Bitmap點陣數據表 //
// 內容為:南京舟芯電子,TEL025-66085988 //
// 圖片尺寸: 128 * 64 //
/////////////////////////////////////////////////////////////////////////
unsigned char logo1[] =
{
0x00,0x00,0x00,0x00,0x00,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; i <= 10; i++) //總線賦值
{
digitalWrite(i,value & 01);//value與0001相與賦予i
value >>= 1;//value右移壹位
}
digitalWrite(Enable,1);
delayMicroseconds(1);
digitalWrite(Enable,LOW);
delayMicroseconds(1);
}
//////////////////////////////////////////////////////
//寫數據子程序
/////////////////////////////////////////////////////
void LcdDataWrite(int value) {
// 定義所有引腳
int i = 0;
digitalWrite(RS, 1);
digitalWrite(RW, 0);
//digitalWrite(DI, HIGH);
//digitalWrite(RW, LOW);
for (i=DB[0]; i <= DB[7]; i++) {
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,HIGH);
delayMicroseconds(1);
digitalWrite(Enable,LOW);
delayMicroseconds(1); // 延時百萬分之壹秒
}
///////////////////////////////////////////////////
//輸出引腳聲明
//////////////////////////////////////////////////
void setup (void) {
int i = 0;
for (i=Enable; i <= 12; i++) {
pinMode(i,OUTPUT);
}
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
}
////////////////////////////////////////////
//循環主程序
/////////////////////////////////////////////////
void loop (void) {
///////////////////////////////////////////////////////////////////////////////////////////
//初始化,因為KS0108芯片無初始化命令需要對整個屏幕賦值0x00, 不然的話會有雜點
//沒有查到KS0108芯片的始化命令,位圖調用壹直有雜點,采用REST復位也不能解決,所以采用此方法
//////////////////////////////////////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
LcdCommandWrite(0x3e); // 顯示關
int i = 0;
int yg,x,y;
int temp;
int tmp;
for(yg=0;yg<8;yg++)
{
x=yg+0xb8; //0xb8為首頁地址
y=0x40; //0x40為首列地址註意分析規格書RAM地址分布圖
LcdCommandWrite(x); //寫入y軸坐標
LcdCommandWrite(y); //寫入x軸坐標
tmp=yg*64;
for(i=0;i<64;i++)
{
LcdDataWrite(0x00);
tmp++;
}
}
LcdCommandWrite(0x3f); //顯示圖象
delay(1);
//////////////////////////////////////////////////////////
//顯示ZXET logo
///////////////////////////////////////////////////////////
digitalWrite(CS1,1); //先顯示左半屏
digitalWrite(CS2,0);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //寫入y軸坐標
LcdCommandWrite(y); //寫入x軸坐標
tmp=2*yg*64;
for(i=0;i<64;i++)
{
LcdDataWrite(logo[tmp]);
tmp++;
}
}
LcdCommandWrite(0x3f); //此處無需延遲直接接右半屏顯示程序
////////////////////////
digitalWrite(CS1,0); //顯示右半屏
digitalWrite(CS2,1);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //寫入y軸坐標
LcdCommandWrite(y); //寫入x軸坐標
tmp=(2*yg+1)*64;
for(i=0;i<64;i++)
{
LcdDataWrite(logo[tmp]);
tmp++;
}
}
LcdCommandWrite(0x3f);
delay(3000);
///////////////////////////////////////////////////////////////
//顯示 文字,依然采用位圖數據調用,KS0108無字庫只能采用這種辦法
///////////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,0);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //寫入y軸坐標
LcdCommandWrite(y); //寫入x軸坐標
tmp=2*yg*64;
for(i=0;i<64;i++)
{
LcdDataWrite(logo1[tmp]);
tmp++;
}
}
LcdCommandWrite(0x3f);
//////////////////////////////////////
digitalWrite(CS1,0);
digitalWrite(CS2,1);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //寫入y軸坐標
LcdCommandWrite(y); //寫入x軸坐標
tmp=(2*yg+1)*64;
for(i=0;i<64;i++)
{
LcdDataWrite(logo1[tmp]);
tmp++;
}
}
LcdCommandWrite(0x3f);
delay(3000);
///////////////////////////////////////////////////////
//測試畫面 :全黑
////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //寫入y軸坐標
LcdCommandWrite(y); //寫入x軸坐標
for(i=0;i<64;i++)
{
LcdDataWrite(0xFF);
}
}
LcdCommandWrite(0x3f);
delay(3000);
///////////////////////////////////////////////////////
//測試畫面 :全白
////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //寫入y軸坐標
LcdCommandWrite(y); //寫入x軸坐標
for(i=0;i<64;i++)
{
LcdDataWrite(0x00);
}
}
LcdCommandWrite(0x3f);
delay(3000);
///////////////////////////////////////////////////////
//測試畫面 :數條紋
////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
for(i=0;i<32;i++)
{
y=0x40+2*i;
LcdCommandWrite(x); //寫入y軸坐標
LcdCommandWrite(y); //寫入x軸坐標
LcdDataWrite(0xFF);
}
}
LcdCommandWrite(0x3f);
delay(3000);
}