PIC12F1822 AQM0802A表示テスト
JH7UBC 2019.2.3
PIC12F1822でI2C LCD AQM0802Aに文字を表示するテストをします。
PIC12F1822は、MSSPモジュールを内蔵していますので、そのI2Cモードを使います。
SSP1CON1レジスタで、SSPEN = 1,bit3:bit0を1000(I2Cマスターモード)とします。
これにより、RA1がSCLピン、RA2がSDAピンになります。
I2Cのクロックは、SSP1STATレジスタでSMP=1として、標準速度(100KHz)とします。
I2Cのクロック速度を決めるSSP1ADDの値は
PICのクロックFosc=32MHz、I2CのクロックClock=100KHzとすると
SSP1ADD = Fosc / (4 * Clock) - 1 = 32000000 / (4 * 100000) - 1 = 79 = 0x4F です。
回路図です。電源は、乾電池2本(3V)です。
I2Cバスのプルアップ抵抗は、AQM0802Aモジュールに内蔵されているので、つけていません。
ブレッドボードです。
プログラムです。
基本的には、PIC16F883のものと同じでが、レジスタ名が若干変わっています。
#include <stdio.h> #include <stdlib.h> #include <xc.h> #include <pic12f1822.h> // CONFIG1 #pragma config FOSC = INTOSC #pragma config WDTE = OFF #pragma config PWRTE = ON #pragma config MCLRE = OFF #pragma config CP = OFF #pragma config CPD = OFF #pragma config BOREN = ON #pragma config CLKOUTEN = OFF #pragma config IESO = OFF #pragma config FCMEN = OFF // CONFIG2 #pragma config WRT = OFF #pragma config PLLEN = ON #pragma config STVREN = ON #pragma config BORV = HI #pragma config LVP = OFF #define _XTAL_FREQ 32000000 #define LCD_addr 0x7C //3E+0 /* I2C 初期化*/ void I2C_init(){ SSP1CON1 = 0x28; //SSPEN = 1,I2C Master Mode SSP1STATbits.SMP = 1; //標準速度モード(100KHz) SSP1ADD = 0x4F; //Fosc/(4*Clock)-1 Clock=100kHz,Fosc=32MHz } /* スタートコンディション */ void I2C_start(){ SEN = 1; while(SEN); } /* ストップコンディション */ void I2C_stop(){ SSP1IF = 0; PEN = 1; while(PEN); SSP1IF = 0; } /* I2Cに1byte送信 */ void I2C_write(unsigned char dat){ SSP1IF = 0; SSP1BUF = dat; while(!SSP1IF); } /* write command */ void LCD_cmd(unsigned char cmd){ I2C_start(); //start condition I2C_write(LCD_addr); //send slave address I2C_write(0x00); //send control byte I2C_write(cmd); //send command I2C_stop(); //stop condition } /* write charactor */ void LCD_char(unsigned char dat){ unsigned char ackn; I2C_start(); //start condition I2C_write(LCD_addr); //send slave address I2C_write(0x40); //send control byte I2C_write(dat); //send data I2C_stop(); //stop condition } /* 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(0x70); //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 } /* Clear Display */ void LCD_clear(){ LCD_cmd(0x01); __delay_ms(1); __delay_us(80); } /* Return Home `*/ void LCD_home(){ LCD_cmd(0x02); __delay_ms(1); __delay_us(80); } /* Cursor 2line top */ void LCD_2line(){ LCD_cmd(0xC0); } /* write 1 charactor to LCD */ void putch(unsigned char ch){ LCD_char(ch); } /* write string */ void putstr(const unsigned char *s){ while(*s){ LCD_char(*s++); } } void main() { OSCCON = 0b01110000 ; // 内部クロック8MHz ANSELA = 0b00000000 ; // アナログは使用しない TRISA = 0b00001110 ; // RA1,RA2,RA3は入力、他は出力 PORTA = 0b00000000 ; // 出力ピンの初期化 I2C_init(); LCD_init(); putstr("JH7UBC"); unsigned char count = 0; while(1){ LCD_2line(); printf("%3d",count); count++; __delay_ms(500); } } |