請教各位老師,我由于對12864LCD顯示屏不太了解,最近搞了個12864顯示程序,為什么LCD里面只顯示"中國南京市雨花臺"為什么"區(qū)"自無顯示呢,應(yīng)該在第二行顯示才對.請各位老師指教,謝謝!
原程序如下:
#define RS RD2 //DI
#define RW RD3
#define E RD4
#define CS1 RD7
#define CS2 RD6
#define RST RD5
#define LED3 RC4
#define LED4 RC5
#define LED2 RD0
#define LED1 RD1
unsigned char PAGEADD; //存放頁地址寄存器
unsigned char PAGENUM; //存放總頁數(shù)寄存器
unsigned char CLMSUM; //存放總列數(shù)寄存器
unsigned char CLMADD; //存放列地址寄存器
unsigned char WRITE; //存放顯示數(shù)據(jù)寄存器
unsigned char row; //存放顯示起始行寄存器
unsigned char i,k; //通用寄存器
const char table[]=
{
/*-- 文字: 中 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00
/*-- 文字: 國 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00
/*-- 文字: 江 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x10,0x60,0x01,0xC6,0x30,0x00,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x00,0x00,
0x04,0x04,0x7E,0x01,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x00
/*-- 文字: 蘇 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x04,0x04,0x44,0x44,0x44,0x5F,0x44,0xF4,0x44,0x5F,0x44,0xC4,0x04,0x04,0x04,0x00,
0x00,0x40,0x4C,0x27,0x10,0x0C,0x07,0x01,0x20,0x40,0x40,0x3F,0x00,0x02,0x0C,0x00
/*-- 文字: 省 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x00,0x10,0x90,0x88,0x86,0xC0,0xC0,0xBF,0xA0,0x90,0x90,0x8A,0x84,0x18,0x00,0x00,
0x01,0x01,0x00,0x00,0xFF,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0xFF,0x00,0x00,0x00
/*-- 文字: 南 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x04,0x04,0xE4,0x24,0x24,0x64,0xB4,0x2F,0x24,0xA4,0x64,0x24,0x24,0xE6,0x04,0x00,
0x00,0x00,0x7F,0x04,0x05,0x05,0x05,0x7F,0x05,0x05,0x05,0x25,0x44,0x3F,0x00,0x00
/*-- 文字: 京 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x00,0x04,0x04,0xE4,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0xE4,0x06,0x04,0x00,0x00,
0x00,0x20,0x10,0x19,0x0D,0x41,0x81,0x7F,0x01,0x01,0x05,0x0D,0x38,0x10,0x00,0x00
/*-- 文字: 市 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x04,0x04,0x04,0xE4,0x24,0x24,0x25,0xFE,0x24,0x24,0x24,0x24,0xE4,0x04,0x04,0x00,
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF,0x00,0x00,0x10,0x20,0x1F,0x00,0x00,0x00
/*-- 文字: 雨 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x02,0x02,0xF2,0x32,0x52,0x92,0x12,0xFE,0x32,0x52,0x92,0x12,0xF2,0x02,0x02,0x00,
0x00,0x00,0xFF,0x01,0x02,0x04,0x00,0x7F,0x01,0x02,0x44,0x80,0x7F,0x00,0x00,0x00
/*-- 文字: 花 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x04,0x04,0x04,0x84,0xF4,0x2F,0x04,0x04,0xE4,0x0F,0x04,0xC4,0x84,0x04,0x04,0x00,
0x00,0x02,0x01,0x00,0xFF,0x00,0x08,0x04,0x3F,0x42,0x41,0x40,0x40,0x78,0x20,0x00
/*-- 文字: 臺 --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x00,0x00,0x40,0x60,0x50,0x48,0x44,0x63,0x22,0x20,0x20,0x28,0x70,0x20,0x00,0x00,
0x00,0x00,0x00,0x7F,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x00
/*-- 文字: 區(qū) --*/
/*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/
0x00,0xFE,0x02,0x02,0x12,0x22,0x22,0x42,0x82,0x62,0x1E,0x0A,0x02,0x02,0x00,0x00,
0x00,0x3F,0x20,0x30,0x28,0x24,0x22,0x21,0x20,0x21,0x26,0x3C,0x28,0x20,0x00,0x00
};
//****************************************************************
//延時程序(x*0.5ms)(1ms*93)
void delay(unsigned int x)
{
unsigned int j;
for(j=x*50;--j;)
continue;
}
//****************************************************************
//系統(tǒng)各口的輸入輸出狀態(tài)初始化子程序
void INITIAL()
{
//ADCON1=0X87; //設(shè)置PORTA口和PORTE口為數(shù)字I/O口
TRISC=0XCF;
TRISD=0X00;
TRISB=0X00;
//TRISE=0X00;
PORTD=0X00;
PORTC=0X00; //設(shè)置液晶的4個控制腳為輸出
RST=0; //Reset.
NOP();
delay(2);
RST=1;
NOP();
delay(2);
LED3=0;
LED4=0;
LED1=0;
LED2=0;
delay(2);
}
//*******************************************************************
//*******************E1邊的處理部分**********************************
//*******************************************************************
//*****************寫命令程序*******************************
void send_com1(unsigned char command )
{
delay(1);// check_busy1();
CS1=1; //左邊
CS2=0;
RS=0;
RW=0;
PORTB=command;
E =1;
NOP();
NOP();
E =0;
}
//***********對液晶顯示器寫數(shù)據(jù)子程序************************
void send_data1(unsigned char data )
{
delay(1); // check_busy1(); //查詢液晶是否為空閑
CS1=1; //左邊
CS2=0;
RS=1;
RW=0;
PORTB=data; //需要寫入的數(shù)據(jù)放入D口
E =1; //E1=0,寫入數(shù)據(jù)
NOP();
E =0;
}
//************E1邊清屏子程序***************************
void CLEAR1()
{
PAGEADD=0xB8; //設(shè)置頁地址代碼0頁
for(PAGENUM=0X08;PAGENUM>0;PAGENUM--) //8頁
{
send_com1(PAGEADD);
CLMADD=0x00; //設(shè)置起始列
for(CLMSUM=0X40;CLMSUM>0;CLMSUM--) //64列
{
send_data1(0x00); //寫入00H以清屏
}
PAGEADD++; //頁號增1
}
}
//************E1邊初始化**********************************
void lcd1()
{
send_com1(0XC0); //起始行0
send_com1(0X3F); //開顯示
CLEAR1(); //清屏
}
//*******************************************************************
//*******************E2邊的處理部分**********************************
//*******************************************************************
//*****************寫命令程序*******************************
void send_com2(unsigned char command )
{
delay(1); //check_busy2();
CS1=0; //右邊
CS2=1;
RS=0;
RW=0;
PORTB=command;
E =1;
NOP();
NOP();
E =0;
}
//***********對液晶顯示器寫數(shù)據(jù)子程序************************
void send_data2(unsigned char data )
{
delay(1); //check_busy2();
CS1=0; //右邊
CS2=1;
RS=1;
RW=0;
PORTB=data; //需要寫入的數(shù)據(jù)放入D口
E =1; //E1=0,寫入數(shù)據(jù)
NOP();
E =0;
}
//************E2邊清屏子程序************************
void CLEAR2()
{
PAGEADD=0xB8; //設(shè)置頁地址代碼0頁
for(PAGENUM=0X08;PAGENUM>0;PAGENUM--) //8頁
{
send_com2(PAGEADD);
CLMADD=0x40; //設(shè)置起始列0
for(CLMSUM=0X40;CLMSUM>0;CLMSUM--) //64列
{
send_data2(0x00); //寫入00H以清屏
}
PAGEADD++; //頁號增1
}
}
//************E2邊初始化**********************************
void lcd2()
{
send_com2(0XC0); //起始行0
send_com2(0X3F); //開顯示
CLEAR2(); //清屏
}
//******************************************************************
//******************************************************************
//LCD的E1邊顯示函數(shù),調(diào)用一次該函數(shù),則在相應(yīng)的位置顯示相應(yīng)的字
void dis1()
{
send_com1(CLMADD); //設(shè)置起始列
send_com1(PAGEADD);
i=i*32; //i變成數(shù)組指示指針
for(k=0;k<=16;k++)
{
WRITE=table[i+k]; //查得需要顯示的字節(jié)
send_data1(WRITE); //在WRITE1子程序里面,列地址加1
CLMADD++;
}
CLMADD=CLMADD-16;//恢復(fù)列地址
send_com1(CLMADD); //設(shè)置起始列
PAGEADD=PAGEADD+1;//頁地址加1
send_com1(PAGEADD);
for(;k<32;k++)
{
WRITE=table[i+k]; //查得需要顯示的字節(jié)
send_data1(WRITE); //列地址加1
}
}
//*******************************************************************
//LCD的E2邊顯示函數(shù),調(diào)用一次該函數(shù),則在相應(yīng)的位置顯示相應(yīng)的字
void dis2()
{
send_com2(CLMADD); //設(shè)置起始列
send_com2(PAGEADD);
i=i*32; //i變成數(shù)組指示指針
for(k=0;k<16;k++)
{
WRITE=table[i+k]; //查得需要顯示的字節(jié)
send_data2(WRITE); //列地址加1
CLMADD++;
}
CLMADD=CLMADD-16; //恢復(fù)列地址
send_com2(CLMADD); //設(shè)置起始列
PAGEADD=PAGEADD+1; //頁地址加1
send_com2(PAGEADD);
for(;k<32;k++)
{
WRITE=table[i+k]; //查得需要顯示的字節(jié)
send_data2(WRITE); //在WRITE1子程序里面,列地址已經(jīng)加1
}
}
//*************************************************************************
//*****************************主程序**************************************
//*************************************************************************
main()
{
INITIAL(); //系統(tǒng)初始化
lcd1(); //E1邊初始化
lcd2();
delay(20);
delay(10); //E2邊初始化
//******以下顯示不同的字符*************************************************
PAGEADD=0XB8; //顯示起始頁為第0頁
CLMADD=0X40; //起始列為第0列
i=0; //中//
dis1(); //調(diào)用顯示函數(shù)
PAGEADD=0XB8; //顯示起始頁為第0頁
CLMADD=0X50; //起始列為第16列
i=1; //國
dis1(); //調(diào)用顯示函數(shù)1
PAGEADD=0XB8; //顯示起始頁為第0頁
CLMADD=0X60; //起始列為第32列
i=2; //江
dis1(); //調(diào)用顯示函數(shù)1
PAGEADD=0XB8; //顯示起始頁為第0頁
CLMADD=0X70; //起始列為第0列
i=3; //蘇
dis1(); //調(diào)用顯示函數(shù)2
PAGEADD=0XB8; //顯示起始頁為第0頁
CLMADD=0X40; //起始列為第64列
i=4; //省
dis2(); //調(diào)用E2邊顯示函數(shù)
PAGEADD=0XB8; //顯示起始頁為第0頁
CLMADD=0X50; //起始列為第16列
i=5; //南
dis2(); //調(diào)用顯示函數(shù)2
PAGEADD=0XB8; //顯示起始頁為第0頁
CLMADD=0X60; //起始列為第32列
i=6; //京
dis2(); //調(diào)用顯示函數(shù)2
PAGEADD=0XB8; //顯示起始頁為第0頁
CLMADD=0X70; //起始列為第32列
i=7; //市
dis2(); //調(diào)用顯示函數(shù)2
PAGEADD=0XBA; //顯示起始頁為第0頁
CLMADD=0X40; //起始列為第32列
i=8; //雨
dis1(); //調(diào)用顯示函數(shù)2
PAGEADD=0XBA; //顯示起始頁為第0頁
CLMADD=0X50; //起始列為第32列
i=9; //花
dis1(); //調(diào)用顯示函數(shù)2
PAGEADD=0XBA; //顯示起始頁為第0頁
CLMADD=0X60; //起始列為第32列
i=10; //臺
dis1(); //調(diào)用顯示函數(shù)2
PAGEADD=0XBA; //顯示起始頁為第0頁
CLMADD=0X70; //起始列為第32列
i=11; //公
dis1(); //調(diào)用顯示函數(shù)2
PAGEADD=0XBA; //顯示起始頁為第0頁
CLMADD=0X40; //起始列為第32列
i=12; //區(qū)
dis2(); //調(diào)用顯示函數(shù)2
delay(2);
while(1)
{
LED1=1;
delay(20000);
delay(20000);
delay(20000);
delay(200000000000);
LED1=0;
}
}