/**************************************************************************** * メイン・プログラム:ノキア液晶5110表示テスト * * 原典参考先: * @ トラ技2006年3月号 山本さんの記事 * A 「太田さんのホームページ」の記事 * * 2016.11.20 N.Ishii *****************************************************************************/ #include "p24FJ64GA002.h" #include "nokiaGlcdlib.h" /// コンフィギュレーション ビットの設定 _CONFIG1( JTAGEN_OFF // JTAGの使用:無効 & GCP_OFF // コードプロテクト:しない & GWRP_OFF // 書き込みプロテクト:しない & BKBUG_OFF // バックグラウンドデバッグ:無効 & COE_OFF // クリップオンエミュレーション:無効 & ICS_PGx1 // EMUC/EMUDをPCG1/PGD1と共用 & FWDTEN_OFF // WDT:無効 ) /// Fosc = FRC (8MHz) _CONFIG2( IESO_OFF // 2速度スタートアップ:無効 & FNOSC_FRC // 発振器の選択:FRCを選択する & FCKSM_CSDCMD // クロック切り替え・クロックモニタ:供に無効 // & OSCIOFNC_OFF // OSCOピン機能:OSCOまたはFosc/2の出力する & OSCIOFNC_ON // OSCOピン機能:RA3ポートとする 161118 & IOL1WAY_OFF // RPレジスタプロテクト:プロテクトしない & I2C1SEL_PRI // I2C1のピン選択:主ピンを使用する & POSCMOD_NONE // 主発振器:使用しない ) /// 漢字ドット・パターン・テーブル // 「温度」の上半分 const unsigned char font_ondoH[] = { 0b00000000, 0b00010000, 0b01100000, 0b00000001, 0b00000110, 0b00000000, 0b00000000, 0b01111110, 0b01001010, 0b01001010, 0b01001010, 0b01001010, 0b01001010, 0b01111110, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11111100, 0b00100100, 0b00100100, 0b00100100, 0b11111100, 0b10100100, 0b10100111, 0b10100100, 0b11111100, 0b00100100, 0b00100100, 0b00100100, 0b00000000, }; // 「温度」の下半分 const unsigned char font_ondoL[] = { 0b00000000, 0b11000000, 0b00110000, 0b00001100, 0b01000011, 0b01000000, 0b01111110, 0b01000010, 0b01000010, 0b01111110, 0b01000010, 0b01111110, 0b01000010, 0b01000010, 0b01111110, 0b01000000, 0b00000000, 0b10000000, 0b01100000, 0b10011111, 0b10000000, 0b10000010, 0b01000010, 0b01000110, 0b00101010, 0b00010010, 0b00110010, 0b01001010, 0b01000110, 0b10000000, 0b10000000, 0b00000000, }; /// 温度値メッセージ・テーブル char MsgData[] = "xx゚C"; // 例:"18゚C" #define TEMP_HIST_MAX 45 char temp_sign= 1; // 本番は、ADC処理関数の中で、極性判断して、このフラグを制御するつもり。デモは、+表示固定。 char Temperature= 18; // デモ用固定表示 /// プロトタイプ宣言 void print_temp(char Temperature, char temp_sign); void ltostring(char digit, unsigned long data, char *buffer); void print_Yaxis(void); int main(void) { char i,y; //// I/O設定 AD1PCFG = 0xFFFF; // A/D Digi 選択:全デジタルI/Oに設定 CLKDIV = 0x0000; // System Clock devider 1:1 /// Setup PORT In/Out TRISB = 0x0000; // all output TRISAbits.TRISA3= 0; // 赤LED:デバッグ用 N.Ishii 161118 TRISAbits.TRISA4= 0; // 緑LED:デバッグ用 N.Ishii 161118 LATAbits.LATA3 = 1; // 赤LED消灯 161118 LATAbits.LATA4 = 1; // 緑LED消灯 161118 /// 液晶表示器の初期化と開始メッセージ表示 LCD_init(); LCD_locate(0,0); // 原点(左上)に設定: N.Ishii 追記 161117 LCD_clear(LCD_WIDTH * LCD_BANKS); // 全画面クリア(84dot*48dot/8(6バンク)161117 // LCD_clear(504byte);全504byte(84*48=4032dot分クリアすることになる) // 下請け関数は、SPI_tx_byte(0,1); // 第1引数:書込みデータ=0で白、1=黒/ 第2引数:1=データ、0= コマンド //// 文字列(メッセージ)表示-------------------------------------------------------------------------------- LCD_ROMstr("Start Test !!"); // 1stメッセージ LCD_locate(18,2); // x=4キャラ目(横4キャラ目より表示:1キャラ幅5dot+1dot自動スペースで1文字構成=6dot幅 // になるので、4キャラ目のx座標(dot単位)指定= (4-1)*6= 18 になる。) LCD_ROMstr("by N.Ishii"); // 2stメッセージ delay_ms(5000); //// 全キャラクタ表示(192文字)----------------------------------------------------------------------------- /// 1画面目: 84文字表示 y= 0; LCD_locate(0,y); for(i=0; i<84; i++) { if((i>13) && (i%14==0)){ y++; LCD_locate(0,y); } LCD_char(i+0x20); } delay_ms(5000); /// 2画面目: 残り84文字表示 LCD_clear(LCD_WIDTH * LCD_BANKS); // 全画面クリア y= 0; LCD_locate(0,y); for(i=0; i<84; i++) { if((i>13) && (i%14==0)){ y++; LCD_locate(0,y); } LCD_char(i+(0x20+84)); // 0x74='t'から } delay_ms(5000); /// 3画面目: 残り24文字表示 LCD_clear(LCD_WIDTH * LCD_BANKS); // 全画面クリア y= 0; LCD_locate(0,y); for(i=0; i<24; i++) { if((i>13) && (i%14==0)){ y++; LCD_locate(0,y); } LCD_char(i+(0x74+84)); // 0xC7='ヌ'から最後まで } delay_ms(5000); //// 簡易グラフィック温度計の、画面デモ----------------------------------------------------------------------------- LCD_clear(LCD_WIDTH * LCD_BANKS); // 全画面クリア print_temp(18, temp_sign); // "+ 18゚C"固定表示 print_Yaxis(); // Y座標描画 LATAbits.LATA4 = 0; // 緑LED点灯 while(1); } /******************************* * 温度を表示 ********************************/ void print_temp(char Temperature, char temp_sign) { unsigned char *pc; /// タイトル:"温度"を表示 LCD_locate(0, 0); pc = (unsigned char *)font_ondoH; LCD_set_data(pc, 32); LCD_locate(0, 1); pc = (unsigned char *)font_ondoL; LCD_set_data(pc, 32); /// 符号を表示 LCD_locate(0, 3); if (temp_sign == 1) { LCD_char('+'); } else { LCD_char('-'); } /// 温度値(バイナリ)を文字列に変換して、符号の後(x= 3キャラ目(dot指定で、x=12)から2桁整数で表示 /// 本番は、AD変換生データより計算した、温度値(Temperature)を元に、表示するつもり。 ltostring(2, Temperature, MsgData);// 数値をASCIIに変換しバッファへ格納 LCD_locate(10, 3); LCD_ROMstr(MsgData); // 温度値表示 } /************************** * グラフのY軸表示 ***************************/ void print_Yaxis(void) { int x, y; unsigned char c; c = 0xff; x = LCD_MAX_X - TEMP_HIST_MAX - 2; /// 縦線を表示 for (y = 0; y < 6; y++) { LCD_locate(x, y); LCD_set_data(&c, 1); LCD_locate(x + TEMP_HIST_MAX + 1, y); LCD_set_data(&c, 1); } /// 10℃ごとの刻みを表示 for (y = 0; y <= LCD_MAX_Y; y += 10) { draw_point(x-1, y); draw_point(x + TEMP_HIST_MAX + 2, y); } } /************************************* * 数値からASCII文字列に変換する関数 **************************************/ void ltostring(char digit, unsigned long 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; // buffer++; while((i < digit-1)&&(*buffer == '0')) // 上位桁が0の間 { *buffer = ' '; // ブランクに変換 buffer++; i++; } }