• ベストアンサー

PICのprintfで5桁の整数を表示させたい

PIC 16F688、mplab xc8を使っています。 LCDにprintfで5桁の整数を表示させたいのですが、65536以上はうまく表示できません。 5桁で99999を表示させるにはどうすればいいでしょうか? 例えば、このように書くと99999以上の数字が表示されてしまいますが、65535までは正常に表示されます。また、0も5桁で正常に表示されています。 unsigned short long a; a=99999; printf("%05.5lu",a); SLEEP(); printfの%lが悪いのか、%uが悪いのか、他の指定が有るのか分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

a の型を、32bit の unsigned long にしたらどうでしょうか。 a は、24bitしかないのに lu つまり32bit分データがあると解釈して範囲外のデータまで一緒に見ているのではないかと。で、その範囲外のデータがたまたま0か、他の計算の結果汚れているかで 意図したとおりの値が表示されるかわけのわからない値が表示されるかの違いになっている、そんな気がします。

Blue_squid
質問者

お礼

早く結果を知りたくて、出先から戻ってきた後に試してみましたら、unsigned longで成功しました。たいへんたいへん助かりました。 ありがとうございました。

Blue_squid
質問者

補足

Classified様 %luに合わせて変数のbitを設定するわけですね。printfでlongで読めと指定してるのに、変数が24bitだから、他の領域を読んでしまってるのかぁ。 当初は5桁の10進数を表したいだけでしたので、安易に変数側を24ビットにすれば良いと考えていました。printfでshort longの指定が無いのも不可解でもありました。 最悪、7セグLEDを5桁で表示させる時のように、桁毎に割り算して、桁毎に表示させるしかないのかな?それとも、気持ち悪いけど65536で0に戻る仕様にするかな?と思っていました。 明日は外に出てしまいますので、明後日などに変数をunsigned longで試してみますね。まずは、鋭いご指摘ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

unsigned short long ってなんだよ. あと, 「99999以上の数字が表示されてしまいますが、65535までは正常に表示されます」の意味がまったく分からん.

Blue_squid
質問者

補足

unsigned short long これおかしいですか?すみません、私もおかしい理由が分かりません。 a=99999とするとLCDの表示は99999にはならず、7桁くらいの意味不明な数字がLCDに表示されてしまいます。5桁の指定をしているのに、5桁以上となってしまう事も不明です。 また、%luを、%uとした時は、65536は0となります。これは分からなくもないのですが、short longで24ビットにしてますので、16ビットで桁あがりしないでほしいのです。 他の数字の場合、a=0としたときはLCDは00000となります。a=1は00001になります。これで伝わりましたでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PIC(PIC16F84A)を用いたLCDの2桁表示について

    現在、去年、秋月電子で購入したSHARPのLCD(LM162AT1)をとPIC16F84Aを用いて、周波数カウンタを製作しようと思っています。 そこでLCDとPIC(PIC16F84A)を用いたテスト回路を製作してLCDの表示方法をC言語で書いて勉強しています。1桁の表示はできるのですが、2桁の表示ができません。 MicrochipのMPLAB IDE Ver.8.14を使用しています。 LCDのソースコードは付属のサンプルコードを使用しています。 どうして、2桁表示できないか教えてください。 また、対処方法も教えてください。 よろしくお願いいたします。

  • PIC18F1320でwarningがでる

    PIC18F1320で MPLAB X IDE v3.26 XC 8です warningがでる warningがでてもプログラムは動く warningがでなくしたい LCD液晶表示装置を使うので8ビット符号なし整数型がいい 0から255の8ビット符号なし整数型しか使わない キャラクターコードをLATB(PORTB)に送るため プログラムで-1や256になったりしないよう制御してある #include <xc.h> CONFIG 省略 ほとんど省略 // EQU unsigned char TMRA=1; unsigned char TMRB=1;//など void main(void) { TMRA = TMRA - 20; TMRB = TMR+1;//など } newmain.c: warning: (xxx) conversion to shorter data type よろしくお願いします。

  • PICを利用した5桁表示の回転計

    私は今PICを利用して5桁表示の回転計を製作しているんですが、LCDの表示方法についてご質問したいと思います。 LCDで5桁表示させるのですが、下2桁は00で固定し上の3桁だけを表示させることなど出来ないでしょうか? 細かい値はあまり必要がないので・・・ プログラムについての質問なんですが、皆様よろしくお願い致します。

  • XC8でPIC18F2420にIDを書き込む方

    XC8でPIC18F2420にIDを書き込む方法 MPLAB C18 か HI-TECH C か覚えていないのですが MPLAD IDEだったと思いますMPLAD X IDEではない+ WARNINGは出ますがコンパイル、ビルドは出来ていた? MPLAD X IDEでMPLAB XC8 でIDを書き込む方法教えてください MPLAB C18 か HI-TECH Cのとき //ID #define ID "0000001" unsigned char rom idlocData_org[8] = ID; #pragma romdata overlay idocs = 0x200000 unsigned char rom idlocsData[8] = ID; #pragma romdata よろしくお願いします。

  • PICマイコンによる乱数の表示について

    度々こちらで、お助け頂いております。 さて、今回の主旨はPICマイコンによりLCD表示器へ6個の数字を 表示する方法についてご質問させていただきました。 プログラミングはPIC用コンパイラCCS社のCコンパイラを使用し、 Micro chip社のMPLABと統合動作させています。 一般的なC言語と異なる部分があり、扱づらい面のあるコンパイラです。 では、問題のソースコードを次に記述します。 細部の設定や定義は省いて記述してあります。 1.void main() 2. { 3.int data,i; 4.srand((unsigned)time(ULL)); 5.data = 0; 6.表示器の初期化 7.カーソル位置をHomeへ 8.while(1) 9.{ 10.入力信号判定式 11.for(i = 0; i < 6; i++) 12. { 13. data=rand( )%6 + 1; 14. printf(lcd_data"%3d",data); 15. } 16.入力信号判定式 17.break; 18. } 19. } 以上、これだけのソースコードですが、コンパイルすると、 行番4コードがコンパイルエラーとなります。 (※英語のメッセージは読取れません。(勉強不足)) PICに関するrand( )とsrand( )関数について、いろいろと調べてみましたが、 それらに該当する項目が見当たりません。 そこで、行番4の部分をsrand(data);に変更したら、何とかコンパイル成功します。 それをPICに書込み、ターゲットに実装試験してみると、 100回乱数表示のうち、18回同じ組合せの数が出てしまいます。 どうも、srandの初期化が上手く出来てないみたいですが・・・ 何処が不具合となっているのでしょうか? また、同じソースコードをパソコンの標準Cで試してみると、 130回とも全てランダムに画面表示されます。 そこでどなた様か、PICに詳しい方のお知恵を拝借し、 ご指南頂けるなら、大変幸いに思います。 何卒宜しくお願い申し上げます。

  • pic32mxのデータ幅

    初めてPIC32MXでプログラムを走らせようとしています。 MPLAB X IDEとXC32を使っています。 PIC18F等の8ビットCPUの経験はあります。 PIC32MXはアドレス幅32ビットデータ幅32ビットだと思ってプログラムを作り始めました。 デバックするところになって分からないことが出てきました。 XC32におけるint型のデータ幅は32ビット、unsigned char型は8ビットです。 プログラムで変数を定義するとunsigned char型は偶数アドレス、奇数アドレスそれぞで定義されます。 int型の配列を定義すると、偶数番地アドレスを先頭として4バイト単位で割り当てられます。 これは、PIC32MXがバイトアドレッシングCPUで4バイトアライメントということだと思います。(違ったらご指摘下さい。) 実際MPLAB X IDEでデータメモリを参照すると1アドレス1バイトデータで表示されます。 質問は、 PIC32MXは32ビットアドレス空間(実際に持っているROM、RMAサイズは別として) のCPUではあるが、メモリ幅は、8ビットというのではないだろうか? というものです。PIC32MXの内部レジスタ関連は32ビットなので32ビットCPUだとは思いますが、データシートにある「 32 ビットのネイティブデータ幅」という意味がわかりません。 実際のメモリ空間は、アドレス範囲 x 8ビットということでいいのでしょうか。 御教授いただけましたら幸いです。

  • 16×2キャラクタLCDへの文字表示について

    16×2キャラクタLCDへの文字表示について質問です. CGRAMアドレス:0xffの塗りつぶしの四角を表示させたいのですが, '■'が'β'になって表示されてしまいます. どのような方法をとれば■が表示できるでしょうか. 開発言語はC,環境はMPLAB X IDE,XC8コンパイラ. 対象デバイスはPIC18F4553です. 御回答の程よろしくお願いいたします.

  • PIC電子工作

    電子工作初心者です。 PIC16f627aを使ってタイマーを作っているのですが、SLEEPをするとタイマ1が止まってしまい困っています。 これはPICの仕様なのでしょうか? もしそうならタイマ1を動かしている間に消費電力を抑える方法はないのでしょうか? どなたかご教授願います。 <環境> MPLAB v8.15a + HITEC C Pro 9.60PL4

  • PIC A/D変換での問題

    PIC16F690を使用しLCDにA/D変換をした数値を表示させる物を作ったのですが 抵抗を一定の速度で回しても数値が一定の速度で変化しません。 詳しく説明しますと、今回書いたプログラムは8bitで255までの値を表示させるものです。 抵抗をめいいっぱい回して数値を1にし(0にはどうしてもなりません。おそらく抵抗の問題) そこからゆっくりと一定の速度で抵抗を回すと数値が上がっていきます。 30辺りまでは一定の速度で数値が変化するのですが、そこから少し回すといきなり数値が220ぐらいにまで上がります。(一応30~210までの数値も出ている様なのでいきなり飛んでるわけではない) 抵抗を1Kのものから10Kものに変えてみたりしたのですが症状に変化はありませんでした。 どうしても解決できなかったので質問をした次第です。 解決方法がわかる方がいらっしゃいましたらお教え下さい。 プログラムを載せておきます。 #include<pic.h> #include<stdio.h> #include "lcd.h" unsigned int temp; unsigned int x = 1; unsigned char outString[20]; unsigned char count[20]; void init_a2d(void){ ADCON1=0x10; // A/D Clock Fosc/8 ADCON0=0x01; // A2D 入力をChannel 0 (RA0), // Left justified, A/D をON } // 指定された入力チャネルをA/D変換し8 bitの結果を返す unsigned char read_a2d(unsigned char channel){ channel&=0x0F; // 4 bitsを確認し ADCON0&=0xC3; // 現行入力チャネルをクリア ADCON0|=(channel<<2); // 新入力チャネルを設定 GODONE=1; // 変換開始 while(GODONE)continue; // 変換終了を待つ return(ADRESH); // 8 bitの結果を返 } void main(void) { pic_init(); init_a2d(); // A/D モジュール初期化 lcd_init(); lcd_goto(0x00); while(1) { __delay_us(50); // 50uS待ち(AD充電待ち) temp=read_a2d(0); sprintf(outString,"A/D=%2d",temp); lcd_puts(outString); lcd_goto(0x40); sprintf(count,"Count=%d",x); lcd_puts(count); x++; __delay_ms(100); lcd_clear(); } }

  • LCD表示プログラムで誤表示が解決できない

    pic16F84AにS-10551D(秋月)をつないでキャラクタ表示をしようとしていますが50%くらい誤まって表示してしまい解決策が有りません。 プログラムはアッセンブラでMPLAB IDEv8.60を使用 電波新聞社のPICマイコン完全マスターを参考 にしています。データ長4bitのイニシャライズも本やLCD添付資料のままでは表示しませんでした。 LCDパネルの問題かマイコンソフトの問題かの区別も出来ていません。 ちなみにソースを変更してSC1602BS 16*2行のLCDパネルでは正しく表示出来ます。 S-10551Dは16桁1行の一番安いパネルですが使えず捨てるのはくやしいので質問しました。同じような経験をされて解決された事があればアドバイス願います。 最終的にはLCDにバッテリーの充放電量を表示できる充放電コントローラーを作るのが目的です。