わしのC言語の理解度は幼稚園児レベル・・・(笑)
そもそも何がANSI-C準拠で何がC18特有なのかも理解していない・・・(笑)
だから試行錯誤で液晶表示で確認するしかない(笑)
1.C18の液晶表示ライブラリは40MHz用を20MHz用に改良してビジーチェックを追加した。
2.C18のUSART(RS232C)受信関数は、CCS-CのERRORSのようなオーバーランエラー、フレーミングエラー処理の適当な命令が見つからないので、直接レジスタ操作する関数を作って対応。
(※;直接レジスタ操作の方法はCCS-CよりもC18の方が行いやすい)
前にも書いたが、CCS-Cは出力も拡張で液晶に
printf(lcd_data,"cos(pi*%lu/180)",data);
なんてこともできるから%書式さえきちんと書けば、浮動小数点実数値でも文字列に変換して液晶表示できるけど・・・
C18はそんな便利な機能は無い!(笑)
数値を文字列に変換できるのは整数だけ(笑)
でも浮動小数点実数を整数部と小数部に分ける関数がある・・・これだ!
実行結果です。
34.5678 なんだが 34.5677 になってる????確認要・・・
プログラムソースです。
小数点部はZ=0.5678 なので小数第四位まで表示するなら10000倍して整数化した後、文字列変換すれば良いハズ。
// 追加ヘッダーファイル
#include <lcd18m20b.h> // LCD表示(20MHz,ビジーチェック有り)
#include <math.h> // 数学関数
#include <stdlib.h> // 文字列関数
/* 関数プロトタイピング */
// 無し
/* 変数の定義 */
char STRTMSG[] = "18F4550 math.h test"; // 開始メッセージ
char dodo1[]="."; // 小数点
float x=34.5678; // テスト用の浮動小数点実数
float y; // 整数部格納変数
float z; // 小数部格納変数
char yy[4]; // 文字配列、整数部用
char zz[6]; // 文字配列、小数部用
/* メイン関数 */
void main (void){
////入出力設定
TRISB = 0; // PORTB全部出力設定
lcd_init(); // LCD初期化
lcd_clear(); // LCD消去
lcd_str(STRTMSG); // 開始メッセージ表示
lcd_cmd(0xC); // カーソルOFF
//// メインループ
while(1)
{
z = modf(x,&y); // 小数点部=z,整数部=y
ultoa(z*10000,zz); // 小数点部zをn倍して整数化し文字列に変換→zz
ultoa(y,yy); // 整数部yを文字列に変換→yy
lcd_cmd(0xC0); // 2行目
lcd_str(zz); // 小数部の表示
lcd_cmd(0x94); // 3行目
lcd_str(yy); // 整数部の表示
lcd_cmd(0xD4); // 4行目
lcd_str(yy); // 整数部の表示
lcd_str(dodo1); // 小数点.の表示
lcd_str(zz); // 小数部の表示
} // while(1)end
}
これを関数にしてプロトタイピングすれば計算後の液晶表示も容易になるかな・・・



![: トランジスタ技術 (Transistor Gijutsu) 2007年 12月号 [雑誌]](http://ecx.images-amazon.com/images/I/51%2B6xOW4gmL._SL75_.jpg)










































サイクリング






![: トランジスタ技術 (Transistor Gijutsu) 2008年 02月号 [雑誌]](http://ecx.images-amazon.com/images/I/512TT9%2BfugL._SL75_.jpg)













最近のコメント