| 何度も体当たりしてギブアップしました。 いろいろコンパイラを吟味しましたが、ちゃんとお金を払って使う、格安のコンパイラを見つけました。 ソースブーストのピカントC 6.0日本語版コンパイラです。千石電商の2階に売っています。2Kライセンスで1,200円、ドキュメントが1,050円です。サンプルソースもいろいろあり、なんといってもデバイスの制限がありません。2K以上使いたい方は4Kライセンス3,800円もあります。制限なしが9,800円です。1,200円なら失敗しても後悔しないかも。 |
| ソースブーストCコンパイラで 16F648A のLCDに挑戦。 |
| 紆余曲折がありましたが、まずは、サンプルプログラムをそのまま使ってみましょう。 サンプルソースは、普通にインストールした場合下記のフォルダにあります。 C:\Program Files\SourceBoost\plugin_examples\lcd lcd4bit.c これって、16F84Aのサンプルのようです。しかも素でビルドすると、シミュレータで動作させるもののようです。 というわけで、37行目あたりを // comment out when running on actual hardware - different delays used //#define RUN_UNDER_SIM 本物のH/Wで動かすには、#define RUN_UNDER_SIMをコメントにしてください。 あと、main()の中ですが、114行あたりに #ifdef RUN_UNDER_SIM #else delay_s( 1 ); // power up delay #endif cmcon=0x07; I/Oポートをデジタルの設定にします。 この状態でターゲットデバイスを16F648Aにしてビルドします。 あとは秋月ライターで書き込みますが、こんな感じの設定です。 ![]() これで、めでたく16F648AでLCDが動作します。このプログラムはテストプロなので、 数秒間隔で、すべての機能を実行してくれます。 |
| さて、オリジナルのプログラムに挑戦です。 lcd_driver.h をインクルードするらしいです。(なに気、どこに書いてあるかわかりませんが) それと、利用するポートの設定が必要です。 4ビットモードで使うとして、PB4は、DATA BIT4でPB5がBIT5、6,7にします。 問題のRSやR/W、Eは、PORT1、2、0にします。 定義の記述は下記の通り 後は、オリジナルプログラムです。(漢字のスペースが入ってますのでご注意を) 下記のコメントには16F628がターゲットとなっていますが、648で動作させています。 #include <system.h> #define LCD_ARGS 2, /* Interface type: mode 0 = 8bit, 1 = 4bit(low nibble), 2 = 4bit(upper nibble) */ \ 1, /* Use busy signal: 1 = use busy, 0 = use time delays */\ PORTB, TRISB, /* Data port and data port tris register */ \ PORTA, TRISA, /* Control port and control port tris register */ \ 1, /* Bit number of control port is connected to RS */ \ 2, /* Bit number of control port is connected to RW */ \ 0 /* Bit number of control port is connected to Enable */ #include <lcd_driver.h> // include the LCD template code//Target PIC16F628 configuration word #pragma DATA _CONFIG, _PWRTE_OFF & _WDT_OFF & _HS_OSC & _CP_OFF //Set clock frequency #pragma CLOCK_FREQ 20000000 void main( void ) { //Configure port A trisa = 0x00; //Configure port B trisb = 0x00; //Initialize port A porta = 0x00; //Initialize port B portb = 0x00; cmcon = 7; //disable comparators 16F84 では不要 lcd_setup(); lprintf( "Kitaura Jiro" ); //Endless loop while( 1 ); } |
| プログラムとは呼べないようなクソソースですが、ソースブーストのコンパイラを買ったのが先週の日曜です。 試行錯誤の連続でした。これに、入力のスイッチを一個つけてみたいです。 ということで、また、数時間たちました。かなり切れそうになりましたがっ! PA3にスイッチをつけ、PB0にLEDを付けました。 #include <system.h> #define LCD_ARGS 2, /* Interface type: mode 0 = 8bit, 1 = 4bit(low nibble), 2 = 4bit(upper nibble) */ \ 1, /* Use busy signal: 1 = use busy, 0 = use time delays */\ PORTB, TRISB, /* Data port and data port tris register */ \ PORTA, TRISA, /* Control port and control port tris register */ \ 1, /* Bit number of control port is connected to RS */ \ 2, /* Bit number of control port is connected to RW */ \ 0 /* Bit number of control port is connected to Enable */ #include <lcd_driver.h> // include the LCD template code//Target PIC16F628 configuration word #pragma DATA _CONFIG, _PWRTE_OFF & _WDT_OFF & _HS_OSC & _CP_OFF //Set clock frequency #pragma CLOCK_FREQ 20000000 void main( void ) { //Configure port A PA3:input trisa = 0x08; //Configure port B trisb = 0x00; //Initialize port A porta = 0x00; //Initialize port B portb = 0x00; cmcon = 7; //disable comparators lcd_setup(); lprintf( "Kitaura Jiro" ); //Endless loop while( 1 ) { portb.0=porta.3; } } う〜ん。どうにか、考えていることが、出来始めました。すごい!(なさけないかも) |