繪圖型LCD 控制 |
答題得分者是:DavidLo
|
現在想見妳
一般會員 ![]() ![]() 發表:3 回覆:11 積分:2 註冊:2009-08-20 發送簡訊給我 |
今天拿到一個繪圖型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); } 我本來是想很簡單的先秀出一條直線,但是好像出了問題, 我有翻過書上的資料,可是找不到128*128的, 雖然有比較小型的LCD的範例,但是我改來改去就是不知道問題出在哪, 希望有相關經驗的可以指導一下。 **************************************** 我參考了128*64的範例,可是我發現,變成128*128以後,有一些LCD的指令是不是有修正, 然後我又發現128*64的在接腳上還有兩支可以控制左半面跟右半面的顯示,可是我拿到的繪圖LCD好像沒有那兩支 可以控制左右面的腳位,這是不是說原本的腳位會有更多的控制功能?原本的好像會有CS1跟CS2(正確名字不記得), 可以控制左右,怎麼變大以後變的不知道該如何處理。 有人可以指導我嗎??? |
ererer40
初階會員 ![]() ![]() 發表:37 回覆:91 積分:45 註冊:2008-05-02 發送簡訊給我 |
|
阿信
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
你好:
繪圖型的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 發送簡訊給我 |
|
DavidLo
高階會員 ![]() ![]() ![]() ![]() 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
|
現在想見妳
一般會員 ![]() ![]() 發表:3 回覆:11 積分:2 註冊:2009-08-20 發送簡訊給我 |
[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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |