/*Allen.H 2010-8-30*/
/*逐字顯示漢字*/
#i nclude <reg52.h>
#i nclude <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*TS12864A-3 端口定義*/
#define LCD_data P0 //數據口
sbit LCD_RS = P2^4; //寄存器選擇輸入
sbit LCD_RW = P2^5; //液晶讀/寫控制
sbit LCD_E = P2^6; //液晶並行使能控制
sbit LCD_PSB = P2^1; //串/並方式控制
uchar code dis1[] = {
"你好色彩日格科技" //寫英文字符的話一行寫16個
"我們的未來不是夢"
"讓世界更美好美麗"
"品質卓越至尊服務"
};
#define delayNOP(); {_nop_();_nop_();_nop_();};
void delay(int);
bit lcd_busy();
void lcd_init();
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar cmd);
void lcd_pos(uchar X,uchar Y);
/* 主程序 */
void main()
{
uchar i;
unsigned int j=0,k;
P0=0x00; //初始化數據口
lcd_init(); //初始化LCD
while(1)
{
i = 0;
delayNOP();
delayNOP();
delayNOP();
delayNOP();
delayNOP();
lcd_pos(0,0); //定位到第一行第一個字符地址
delay(15);//改變這個時間可以改變垂直方向的顯示,
//時間短就是動態顯示,四行同時顯示,時間不合適就會閃爍
for(j=0;j<16;j++) //顯示8個漢字,每個漢字兩個字符寬,
//若是英文的話,數組中一行輸入16個字符
{
lcd_wdat(dis1[i]);
i++;
for(k=25000;k>0;k--);//改變時間控制逐字輸出
}
lcd_pos(1,0);
delay(15);
for(j=16;j<32;j++)
{
lcd_wdat(dis1[i]);
i++;
for(k=25000;k>0;k--);
}
lcd_pos(2,0);
delay(15);
for(j=32;j<48;j++)
{
lcd_wdat(dis1[i]);
i++;
for(k=25000;k>0;k--);
}
lcd_pos(3,0);
delay(15);
for(j=48;j<64;j++)
{
lcd_wdat(dis1[i]);
i++;
for(k=25000;k>0;k--);
}
}
}
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++) //0.5ms
{
_nop_();
_nop_();
// _nop_();
// _nop_();
}
}
}
/*寫指令數據到LCD RS=L,RW=L,E=脈衝,D0-D7=指令碼。只有LCD_RS的值不同
故這個函數可以和下面的寫數據的函數寫到一起,用兩個參數,讀者自己改寫*/
void lcd_wcmd(uchar cmd)
{
LCD_RS = 0;//並行指令選擇打開
LCD_RW = 0;//寫
delayNOP();
delayNOP();
delayNOP();
// P0 = cmd;
LCD_E = 1;//打開並口
delayNOP();
_nop_();
P0 = cmd;
delayNOP();
delayNOP();
LCD_E = 0; //關閉並口 這個函數怎麼寫,完全參照時序圖去寫,
}
/*寫顯示數據到LCD RS=H,RW=L,E=脈衝,D0-D7=數據。*/
void lcd_wdat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
delayNOP();
delayNOP();
delayNOP();
//P0 = dat;
LCD_E = 1;
delayNOP();
_nop_();
P0 = dat;
delayNOP();
delayNOP();
LCD_E = 0;
}
/* LCD顯示漢字初始化設定,只設必須的,若顯示圖片初始化設定得另外設定 */
void lcd_init()
{
unsigned int i;
LCD_PSB = 1; //並口方式
lcd_wcmd(0x34); //擴充指令操作 0011xRGL R=1擴充指令G=0關閉繪圖顯示L=0
for(i=400;i>0;i--);
lcd_wcmd(0x30); //基本指令操作
for(i=400;i>0;i--);
lcd_wcmd(0x08); //睡眠模式
for(i=400;i>0;i--);
lcd_wcmd(0x0C); //顯示開,關光標00001DCB D=1整體顯示,C=0關光標,B=0關遊標位置
for(i=80;i>0;i--);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(20); //改變啓動時間長短
/* lcd_wcmd(0x02);
delay(5);
lcd_wcmd(0x80);
delay(5);*/
}
//設定顯示位置
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;} //參照12864PDF文檔設定
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos);
}