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);
}
}

inserted by FC2 system