JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC16F1705 AQM0802A表示テスト

2019-04-10 09:26:59 | PIC16F1705

 PIC16F1705で、I2C LCD AQM0802Aの表示テストをします。

 PIC16F1705はデフォルトでSCLはRC0に、SDAはRC1に割り当てられていますので、AQM0802AのSCLとSDAを下の回路図のように接続します。

 電源は、乾電池2本(3V)です。I2Cのプルアップ抵抗は、AQM0802Aモジュールに内蔵されていますので、つけていません。

 ブレッドボードです。

 1行目に当局のコールサインが表示され、2行目に数字のカウントアップが表示されます。

 プログラムです。

 I2Cのピンの設定ですが、SCLは出力設定、SDAは出力と入力両方の設定が必要です。

 SCL,SDAピンともTRISCは入力に設定します。

-----------------------------------------------------------------

/*
 * File:   main.c
 * Author: JH7UBC Keiji Hata
 * PIC16F1705 AQM0802A表示テスト
 * Created on 2019/04/09
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
 
// CONFIG1
#pragma config FOSC = INTOSC    //内部クロックを使う
#pragma config WDTE = OFF       //ウォッチドックタイマー無効
#pragma config PWRTE = ON       //パワーアップタイマーを有効にする
#pragma config MCLRE = OFF      //MCLRピンをRA3として使用する
#pragma config CP = OFF         //プログラムメモリを保護しない
#pragma config BOREN = ON       //ブラウンアウトリセットを有効にする
#pragma config CLKOUTEN = OFF   //クロック出力を無効とし、RA4ピンとして使用する
#pragma config IESO = OFF       //内部・外部クロックの切り替えでの起動を行わない
#pragma config FCMEN = OFF      //外部クロックを監視しない
 
// CONFIG2
#pragma config WRT = OFF        //フラッシュメモリを保護しない
#pragma config PPS1WAY = OFF    //ロック解除シーケンスで何度でもPPSLOCKをセット/クリアできる
#pragma config ZCDDIS = ON      //ゼロクロス検出回路無効
#pragma config PLLEN = ON       //×4PLLを動作させる
#pragma config STVREN = ON      //スタックオーバーフローリセットを行う
#pragma config BORV = HI        //ブラウンアウトリセット電圧を高(2.7V)に設定
#pragma config LPBOR = OFF      //低消費電力ブラウンアウトリセット無効
#pragma config LVP = OFF        //低電圧プログラミングを行わない
#define _XTAL_FREQ 32000000     //クロック32MHz
#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(){
    SSP1CON2bits.SEN = 1;
    while(SSP1CON2bits.SEN);
}
 
/* ストップコンディション */
void I2C_stop(){
    SSP1IF = 0;
    SSP1CON2bits.PEN = 1;
    while(SSP1CON2bits.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){
    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 initialize */
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 ×4=32MHz
ANSELA = 0b00000000 ; // AN0-AN3を使わない
ANSELC = 0b00000000 ; // AN4-AN6を使わない
TRISA = 0b00000000 ; // 全て出力
TRISC = 0b00000011 ; // RC0,RC1は入力、他は出力
PORTA = 0b00000000 ; // PORTAクリア
PORTC = 0b00000000 ; // PORTCクリア

/* I2Cピン設定 */
RC0PPS = 0x10; //RC0をSCLに割り当てる(出力)
SSPDATPPS = 0x11;//SSPDATにRC4を割り当てる(入力)
RC1PPS = 0x11; //RC1をSDAに割り当てる(出力)

I2C_init();
LCD_init();

printf("JH7UBC");
unsigned char count = 0;

while(1){
LCD_2line();
printf("%4d",count);
__delay_ms(1000);
count++;
}
}
 
------------------------------------------------------------------------
 
 PIC16F1705は、PPSモジュールを内蔵していますので、I2Cのピンも他に設定できると思って、やってみたのですが、他のピンでは表示できませんでした。
 
 I2Cを他のピンに設定する方法をご存知の方、教えていただけるとありがたいです。

最新の画像もっと見る

3 コメント

コメント日が  古い順  |   新しい順
ありがとうございます。 (miura)
2024-05-16 20:24:13
16文字2行のI2C接続LCDで動作させることができました。PPSを使ってRC4,RC5に接続先変更しても動いています。
返信する
PPS設定 (miura)
2024-05-16 20:36:21
SSPDATPPS = 0x15; //RC5->MSSP:SDA;
RC4PPS = 0x10; //RC4->MSSP:SCL;
RC5PPS = 0x11; //RC5->MSSP:SDA;
SSPCLKPPS = 0x14; //RC4->MSSP:SCL;

TRISC = 0x33; // RC0,RC1は別用途
返信する
Re:PPS設定 (JH7UBC)
2024-05-16 23:15:27
miuraさん こんばんは
コメントありがとうございます。

I2Cピンの変更の方法、ありがとうございます。参考になりました。

最近の私は、もっぱらMCCを利用しているためピンの変更も簡単になりました。

でも、人間楽ばかりしていてはいけないですね。
返信する

コメントを投稿