FC2カウンター

現在の訪問者数

現在の閲覧者数:

カレンダー

07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

プロフィール

剣菱P

Author:剣菱P
剣菱Pと申します。
性別:男
年齢:27
二兎を追って一兎も得られないタイプ

マイコンやプログラミング、ニコニコ動画、雑記等
方向性は見えずとも、ちょっとずつ更新していく予定です!

リンクフリーです。
こんなブログでよかったらよろしくお願いしま~す。

公開メール kenbishiP@gmail.com

検索フォーム

最新記事

最新コメント

カテゴリ

メールフォーム

名前:
メール:
件名:
本文:

月別アーカイブ

最新トラックバック

リンク

ブロとも一覧

ブロとも申請フォーム

ランキング

ランキング参加中です。気が向いたらクリックしてあげてください。


にほんブログ村 その他趣味ブログへ
にほんブログ村 その他趣味ブログ 趣味の工作へ

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PIC 新お勉強7(シリアル通信1) PIC 新お勉強5(最初の壁)»

コメント

コメントの投稿













管理者にだけ表示を許可する

PIC 新お勉強6(LCD)


PIC Cでだいぶ時間をとられてしまった、液晶の実験をしました。
液晶で時間をくったというより、printfに時間をとられたんですけどね。

液晶制御用のライブラリはメインのファイルに直接書いてあります。

制御用関数は後閑哲也さんが書かれている C言語によるPICプログラミング入門に乗っていたコードのコピペをすこし変更しただけです。
カーソルの表示をOFFにしたり、カーソルの位置を指定する関数を作ったりしたくらいです。

コードは


#include<16f84a.h>

#fuses HS,NOWDT,PUT,NOPROTECT
#use delay(CLOCK = 20000000)

#define mode 0
#define output_x output_b
#define set_tris_x set_tris_b
#define stb PIN_B2
#define rs    PIN_B1
#define input_x input_b

///********** データ出力関数 **********///
void lcd_out(int code, int flag)
{
    output_x((code & 0xf0) | (input_x() & 0x0f));
    if(flag == 0)
        output_high(rs);
    else
        output_low(rs);
    delay_cycles(1);
    output_high(stb);
    delay_cycles(2);
    output_low(stb);   
   
}

///********** 一文字表示関数 **********///
void lcd_data(int asci)
{
    lcd_out(asci,0);
    lcd_out(asci<<4,0);
    delay_us(50);   
}

///********** コマンド出力関数 ***********///
void lcd_cmd(int cmd)
{
    lcd_out(cmd,1);
    lcd_out(cmd<<4,1);
    delay_ms(2);
       
}

///**********全消去関数 ****************///
void lcd_clear()
{
    lcd_cmd(0x01);
    delay_ms(15);   
}

///*********** 初期化関数 ****************///
void lcd_init()
{
    set_tris_x(mode);
    delay_ms(15);
    lcd_out(0x30,1);
    delay_ms(5);
    lcd_out(0x30,1);
    delay_ms(1);
    lcd_out(0x30,1);
    delay_ms(1);
    lcd_out(0x20,1);
    delay_ms(1);
    lcd_cmd(0x2E);
    lcd_cmd(0x08);
    lcd_cmd(0x0C);
    lcd_cmd(0x06);
    lcd_cmd(0x02);   
}   

//***** LCDの描画位置を指定する関数 ********//
void lcd_pos(char line,char col){                                       
   
    if(line == 1)                                                //lineが1なら
        lcd_cmd(0x80 + col -1);                                        //一行目の先頭アドレスにcolを足した位置に移動
    else if(line == 2)                                            //2の時も同様に
        lcd_cmd(0xc0 + col-1);

    delay_us(50);
}

void main(){
    int i=0;
    set_tris_a(0);
   
    lcd_init();
    lcd_clear();
    while(1){
        lcd_pos(1,1);
       
        printf(lcd_data,"count = %3d",i++);
        delay_ms(100);
       
    }
}




PIC C の int型は16bitだったのですが、PCMのint型は8bitです。


ついにprintf関数が不自由なく使えましたwww
PCMのprintf関数は通常のものの拡張バージョンになっているようで
printf(fname, cstirng, value, value・・・) のような感じになっています。
どこが違うかというと、普通のprintfにはfnameに該当する部分がありません。

fnameに一文字出力関数を指定することで、その関数を使用してprintf関数の出力をします。
つまりここにLCD用の一文字出力関数を指定してやれば、LCDに文字列を出力できます。

実行してみた感じです。
[高画質で再生]

液晶の実験1(PCM)

[広告] VPS

ひとつだけ気になる問題が、
符号ありのint型の変数の中身をLCDに表示しているので、当然ー128~127の数字を表示するわけですが、
マイナスがついてるときは4桁、プラスの時は3桁の数字なわけです。
-100の次に-99になるわけですが、
-101
-100
-990
-980
の様に、最後の桁がリセットされずにずっと0のままの表示を続けてしまいます。

ちょっと気になるので
表示する前に一瞬だけ画面をクリアする関数を挟んで見ることにしました。

void main(){
    int i=0;
    set_tris_a(0);
   
    lcd_init();
    lcd_clear();
    while(1){
        lcd_pos(1,1);
        lcd_clear();
        printf(lcd_data,"count = %3d",i++);
        delay_ms(100);
       
    }
}


実行結果

[高画質で再生]

液晶の実験2(PCM)

[広告] VPS

やはり、きもーち、画面がチカチカするようになったような気もしないでもないですが、
気のせいって事で。
とりあえず最後の桁が無事に消えました。

いやー、すごいスムーズに実験終了しました。最高や!
あれだけprintfなんぞに苦戦した過去が懐かしい。

しかもプログラムメモリの使用率が34%、PIC Cの時は簡単な機能だけの自作printfで40%以上、奇跡的に動いた時のPIC C printfでは90%近く使用していたというのに、すごいぜPCM。

といいつつも、いずれPIC C のprintfにもリベンジしないと気が治まらないですがね。


クリックしてくれたらうれしいです。
スポンサーサイト

PIC 新お勉強7(シリアル通信1) PIC 新お勉強5(最初の壁)»

コメント

コメントの投稿













管理者にだけ表示を許可する


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。