Re: PIC程式語法 新手疑惑?
|
||||
---|---|---|---|---|
版主
|
MPASM 語法裡有關 LABEL 的語法有三種 :
1. 字尾加冒號 --> Delay: 2. 字尾不加冒號 --> Delay 3. LABLE單獨為一行 因為用 SWAPF 指令不會影響到 Z 旗號,如用 MOVF 是很簡單但 Z 旗號會被影響到。
發表於: 2005/1/19 11:53
|
|||
|
關於燒錄的問題
|
||||
---|---|---|---|---|
高級會員
|
我現在使用PIC18F6520
是透過ICD2直接連接模擬板,底下是我的流程 程式OK-->program target device-->run 如果我要把我的程式燒到pic裡面, 當program target device之後,可以不用透過icd2就可以動作嗎? program target device就是把程式燒到pic裡面嗎? 還是要再買燒錄的硬體裝置才可以燒錄,如果這樣,當燒錄好,接上pic的電源,和震盪器之後,還有什麼要接才可以正常動作呢? 以上三個問題困擾我很久,不知有可參考的資料還是,可以麻煩各位大大,辛苦一點跟我說一下呢, 謝謝歐
發表於: 2005/1/19 9:59
|
|||
|
Re: 張貼程式碼時,保持原有空白字元,使格式不會亂掉的方式
|
||||
---|---|---|---|---|
資深會員
|
針對如何把使用 〔code〕所貼的程式碼正確複製下來的問題,上次提出的方法要用到 ultraedit 作搜尋替代,較為繁複,現在則有新的發現:
《只要改用 FireFox ,問題就自動解決了!!》 在 FireFox 中來開網頁並進行剪貼複製,就可以保留程式碼的正確格式,貼到任何編輯器中都沒問題。 Firefox 是前一陣子造成轟動的新生代瀏覽器,聲勢直逼 Internet Explorer,目前版本為 1.0,台灣主網在 http://www.moztw.org ,首頁上就有下載連結。 更新:目前最新版本為 1.0.1(安全更新)
發表於: 2005/1/19 9:40
|
|||
|
请问间接寻址(FSR)功能在PICC中怎么实现??
|
||||
---|---|---|---|---|
新會員
|
各位大大:
在组合程式中上电初始化及睡眠叫醒时都要将芯片中所有RAM的内容清0,汇编中可以用FSR+INDF清除,但在PICC中怎么实现此功能??例如要将16F877的Bank0共96个RAM全部清0
發表於: 2005/1/19 9:06
|
|||
|
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: 使用ccs,用adc問題無法解決,請教有經驗者
|
||||
---|---|---|---|---|
管理員
|
Dear Customer,
依照您的描述看來 , 應該是對應的腳位看錯了. 在 PIC18F452 裡面 , RA4 的腳色是 RA4 或 T0CKI . ADC 的 AN4 應該在 RA5 才是喔 :) 希望您的問題可因此解決 ! 謝謝啦 ....
發表於: 2005/1/18 23:12
|
|||
|
Re: LCD顯示
|
||||
---|---|---|---|---|
資深會員
|
...文中提到
<只要那四條 data 線在同一個 PORT 就好,其他三條可以隨意變更,把 LCD.C 改幾行就好。> 請教一下,要如何修改LCD.C,使得其他三條可以隨意變更?
發表於: 2005/1/18 22:55
|
|||
|
使用ccs,用adc問題無法解決,請教有經驗者
|
||||
---|---|---|---|---|
資深會員
|
程式如下
#include <18F452.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #use rs232(baud = 115200, xmit= PIN_C6, rcv= PIN_C7) void main() { char i; int16 advalue16[8]; setup_adc_ports(ALL_ANALOG); setup_adc(ADC_CLOCK_INTERNAL); while(1){ for(i=0; i<8; i++){ set_adc_channel(i); delay_us(20); advalue16[i]=read_adc(); } for(i=0; i<5; i++) printf("%ld ", advalue16[i]); printf("\n\r"); delay_ms(500); } } 問題為 RA0~RA3接訊號,正確顯示數值 RA4接任何準位(0~5v內),顯示值為1023 我已快抓狂了,有人可為我解決嗎?
發表於: 2005/1/18 20:03
|
|||
|
Re: 18F452 BOOTLOAD Firmware 的問題
|
||||
---|---|---|---|---|
版主
|
另外,有兩個注意事項:
1、為簡化起見,該程式假設hex檔中,程式長度是16byte的整數倍。所以,也許利用mplab中export的功能,將欲下載的程式段依16byte的整數倍下載出來會比較簡單。 2、不曉得為什麼,實驗時發現,超級終端機的ASCII設定中,行列延遲及字元延遲各加1毫秒比較不會有傳輸錯誤發生。有興趣的人研究一下吧。
發表於: 2005/1/18 16:21
|
|||
|