/* * * PIC12F1822 * シリアル通信でLCDディスプレイへ(AE-AQM1602A)表示 * - 2021/02/15 - * */ //ヘッダファイルの読み込み //-------------------------------------------------------------- #include #include // printfを使うために必要なライブラリ // クロック周波数指定 //-------------------------------------------------------------- #define _XTAL_FREQ 32000000 // LCDディスプレイ(AE-AQM1602A)のアドレス //-------------------------------------------------------------- #define LCD_addr 0x7C // プロトタイプ宣言 //-------------------------------------------------------------- void I2C_init(void); void I2C_start(void); void I2C_stop(void); void I2C_write(unsigned char dat); void LCD_cmd(unsigned char cmd); void LCD_char(unsigned char dat); void LCD_init(void); void LCD_clear(void); void LCD_home(void); void LCD_cursor(unsigned x,unsigned y); // ============================================================ // //   メインプログラム // // ============================================================ /*           12F1822 * −−−−−− * VDD −| 1 8 |− VSS * RA5 −| 2 7 |− AN0/RA0 * AN3/RA4 −| 3 6 |− AN1/RA1/SCL → LCD(SCL) * RA3 −| 4 5 |− AN2/RA2/SDA → LCD(SDA) * −−−−−− */ void main() { //---------------------------------------------------------- // PICマイコン初期設定 //---------------------------------------------------------- OSCCON = 0b01110000; // 内部クロック周波数:8MHz ANSELA = 0b00000000; // 全てデジタルモード TRISA = 0b00000110; // SCL[6Pin]、SDA[5Pin]を入力ピンに設定 //---------------------------------------------------------- // シリアル通信(I2C)初期設定 //---------------------------------------------------------- SSP1STAT = 0b10000000; // 標準モード(100kHz) SSP1CON1 = 0b00101000; // マスター(制御する側)に設定 SSP1ADD = 0b01001111; // 通信速度 = Fosc/(4*Clock)-1 = 32MHz/(4*100kHz)-1 = 79(10進数) //---------------------------------------------------------- // LCDディスプレイと通信 //---------------------------------------------------------- // ディスプレイの初期化 LCD_init(); // 1列目に表示 LCD_cmd(0x80); printf("Hello World!"); // 2列目に表示 LCD_cmd(0xC0); printf("0123456789"); } // ============================================================ // //   I2C 通信開始 // // ============================================================ void I2C_start() { SEN = 1; while(SEN); } // ============================================================ // //   I2C 通信終了 // // ============================================================ void I2C_stop() { SSP1IF = 0; PEN = 1; while(PEN); SSP1IF = 0; } // ============================================================ // //   I2C データ送信 // // ============================================================ void I2C_write(unsigned char dat) { SSP1IF = 0; SSP1BUF = dat; while(!SSP1IF); } // ============================================================ // //  LCDディスプレイの初期化 // // ============================================================ void LCD_init() { __delay_ms(40); //40ms wait LCD_cmd(0x38); //8bit,2line LCD_cmd(0x39); //IS=1 : extention mode set LCD_cmd(0x14); //Internal OSC Frequency LCD_cmd(0x7A); //Contrast set LCD_cmd(0x56); //Power/ICON/Contrast Control LCD_cmd(0x6C); //Follower control __delay_ms(200);//200ms wait LCD_cmd(0x38); //IS=0 : extention mode cancel LCD_cmd(0x0C); //Display ON LCD_cmd(0x01); //Clear Display __delay_ms(2); //wait more than 1.08ms } // ============================================================ // // LCDへコマンドを送信 // // ============================================================ void LCD_cmd(unsigned char cmd) { I2C_start(); I2C_write(LCD_addr); I2C_write(0x00); // 0x00(コマンドの送信を示すbit) I2C_write(cmd); I2C_stop(); } // ============================================================ // // LCDへ表示するデータの送信 // printf文を使用するためにputch関数を使用する // // ============================================================ void putch(unsigned char text) { I2C_start(); I2C_write(LCD_addr); I2C_write(0x40); // 0x40(データの送信を示すbit) I2C_write(text); I2C_stop(); }