//****************************************************************************** // BY−LCD I2C  PIC12F1840で表示させる // CYTEC 2021-02-21    製作:JE1AHW/内田恵介 // 開発ソフト: mikroC PRO Ver7.6 // // -------------------------------------------------------------------------- // 2021-02-21 コ−ディング開始 // 2020-02-28 一文字表示ができるようになる。まだ、バグあり。 動作が不安定 // 2020-03-02 完成する。 // // // //****************************************************************************** // ■■■ BY−LCDピンアサイン ■■■■■■■■■■■■■■■■■■■■■■ /* PCF8574A OUT LCD iNPUT ADD:0x3F(0x7E) P7 = DB7 P6 = DB6 P5 = DB5 P4 = DB4 P3 = BackLight (1=ON) P2 = E P1 = R/W P0 = RS RS = 0:コマンド RS = 1:文字モ−ド RW = 0 */ // ■■■ 設定 ■■■■■■■■■■■■■■■■■■■■■■ #define addr 0x7E //0x3F -> 0x7E 0x27 -> 0x4E #define SCL PORTA.B1 //I2C Clock #define SDA PORTA.B2 //I2C Data //■■■ 関数宣言 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ void main(); void PIC12F1840_set(); void await(unsigned long ct); void I2C_ini(); void start(); void stop(); void wr_Byte(unsigned char x); void cmd_LCD(unsigned char com); void put_LCD(unsigned char cha); void LCD_ini(); void LCD_Pos(unsigned char keta,unsigned char gyou); void LCD_str(unsigned char *c); //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■■■ メイン関数 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ void main() { unsigned short cout= 0; unsigned char buff[8]; PIC12F1840_set(); // PIC設定 LCD_ini(); // LCD初期化 LCD_pos(1,6); // Fix test LCD_str("CYTEC"); while(1) { PORTA.B5 = 1 ; //LED Delay_ms(500); PORTA.B5 = 0 ; Delay_ms(500); cout++; //Count UP Test ShortToStr (cout,buff); LCD_pos(2,6); LCD_str(buff); } } //■■■ PIC12F1840 初期化 ■■■■■■■■■■■■■■■■■■■■■■■■■ void PIC12F1840_set() //PullUP使用 { OSCSTAT = 0b01011000 ; //PLLを使う場合 Clock=32MHz OSCCON = 0b11110000 ; // 内部クロックは8MHzとする 7bit=4xPLL ON 1 OPTION_REG = 0b00001000 ; //内部プルアップ抵抗を使用する Bit7=0 WPUA = 0b00111110 ; // プルアップ抵抗設定 使用=1未使用=0 ANSELA = 0b00000000 ; // A/D入力ピン設定 入力=1 TRISA = 0b00000000 ; // 入出力設定 0=OUTPUT 1=INPUT PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) } //■■■ Wate Timer ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ void await(unsigned long ct) { while(ct>0) ct--; } //■■■ I2C初期化 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ void I2C_ini() { SDA = 1; SCL = 1; } //■■■ I2C Start ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ void start() { SDA = 1; // Start condition await(3); SCL = 1; await(3); SDA = 0; await(3); SCL =0; await(3); } //■■■ I2C Stop ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ void stop() { SCL = 1; // stop condition await(3); SDA = 0; await(3); SDA = 1; await(3); SCL = 0; await(3); } //■■■ I2C 8bit Data 書き込み ■■■■■■■■■■■■■■■■■■■■ void wr_Byte(unsigned char x) { unsigned char k; for(k=0;k<8;k++){ if(x & 0x80) SDA = 1; else SDA = 0; await(3); SCL = 1; await(3); SCL = 0; await(3); SDA = 0; x <<= 1; } SCL = 1; await(3); SCL = 0; } //■■■ LCDコマンド 書き込み ■■■■■■■■■■■■■■■■■■■■■■■ void cmd_LCD(unsigned char com) { unsigned char tmp_H,tmp_L; tmp_H = ((com & 0xF0) | 0x0C); //上位4bit 0x0c = 0b1100 tmp_L = ((com << 4) | 0x0C); //下位4bit 0x0c = 0b1100 // PCF8574A OUT: P7 , P6 , P5 , P4 , P3 , P2 , P1 , P0 // DB7 DB6 DB5 DB4 BL EN RW RS // イネ−ブル処理 下位4bit b1100 = 0x0C // b1000 = 0x08 //書き込み start(); wr_Byte(addr); // Add 0x7E await(30); wr_Byte(tmp_H); // Data Hi-4bit await(30); wr_Byte(0x08); // 0b00001000 0x08 EN=0 await(30); wr_Byte(tmp_L); // Data Lo-4bit await(30); wr_Byte(0x08); // 0b00001000 0x08 EN=0 await(30); stop(); } //■■■ LCD 一文字 書き込み ■■■■■■■■■■■■■■■■■■■■■■■■ void put_LCD(unsigned char cha) { unsigned char buf_H=0,buf_L=0; buf_H = ((cha & 0xF0) | 0x0D); //上位4bit 0x0D = 0b1101 buf_L = ((cha << 4) | 0x0D); //下位4bit 0x0D = 0b1101 // PCF8574A OUT: P7 , P6 , P5 , P4 ,, P3 , P2 , P1 , P0 // DB7 DB6 DB5 DB4 BL EN RW RS // // 4bit-DATA,BL=1,EN=1,RW=0,RS=1 : 0b00001101 0x0D // 4bit-DATA,BL=1,EN=0,RW=0,RS=1 : 0b00001001 0x09 start(); wr_Byte(addr); // Add 0x7E await(30); wr_Byte(buf_H);// Data Hi-4bit await(30); wr_Byte(0x09); // 0b00001001 0x09 EN=0 await(30); wr_Byte(buf_L);// Data Lo-4bit await(30); wr_Byte(0x09); // 0b00001001 0x09 EN=0 await(30); stop(); } //■■■ LCD「文字列」 書き込み  ■■■■■■■■■■■■■■■■■■■■■ //表示方法 // LCD_Pos(0x05); // LCD_str(call); 配列の表示 unsigned char call[]={"JE1AHW"}; //-------------------------------------------------------------------------- void LCD_str(unsigned char *c) { start(); put_LCD(" "); //無いとダメでした。 while(*c) { put_LCD(*c); *c++; } stop(); } //■■■ LCD 表示ポジション設定 ■■■■■■■■■■■■■■■■■■■■■ void LCD_Pos(unsigned char gyou,unsigned char keta) { unsigned char tmp; cmd_LCD(0x02); //無いとダメ if(gyou == 1) tmp = 0x80; //1行目 if(gyou == 2) tmp = 0xC0; //2行目 tmp = tmp+(keta - 1); // 表示桁 cmd_LCD(tmp); gyou = 0; keta = 0; } //■■■ LCD 初期化 ■■■■■■■■■■■■■■■■■■■■■■■■ void LCD_ini() { Delay_ms(15); // cmd_LCD(0x30); // 8bit set ファンクションセット Delay_ms(5); cmd_LCD(0x30); // Delay_ms(5); cmd_LCD(0x30); // Delay_ms(5); cmd_LCD(0x20); // 4bit set ファンクションセット Delay_ms(5); //-------------------------------------- // cmd_LCD(0x07); // エントリ−モ−ド 有るとダメ。 // Delay_ms(5); cmd_LCD(0x14); // カ−ソル表示/シフト Delay_ms(5); cmd_LCD(0x28); // Function Set 28 Delay_ms(5); cmd_LCD(0x0c); // 表示ON OFF Delay_ms(5); } //****** END ****************************************************************