//*************************************************************** // I2C LCD表示テスト プログラム // CYTEC  2018/04 // //  PIC12F1840+ACM1602N1-FLW-FBW // // mikroC PRO Ver7.1 // // 04-06:コ−ディング開始 // 04-13:表示できた。 // // // //*************************************************************** // コンフィギュレーションの設定 PIC12F1840 /* FOSC = INTOSC // 内部クロックを使用する(INTOSC) WDTE = OFF // ウオッチドッグタイマー無し(OFF) PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON) MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(OFF) CP = OFF // プログラムメモリーを保護しない(OFF) CPD = OFF // データメモリーを保護しない(OFF) BOREN = ON // 電源電圧降下常時監視機能ON(ON) CLKOUTEN = OFF // CLKOUTピンをRA6ピンで使用する(OFF) IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF) FCMEN = OFF // 外部クロック監視しない(FCMEN_OFF) WRT = OFF // Flashメモリーを保護しない(OFF) PLLEN = OFF // 動作クロックを32MHzでは動作させない(OFF) STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON) BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI) LVP = OFF // 低電圧プログラミング機能使用しない(OFF) */ //■■■ 関数宣言 ■■■■■■■■■■■■■■■■■■■■■■■■■ void main(); void PIC12F1840_set(); void await(unsigned long ct); void wr_Byte(unsigned char DT); void cmd_LCD(unsigned char x); void data_LCD(unsigned char c); void LCD_ini(); void start(); void stop(); void LCD_Pos(unsigned char GY,unsigned char KT); //■■■ ピンアサイン ■■■■■■■■■■■■■■■■■■■■■■■ #define SCL PORTA.B1 //I2C Clock #define SDA PORTA.B2 //I2C Data #define LED PORTA.B5 //■■■ PIC12F1840 初期化 ■■■■■■■■■■■■■■■■■■■■ void PIC12F1840_set() { OSCSTAT = 0b01011000; //PLLを使う Clock=32MHz OSCCON = 0b01111000 ; // 内部クロックは8MHzとする // OPTION_REG = 0b00000000 ; // デジタルI/Oに内部プルアップ抵抗を使用する // WPUA = 0b00110111 ; // プルアップ抵抗使用ピン設定 ANSELA = 0b00000000 ; // アナログは使用しない(すべてデジタルI/Oに割当てる) TRISA = 0b00000000; // 入出力設定 0=OUTPUT 1=INPUT PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) } //■■■ Wate Timer ■■■■■■■■■■■■■■■■■■■■■■■■ void await(unsigned long ct) { while(ct>0) ct--; } //■■■ I2C 8bit Data 書き込み ■■■■■■■■■■■■■■■■■■■■ void wr_Byte(unsigned char DT) { unsigned int k; for(k=0;k<8;k++){ if(DT & 0x80) SDA = 1; else SDA = 0; await(3); SCL = 1; await(3); SCL = 0; await(3); SDA = 0; DT <<= 1; } SCL = 1; await(3); SCL = 0; } //■■■ I2C Start ■■■■■■■■■■■■■■■■■■■■ void start() { SCL = 1; // start condition await(5); SDA = 1; // await(5); SDA = 0; // await(5); SCL = 0; // await(5); } //■■■ I2C Stop ■■■■■■■■■■■■■■■■■■■■ void stop() { await(5); SCL = 1; // stop condition await(5); SDA = 0; await(5); SDA = 1; await(5); SCL = 0; await(5); } //■■■ LCD cmd 書き込み ■■■■■■■■■■■■■■■■■■■■ void cmd_LCD(unsigned char x) { start(); wr_Byte(0xa0); //LCDアドレス 固定 10100000 wr_Byte(0x00); //RS Flag Cmd Write wr_Byte(x); stop(); } //■■■ LCD Data 書き込み ■■■■■■■■■■■■■■■■■■■■ void data_LCD(unsigned char c) { start(); wr_Byte(0xa0); //LCDアドレス10100000 wr_Byte(0x80); //RS Flag Data Write wr_Byte (c); stop(); } //■■■ LCD 初期化 ■■■■■■■■■■■■■■■■■■■■■■■■ void LCD_ini() { cmd_LCD(0x01); // Clear LCD await(10); cmd_LCD(0x38); //機能制御:8bitモ−ド、2ライン、5x8ドット await(10); cmd_LCD(0x0C); //ディスプレ−ON、カ−ソルOFF,ブリンクOFF await(10); cmd_LCD(0x06); //カ−ソル移動、スクロ−ルOFF await(10); // cmd_LCD(0x02); //カ−ソルホ−ム // await(10); } //■■■ LCD 表示ポジション ■■■■■■■■■■■■■■■■■■■■■ void LCD_Pos(unsigned char GY,unsigned char KT) { unsigned char n,u; if(GY==1) n=127; // 表示アドレス設定 1行目 128+桁数 if(GY==2) n=191; //          2行目 192+桁数 u=n+KT; cmd_LCD(u); } //■■■ メイン関数 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ void main() { PIC12F1840_set(); LCD_ini(); while(1) { unsigned char i; unsigned char table[]={"JE1AHW CYTEC "}; LCD_Pos(2,1); //表示場所指定 for(i=0;i<13;i++) //標準表示方法 { data_LCD(table[i]); } LCD_Pos(1,4); //表示場所指定 data_LCD(0b01010100); //一文字表示方法 } }