全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4050
推到 Plurk!
推到 Facebook!

繪圖型LCD 控制

答題得分者是:DavidLo
現在想見妳
一般會員


發表:3
回覆:11
積分:2
註冊:2009-08-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-20 16:25:31 IP:163.21.xxx.xxx 訂閱
今天拿到一個繪圖型LCD是128*128的,但是我現在不知道如何去控制它,
附上它的datasheet,
www.alldatasheet.com/datasheet-pdf/pdf/107006/ETC/WG128128A.html
希望有人可以交我用89S51去控制它讓它顯示出任何圖形或文字都好,
我是用keil C寫程式的,也希望可以分享一下簡單的程式碼也好,
一起來討論一下。

新手上路!


[code cpp]
#include
//************************************************************
#define DATA P1
sbit LCDWR = P2^0;
sbit LCDRD = P2^1;
sbit EN = P2^2;
sbit cdivided = P2^3;
sbit Reset = P2^4;
//************************************************************
void LCD_init(void);
void LCD_display(int PB);
void LCD_Reset(void);
void writecmd(int c);
void LCD_Busy(void);
void delay_10m(unsigned int dly);
void writedata(int d);
//************************************************************
void LCD_init(void)
{
LCD_Reset();
writecmd(0xc0);
LCD_display(0);
delay_10m(1);
LCD_display(1);
}
//************************************************************
void LCD_display(int PB)
{
PB = 0x3e PB;
writecmd(PB);
}
//************************************************************
void LCD_Reset(void)
{
Reset = 0;
delay_10m(1);
Reset = 1;
delay_10m(1);
}
//************************************************************
void writecmd(int c)
{
LCD_Busy();
LCDWR = 0;
cdivided = 1;
DATA = c;
EN = 1;
delay_10m(1);
EN = 0;
}
//************************************************************
void writedata(int d)
{
LCD_Busy();
LCDWR = 0;
cdivided = 0;
DATA = d;
EN = 1;
delay_10m(1);
EN = 0;
}
//************************************************************
void LCD_Busy(void)
{
int status;
DATA = 0xff;
cdivided = 1;
LCDRD = 0;

do
{
status = DATA;
EN = 0;
}while( status & 0x80 );
}
//************************************************************
void delay_10m(unsigned int dly)
{
int count;
while( dly != 0 )
{
count=23040/10;
while( count > 0 )
{
count--;
}
dly--;
}
}
//************************************************************
main()
{
int i;
LCD_init();
writecmd( 0x3f );
writecmd( 0xb8 0 );
writecmd( 0x40 0 );

for( i = 0; i < 64; i )
{
writedata(0xAA);
delay_10m(10);
}
while(1);

}
[/code]

我本來是想很簡單的先秀出一條直線,但是好像出了問題,
我有翻過書上的資料,可是找不到128*128的,
雖然有比較小型的LCD的範例,但是我改來改去就是不知道問題出在哪,
希望有相關經驗的可以指導一下。
****************************************
我參考了128*64的範例,可是我發現,變成128*128以後,有一些LCD的指令是不是有修正,
然後我又發現128*64的在接腳上還有兩支可以控制左半面跟右半面的顯示,可是我拿到的繪圖LCD好像沒有那兩支
可以控制左右面的腳位,這是不是說原本的腳位會有更多的控制功能?原本的好像會有CS1跟CS2(正確名字不記得),
可以控制左右,怎麼變大以後變的不知道該如何處理。

有人可以指導我嗎???
編輯記錄
現在想見妳 重新編輯於 2009-08-20 16:29:54, 註解 無‧
現在想見妳 重新編輯於 2009-08-20 22:21:51, 註解 無‧
現在想見妳 重新編輯於 2009-08-21 18:45:55, 註解 無‧
現在想見妳 重新編輯於 2009-08-21 21:38:43, 註解 無‧
ererer40
初階會員


發表:37
回覆:91
積分:45
註冊:2008-05-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-20 16:55:32 IP:60.248.xxx.xxx 訂閱
一般書都會寫LCD1602來當範例,你可以先參考看看,用法其實都差不多
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-24 14:55:01 IP:114.32.xxx.xxx 訂閱
你好:

繪圖型的LCD各家做的規格都不一樣,
查了一下,它的控制IC是使用T6963C。

在google找T6963C

第一項即是資料手冊。
http://home.comet.bg/datasheets/LCD Grafical/T6963c.pdf
內有控制方法及組合語言範例程式

第二項是英文的使用說明
http://homepages.tesco.net/~steve.lawther/steve/t6963c.htm
有詳細腳位說明Module Pin-out、參考電路圖The Circuit Diagram、
PIC參考程式Beta of the test S/W (ver 0.1)、
軟體撰寫教學My interpretation of the T6963 data sheet等,
其中「軟體撰寫教學」應該是你最需要的。

阿信~
現在想見妳
一般會員


發表:3
回覆:11
積分:2
註冊:2009-08-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-25 18:20:16 IP:163.21.xxx.xxx 訂閱
我現在換成128*64的,可以麻煩一下幫我檢查我的程式到底哪裡出了問題,
LCD的型號是LMG-SSC12A64,我燒入完程式以後,
螢幕是出現閃爍的一條線,而且不是很清楚,
偶而才會出現那一條線,我不知道哪裡出了問題,
麻煩大家幫我檢查一下。
編輯記錄
現在想見妳 重新編輯於 2009-08-27 17:00:42, 註解 無‧
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-26 01:04:26 IP:218.169.xxx.xxx 訂閱
  1. Good Day!
  2. void Set_xy(unsigned char x,unsigned char y)
  3. {
  4. x = 0xb8; <-- x range 0 ~ 7
  5. y = 0x40; <-- y range 0~63
  6. writecmd(x,1,1);
  7. writecmd(y,1,1);
  8. }
0xb8,0x40顛倒吧!
現在想見妳
一般會員


發表:3
回覆:11
積分:2
註冊:2009-08-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-08-27 16:59:49 IP:163.21.xxx.xxx 訂閱

[code cpp]
#include
//************************************************************
sfr DATA = 0x90;
sbit DdivideI = P2^0;
sbit LCDRW = P2^1;
sbit EN = P2^2;
sbit CS1 = P2^3;
sbit CS2 = P2^4;
sbit Reset = P2^5;
//************************************************************
void LCD_init(void);
void LCD_display(unsigned char PB);
void LCD_Reset(void);
void writecmd(unsigned char c,unsigned char cs1,unsigned char cs2);
void writedata(unsigned char d,unsigned char cs1,unsigned char cs2);
void LCD_Busy(void);
void startline(unsigned char s);
void Set_xy(unsigned char x,unsigned char y);
void LCD_RL(unsigned char xx,unsigned char yy,unsigned char dat);
void delay_10m(unsigned int dly);
//************************************************************
unsigned char seven0[] =
{
0x00,0x00, 0x7d,0x54, 0x25,0x54, 0x25,0x54, 0x7d,0x54, 0x44,0x10, 0x27,0xf8, 0x12,0xae,
0x4a,0xa8, 0x7f,0xf8, 0x01,0x20, 0x23,0xa0, 0x40,0x20, 0x3f,0xfe, 0x00,0x20, 0x00,0x00
};
unsigned char seven1[] =
{
0x00,0x00, 0x22,0x10, 0x42,0x10, 0x3f,0xfe, 0x01,0x10, 0x00,0x90, 0x00,0x00, 0x7f,0x3e,
0x29,0x48, 0x29,0x48, 0x29,0x48, 0x29,0x44, 0x29,0x44, 0x7f,0x44, 0x00,0x70, 0x00,0x00
};
unsigned char seven2[] =
{
0x00,0x00, 0x15,0x40, 0x13,0x48, 0x51,0x7e, 0x7d,0xc8, 0x0b,0x48, 0x09,0x70, 0x45,0x4c,
0x40,0x80, 0x20,0x60, 0x13,0x9e, 0x0c,0x10, 0x13,0x10, 0x20,0xf0, 0x40,0x10, 0x00,0x00
};
//************************************************************
void delay_10m(unsigned int dly)
{
int count;
while( dly != 0 )
{
count=23040/10;
while( count > 0 )
{
count--;
}
dly--;
}
}
//************************************************************
void LCD_init(void)
{
unsigned char i,j;
LCD_Reset();
startline(0);
LCD_display(0);
for( i = 0; i < 8; i )
{
for( j = 0; j < 128; j )
{
LCD_RL(j,i,0);// i = page j = y軸
}
}
LCD_display(1);
}
//************************************************************
void LCD_display(unsigned char PB)
{
PB = 0x3e PB;
writecmd(PB,1,1);
}
//************************************************************
void LCD_Reset(void)
{
Reset = 0;
delay_10m(1);
Reset = 1;
delay_10m(1);
}
//************************************************************
void writecmd(unsigned char c,unsigned char cs1,unsigned char cs2)
{
CS1 = cs1;
CS2 = cs2;
LCD_Busy();
DdivideI = 0;
LCDRW = 0;
DATA = c;
EN = 1;
EN = 0;
}
//************************************************************
void writedata(unsigned char d,unsigned char cs1,unsigned char cs2)
{
CS1 = cs1;
CS2 = cs2;
LCD_Busy();
DdivideI = 1;
LCDRW = 0;
DATA = d;
EN = 1;
EN = 0;
}
//************************************************************
void LCD_Busy(void)
{
unsigned char status;
DATA = 0xf0;

do
{
DdivideI = 0;
LCDRW = 1;
EN = 1;
status = DATA;
EN = 0;
}while( status & 0x80 );
}
//************************************************************
void startline(unsigned char s)
{
s = 0xc0 s;
writecmd(s,1,1);
}
//************************************************************
void Set_xy(unsigned char x,unsigned char y)
{
x = 0x40;
y = 0xb8;
writecmd(x,1,1);
writecmd(y,1,1);
}
//************************************************************
void LCD_RL(unsigned char xx,unsigned char yy,unsigned char dat) // xx = y yy = x
{
if( xx >= 64 )
{
Set_xy(xx-64,yy);
writedata(dat,0,1);
}
else
{
Set_xy(xx,yy);
writedata(dat,1,0);
}
}
//************************************************************
main()
{
int k,l,z=0;

LCD_init();

while(1)
{
for( k = 0; k < 16; k )
{
for( l = 0; l < 2; l )
{
LCD_RL(k,l,seven0[z]);
LCD_RL(k 16,l,seven0[z]);
LCD_RL(k 32,l,seven1[z]);
LCD_RL(k 48,l,seven2[z]);
z ;
}
}
if( z >= 32 )
{
z = 0;
}
}
}
//************************************************************

[/code]

我想問一下我這段程式碼哪裡出問題,LCD上面字幕顯示出來的字怪怪的,
一個字的大小是16*16,分成兩頁顯示(X=0,X=1),
可是我看LCD顯示的時候字體上頁跟下頁剛好差了一格,
第一頁往右歪掉一格,我以為是字體編碼錯誤,
可是如果我只顯示單一個字,是沒有錯的,所以想問一下哪裡出了問題?
拜託大家的幫幫忙。
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-27 23:02:11 IP:218.169.xxx.xxx 訂閱
  1. void Set_xy(unsigned char x,unsigned char y)
  2. {
  3. x = 0x40;
  4. y = 0xb8;
  5. writecmd(x,1,1); <--- writecmd(x,1,0);
  6. writecmd(y,1,1); <--- writecmd(y,1,0);
  7. }
試試看!

系統時間:2024-05-07 1:42:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!