/********************************************************************* * PIC16F1938 少数点演算テスト * プロジェクト名: PIC16F_float_calculate_test * * Condition: * 8MHz 内部クロック→ PLL無し * Fcy=8MH, Tcy=125ns * * CPU: PIC16F1938 * * Graphic LCD(Monochrome): SG12864A * * デバッグ年月日: 2017/6/30 N.Ishii *********************************************************************/ #include #include "glcd_PIC16F_lib.h" #define LED RC0 // コンフィギュレーション1の設定 #pragma config FOSC = INTOSC // 内部クロックを使用する(INTIO) #pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF) #pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON) #pragma config MCLRE = ON // 外部リセット信号使用 #pragma config CP = OFF // プログラムメモリーを保護しない(OFF) #pragma config CPD = OFF // データメモリーを保護しない(OFF) #pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON) #pragma config CLKOUTEN = OFF // CLKOUTピンをRA6ピンで使用する(OFF) #pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF) #pragma config FCMEN = OFF // 外部クロック監視しない(OFF) // コンフィギュレーション2の設定 #pragma config WRT = OFF // Flashメモリーを保護しない(OFF) #pragma config VCAPEN = OFF // 低電圧レギュレータ用のキャパシタは使用しない(OFF) #pragma config PLLEN = OFF // 動作クロックを32MHz(4xPLL)では動作させない(OFF) #pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON) #pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI) #pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF) /// メッセージ・テーブル char MsgData1[] = "xxxbpm"; unsigned char bpm, n; /// Function Prottypes void itostring(char digit, unsigned char data, char *buffer); /******************************************************************************* * メインの処理 * *******************************************************************************/ void main(void) { int i; OSCCON= 0b01110010; // 内部クロックは8MHzとする ANSELA= 0b00000000; // AN0-AN4は使用しない全てデジタルI/Oとする ANSELB= 0b00010000; // AN12のみアナログ入力、他は全てデジタルI/Oとする LCD_TRIS= 0b00000000; // ピン(RA)は全て出力に割当てる(0:出力 1:入力) TRISB= 0b11111111; // ピン(RB)は全て入力に割当てる TRISC= 0b00000000; // ピン(RC)は全て出力に割当てる LED= 0; // LED OFF WPUB= 0b00111000; // RB3-5は、内部プルアップに指定 /// Initialize GLCD Control Signal Level LCD_E= 0; LCD_CS1= 1; LCD_CS2= 1; LCD_RW= 1; LCD_DI= 1; lcd_Init(); // GLCD初期化 lcd_Clear(0); lcd_Str(0, 0, "TEST START"); __delay_ms(2000); lcd_Clear(0); n= 85; // R-R間隔(サンプル数 - 1)想定 // n= 55; bpm= 6000/n; // 60秒x100/(0.01秒x100) x n→ n= 85の場合、bmp= 70.59になるが、切捨てられ結果は、70?→ OKだった itostring(3, bpm, MsgData1); lcd_Char1(0, 0, 0x8D); // ハートキャラクタ表示 lcd_Str(0, 1, MsgData1); // 心拍数表示 while(1); } /****************************************** * 数値から文字列に変換(char) *******************************************/ void itostring(char digit, unsigned char data, char *buffer) { char i; buffer += digit; //文字列の最後 for(i=digit; i>0; i--) { //最下位桁から上位へ buffer--; //ポインター1 *buffer = (data % 10) + '0'; //その桁数値を文字にして格納 data = data / 10; //桁-1 } /// ブランキング処理 i = 0; while((i < digit-1)&&(*buffer == '0')) // 上位桁が0の間 { *buffer = ' '; // ブランクに変換 buffer++; i++; } }