• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users




(1) 2 »


Re: LCD顯示
#19
資深會員
資深會員


查看用戶資訊
參照:

xfsmart 寫道:
我使用的是HI-TECH的編譯軟體,是不是也可以適當的改變LCD_init(),也可以應用printf指令將float格式在LCD上麵顯示齣來?


有人這麼說

http://www.goldenchip.com.cn/gdbbs/di ... melimit=&operator=&page=2

發表於: 2005/1/19 22:36
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: LCD顯示
#18
資深會員
資深會員


查看用戶資訊
參照:

cct1210 寫道:
...文中提到
<只要那四條 data 線在同一個 PORT 就好,其他三條可以隨意變更,把 LCD.C 改幾行就好。>
請教一下,要如何修改LCD.C,使得其他三條可以隨意變更?



這兩天剛測過

#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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: LCD顯示
#17
資深會員
資深會員


查看用戶資訊
...文中提到
<只要那四條 data 線在同一個 PORT 就好,其他三條可以隨意變更,把 LCD.C 改幾行就好。>
請教一下,要如何修改LCD.C,使得其他三條可以隨意變更?


發表於: 2005/1/18 22:55
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: LCD顯示
#16
資深會員
資深會員


查看用戶資訊
不要去修改 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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: LCD顯示
#15
初級會員
初級會員


查看用戶資訊
我使用的是HI-TECH的編譯軟體,是不是也可以適當的改變LCD_init(),也可以應用printf指令將float格式在LCD上麵顯示齣來?

發表於: 2005/1/12 11:26
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: LCD顯示
#14
資深會員
資深會員


查看用戶資訊
將與LCD界面的接腳由埠B改為埠D,而LCD.C中設定埠B的#define那一行加上雙斜線,結果已能正常顯示,CCS真的很好用。不過我有疑問,為何埠B不能使用,而且個人將埠B直接接8個LED測試(當然有接電阻),結果只有一半會亮(設定為同亮同滅),是不是我的埠B燒壞了,可是我用二顆都是同樣情形,還是我的燒錄器有問題(我用五年前的河洛燒錄器ALL-11)。

發表於: 2005/1/11 20:26
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: LCD顯示
#13
資深會員
資深會員


查看用戶資訊
先看看範例 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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: LCD顯示
#12
資深會員
資深會員


查看用戶資訊
我用閣下上面的C語言,結果LCD並不能顯示,好像在LCD_INIT就掛了,不知應用上面還要注意那些地方?(註:個人使用CCS3.188,晶片使用PIC18F452,與LCD界面使用埠B接腳,當然在LCD.C中設定埠B的#define那一行有去掉雙斜線)

發表於: 2005/1/10 20:31
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: LCD顯示
#11
初級會員
初級會員


查看用戶資訊
,謝謝指點!!!!

發表於: 2005/1/6 17:49
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: LCD顯示
#10
資深會員
資深會員


查看用戶資訊
參照:

xfsmart 寫道:
謝謝指點先!請問是不是使用CCS 的 C 就可以不必自己寫程式將float數轉換成為ascii碼啊?


YES, 這是標準的 C 語言的 printf 指令的功能。
玩過 C 語言嗎?
玩過 PC 用的 Turbo-C 嗎?

發表於: 2005/1/4 11:25
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------