Re: LCD顯示
|
||||
---|---|---|---|---|
資深會員
|
參照:
有人這麼說 http://www.goldenchip.com.cn/gdbbs/di ... melimit=&operator=&page=2
發表於: 2005/1/19 22:36
|
|||
|
Re: LCD顯示
|
||||
---|---|---|---|---|
資深會員
|
參照:
這兩天剛測過 #include <18F452.H> #fuses HS, NOPROTECT, NOWDT, NODEBUG, NOLVP, PUT #use delay(clock=20000000) #use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7) #include <xie_lcd.c> void main( ) { int8 x=0; delay_ms(500); set_adc_ports( NO_ANALOGS ); set_adc( ADC_OFF ); delay_ms(500); lcd_init(); printf("\r\nHello world !"); printf(lcd_putc,"Hello world ! "); while(1) { lcd_gotoxy(1,2); printf(lcd_putc,"x = %u ",x); printf("%u ",x++); delay_ms(500); output_toggle(PIN_A4); } } LCD 驅動程式 // xie_lcd.c // LCD_pin Wu Xie // -------------------------- // D4 B4 RA0 // D5 B5 RA1 // D6 B6 RA2 // D7 B7 RA3 // -- -- RA4 System LED always output // enable A5 RA5 // rw B2 RC0 // rs B1 RC5 // -------------------------- int1 lcd_fail = TRUE; // 2004/02/28 新增 struct { int8 data : 4; // Wu int8 unused: 2; } lcd; #byte lcd = 0xF80 // PORTA #bit lcd_enable = 0xF80.5 // PORTA.5 for lcd_enable #bit lcd_rw = 0xF8B.0 // LATC.0 #bit lcd_rs = 0xF8B.5 // LATC.5 #bit tris_lcd_enable= 0xF92.5 // TRISA5 #bit tris_lcd_rw = 0xF94.0 // TRISC0 #bit tris_lcd_rs = 0xF94.5 // TRISC5 void set_tris_to_read_lcd(void) { set_tris_a(0b11001111); tris_lcd_rw = 0; tris_lcd_rs = 0; } void set_tris_to_write_lcd(void) { set_tris_a(0b11000000); tris_lcd_rw = 0; tris_lcd_rs = 0; } #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines #define lcd_line_two 0x40 // LCD RAM address for the second line // The following bytes need to be sent to the LCD to start it up. int8 const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; int8 lcd_read_byte() { int8 low,high; set_tris_to_read_lcd(); // set_tris_b(LCD_READ); Wu lcd_rw = 1; delay_cycles(1); lcd_enable = 1; // lcd.enable = 1; Wu delay_cycles(1); high = lcd.data; lcd_enable = 0; delay_cycles(1); lcd_enable = 1; delay_us(1); low = lcd.data; lcd_enable = 0; set_tris_to_write_lcd(); // set_tris_b(LCD_WRITE); Wu return( (high<<4) | low); } void lcd_send_nibble( int8 n ) { lcd.data = n; delay_cycles(1); lcd_enable = 1; delay_us(2); lcd_enable = 0; } void lcd_send_byte( int8 address, int8 n ) { int8 i = 250; // 2004/02/28 set_tris_to_write_lcd(); // set_tris_lcd(LCD_WRITE); // Wu, 2003/07/03 lcd_rs = 0; while ( bit_test(lcd_read_byte(),7) ) { delay_us ( 6 ); // 2004/02/28 if ( --i == 0 ) { lcd_fail = TRUE; // 2004/02/28 break; } } lcd_rs = address; delay_cycles(1); lcd_rw = 0; delay_cycles(1); lcd_enable = 0; lcd_send_nibble(n >> 4); lcd_send_nibble(n & 0xf); // return i; // return '0' if failed to initialize LCD } void lcd_init() { int8 i; lcd_fail = FALSE; // 2004/02/28 tris_lcd_enable = 0; // set as output, Wu set_tris_to_write_lcd(); // set_tris_b(LCD_WRITE); Wu lcd_rs = 0; lcd_rw = 0; lcd_enable = 0; delay_ms(30); for(i=1;i<=3;++i) { lcd_send_nibble(3); delay_ms( 10); } lcd_send_nibble(2); for(i=0;i<=3;++i) lcd_send_byte(0,LCD_INIT_STRING[i]); } void lcd_gotoxy( int8 x, int8 y) { int8 address; if(y!=1) address=lcd_line_two; else address=0; address+=x-1; lcd_send_byte(0,0x80|address); } void lcd_putc( char c) { if ( !lcd_fail ) // 2004/02/28 { switch (c) { case '\f' : lcd_send_byte(0,1); delay_ms(2); break; case '\n' : lcd_gotoxy(1,2); break; case '\b' : lcd_send_byte(0,0x10); break; default : lcd_send_byte(1,c); break; } } } char lcd_getc( int8 x, int8 y) { char value; lcd_gotoxy(x,y); lcd_rs=1; value = lcd_read_byte(); lcd_rs=0; return(value); } void lcd_cursor_mode(int8 x, y, int1 cursor_display_on, char_blink_on) // Wu { int8 display_mode = 0x0C; if (cursor_display_on) bit_set(display_mode, 1); if (char_blink_on) bit_set(display_mode, 0); lcd_gotoxy(x,y); lcd_send_byte(0, display_mode ); } void lcd_display_mode(int1 char_display_on, cursor_display_on, char_blink_on) // Wu { int8 display_mode = 0x08; if (char_display_on) bit_set(display_mode, 2); if (cursor_display_on) bit_set(display_mode, 1); if (char_blink_on) bit_set(display_mode, 0); lcd_send_byte(0, display_mode ); } 先用 CCS 原版的啦 HD44780 http://home.iae.nl/users/pouweha/lcd/lcd.shtml
發表於: 2005/1/19 1:00
|
|||
|
Re: LCD顯示
|
||||
---|---|---|---|---|
資深會員
|
...文中提到
<只要那四條 data 線在同一個 PORT 就好,其他三條可以隨意變更,把 LCD.C 改幾行就好。> 請教一下,要如何修改LCD.C,使得其他三條可以隨意變更?
發表於: 2005/1/18 22:55
|
|||
|
Re: LCD顯示
|
||||
---|---|---|---|---|
資深會員
|
不要去修改 LCD.C,也不必去改,你只要修改主程式就好
在主程式引入 LCD.C 之前設定就好,如下: #define use_portb_lcd // 加這行就用 PORTB //#define use_portd_lcd // 加這行就用 PORTD #include <lcd.c> void main() { ... } 原因,在 LCD.C 裡面有這行,就會依據你的設定來選擇 #if defined use_portb_lcd ... 程式庫裡的,盡量不要改,若要改的話,就先複製到你的主程式所在的工作目錄,再改個名字,例如 LCD_for_proj_01.c 這樣才好做版本的管理。 若使用 CCS ,建議您去買一套 CCS 的實驗板,才好搭配他的範例程式去測試,若出現問題時,直接去 CCS 的討論區發問就好,那裡有許多樂於助人的高手,兩天之內一定會有答覆的。我選擇 CCS 的兩個主要原因就是 (1) 功能超強的 printf 和 (2)因為他的討論區非常非常的好。在 CCS 的 IDE 底下,用滑鼠點選 HELP -> Tech Support 就可以發 e-mail 去給 CCS,通常有點慢,討論區比較有用。 CCS 實驗板: http://www.ccsinfo.com/hardware.shtml CCS 討論區: http://www.ccsinfo.com/forum/ 你的 PORTB 為何不能用?我也想不通。我用 PORTB 接 LCD 已經三年了,F877, F45x 都沒問題啊。更改 LCD 接線也都沒問題,只要那四條 data 線在同一個 PORT 就好,其他三條可以隨意變更,把 LCD.C 改幾行就好。 去買個 CCS 的實驗板吧 我當初買的是 http://www.ccsinfo.com/ace.shtml 含 LCD/Keypad Kit 和 Experimenter's Kit 刷信用卡,一星期後收到,打開盒子,三十分鐘搞定 LCD,當時的心情真是爽啊,呵呵。 Experimenter's Kit 裡面的週邊 IC 也十分有用。 學校或學生就用超便宜的教育版吧 http://www.ccsinfo.com/education.shtml CCS-C 比較像 PC 的 Turbo-C, Hi-Tech 和 C18 我都沒用過,要請版主出馬囉。 他們的 printf 好像沒有 CCS 的那麼強喔。 C 語言的原作者 K&R 說,第一個 C 程式應該是 printf("Hello world !"),詳見 "The C Programming Language" , http://www.ccsinfo.com/newtopiccbooks.shtml 我覺得,第二個 C 程式用 printf(lcd_putc,"x = %f", 3.1416) 就更爽了,呵呵。
發表於: 2005/1/15 13:36
|
|||
|
Re: LCD顯示
|
||||
---|---|---|---|---|
初級會員
|
我使用的是HI-TECH的編譯軟體,是不是也可以適當的改變LCD_init(),也可以應用printf指令將float格式在LCD上麵顯示齣來?
發表於: 2005/1/12 11:26
|
|||
|
Re: LCD顯示
|
||||
---|---|---|---|---|
資深會員
|
先看看範例 C:\Program Files\PICC\Examples\EX_LCDKB.C
把 main 改成下面這樣 void main() { lcd_init(); lcd_putc("\fHello world !\n"); printf(lcd_putc, "x = %f", 3.1416 ); while(1); } 如果還不行的話 ... 看看 LCD 接線是否有誤, LCD 對比設定是否有誤 (對比線 Vo 接地就好), LCD 的驅動晶片是 HD44780 相容的嗎? 你的 LCD 的型號是啥?
發表於: 2005/1/10 22:21
|
|||
|
Re: LCD顯示
|
||||
---|---|---|---|---|
資深會員
|
我用閣下上面的C語言,結果LCD並不能顯示,好像在LCD_INIT就掛了,不知應用上面還要注意那些地方?(註:個人使用CCS3.188,晶片使用PIC18F452,與LCD界面使用埠B接腳,當然在LCD.C中設定埠B的#define那一行有去掉雙斜線)
發表於: 2005/1/10 20:31
|
|||
|
Re: LCD顯示
|
||||
---|---|---|---|---|
初級會員
|
,謝謝指點!!!!
發表於: 2005/1/6 17:49
|
|||
|
Re: LCD顯示
|
||||
---|---|---|---|---|
資深會員
|
參照:
YES, 這是標準的 C 語言的 printf 指令的功能。 玩過 C 語言嗎? 玩過 PC 用的 Turbo-C 嗎?
發表於: 2005/1/4 11:25
|
|||
|