以前から遊んでいたLCDがあります。[PIC16F883]ですが「何か使わないと!」と思い電圧表示にでも使おうと試すことにしました。
電圧はIC内臓の10bitのA/D変換です。これをただ表示するだけでは、意味がありませんが空いているスペースを使って「棒グラフ」と連動させようと思いました。時折見かけるものです、これはメーター代わりに使えるのでこの機会に試すことにしました。A/D変換は普通は多数サンプルを取って使うのですが、ここでは1回のサンプル表示です。実験なので数字が出れば良い。
棒グラフは単に横一杯の16文字分を使っています。これは半分でも良かったかとか、10個表示でも!なども考えられますが、まずは「最大16個表示」にしました。
[ A/D変換 ]
特に理由はないので、ICに付いているA/D変換を利用しました。10Bitで使い慣れたものです。
実験で高速表示も無いので、1回測定してその結果をLCDに表示するだけです。基準電圧は5Vとし、3端子レギュレータに依存しています。
表示関連は全てSoftまかせで、小細工はしない。
[ 棒グラフ ]
LCDの下の段を棒グラフにします、左から右へ伸ばしました(これの方が簡単)。数字DATAが基準になります。A/D変換は0-1023まで変換されるので、これを64で割ると16になります、これをDATAがある所は黒印、後はクリヤーすれば棒グラフの出来上がりです。
黒角を使いましたが、○や#なども使えます。応用は結構あると思います。デジタル信号がアナログ的に見えるので、視覚的に面白いです。
16文字分を使いましたが、例えば3つに分けてそれぞれの信号の変化を表示させる。などをすると「つまらない文字の羅列も見たくなる」というものです。[ ハードの製作 ]
以前の物を再利用した物で、新たに作った物ではありません。単に半固定のVRを付けて電圧を端子に加えただけです。説明も不要でしょう。
今回は「棒グラフ」の実験が主でSOFTの確認で、Softのポイントは「棒グラフ」の太線の所です。
[ 結果 ]
予定通りの動作をしました。VRを動かすと0-1023までスムーズとは言えませんが、それなりに変化が見えます(VR自体が小さいので細かく調整出来ません)。
これでアナログ化のツールが手に入ったことになります(そんなライブラリーって有ったのかなー、不明)。Mikro C-Proに代わってプログラムの変更、アチコチ直す必要が出て少し面倒です。でも、なれるしかありませんが面倒ですね。初めからProになっていれば多少は苦労が少ないと思うのですが・・・。
当然の事ですがPIC16F88なども同じプログラムで動くはずです。現時点でコンフイグのエラーになっていますが、動作はしています。(秋月電子ライターとの相性問題か・・・。)
2009年8月8日
/* Last M:2009/8/8 By M.kikuchi */ // Lcd pinout settings sbit LCD_RS at RC5_bit; sbit LCD_EN at RC6_bit; sbit LCD_D7 at RB0_bit; sbit LCD_D6 at RB1_bit; sbit LCD_D5 at RB2_bit; sbit LCD_D4 at RB3_bit; // Pin direction sbit LCD_RS_Direction at TRISC5_bit; sbit LCD_EN_Direction at TRISC6_bit; sbit LCD_D7_Direction at TRISB0_bit; sbit LCD_D6_Direction at TRISB1_bit; sbit LCD_D5_Direction at TRISB2_bit; sbit LCD_D4_Direction at TRISB3_bit; char txt1[] = "123456"; char txt2[] = "JA1HWO"; char i; // Loop variable void main(){ unsigned int ad; unsigned char buf[6]; TRISA = 0xff; //Input TRISB = 0; //OUTput TRISC = 0; OSCCON=0b01110000; //8MHz ANSEL =0b00000001; // RA0-4 ANSELH=0; PORTC=0; // Lcd_Init(); //Lcd set Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); // Lcd_Out(1,1,txt1); Lcd_Out(2,5,txt2); // Delay_ms(1000); Lcd_Cmd(_LCD_CLEAR); // while (1){ ad = Adc_Read(0); WordToStr(ad,buf); Lcd_Chr(1,1,buf[0]); //電圧表示 Lcd_Chr_Cp(buf[1]); Lcd_Chr_Cp(buf[2]); Lcd_Chr_Cp('.'); Lcd_Chr_Cp(buf[3]); Lcd_Chr_Cp(buf[4]); Lcd_Chr_Cp('V'); // // 棒グラフ for(i=0;i<16;i++){ if((ad/64)>=i) Lcd_Chr(2,i+1,0xff); else Lcd_Chr(2,i+1,' '); } Delay_ms(300); } }