PIC16F690はI2Cのマスターモードのシーケンスが書かれてない?
安物マイコンで制御むりだお・・と思ったけどなんとかできたよ
ちなみにブロック図的にこんな回路
ものすごく無理強いさせました

ちなみにMPLAB IDEのHITEC-C v9.80です
安物なんでピン数が少ない。
IOエキスパンダICでI2Cから変換。
マイコンの仕様書見てもI2CのSCLを生成するプリスケーラやクロックジェネレータがなく
直接IOピンを振れさせるのかとおもいきや
実際にそうでしたわw
ただし、SSPレジスタは登録しないといけませんI2C自体0~400kHzで動かせますからね
3.4MHzなるとシーケンスは違ってきますので。
USB2.0とUSB1.1では違う
イニシャライズとしてはこう↓
マイコンのIOピンを定義
SSPレジスタをセット
↓
PCA9554Aのレジスタに
コンフィギュレーションをセットして
IOの入出力を決める
↓
TC1602のLCDのファンクションセット
RS,RW,Eは、LCDにデータを送る前に送ります。
PCA9554Aのターンアラウンドタイムが来た後に、WS,RW,Eをリセットすること
そうでないとLCDに文字が映らない。
少なくともI2Cストップシーケンスを発行してる時にターンアラウンドタイムは
終わるので、次の処理でいいでしょう
※volatile定義されてない変数を間にはさむと動かなくなるかもよ?
これで動くので、作ったコードおいておくよー!
・XTALの定義があるので注意
・TABはデフォルトで4です
lcd_init()で初期化
putsLCD(char *s)=文字列表示。¥n(改行)、¥t(タブ)付き!
printLCD(char *str, ...)=通常のprintf関数みたいな使い方。%d、%s対応!
※まだ開発がいるけどとりあえず出力のみ
LCDはSC1602と共通なので移植できる
ここまでやるのに5日も費やしたなんて・・
開発環境がLiteなせいか浮動小数点は扱えなかった・・・(´・ω・`)
LCDPreDefine.h
#ifndef _LCD_PREDEFINE_
#define _LCD_PREDEFINE_
#include<stdio.h>
#include<string.h>
#define _XTAL_FREQ 16000000
#define RSL RC4
#define RWL RC3
#define EL RC6
#define SCL TRISB6 // I2C bus
#define SDA TRISB4 //
#define SCL_IN RB6 //
#define SDA_IN RB4 //
#define DEVICE_ADDRESS 0b01110010
#define DEVICE_COMMAND_OUTPUT 0b00000001
#define DEVICE_COMMAND_CONFIG 0b00000011
#define ID_INC 0x6
#define ID_DEC 0x4
#define SHIFT_ON 0x5
#define SHIFT_OFF 0x4
#define DISP_ON 0xC
#define DISP_OFF 0x8
#define CURSOR_ON 0xA
#define CURSOR_OFF 0x8
#define BLINK_ON 0x9
#define BLINK_OFF 0x8
#define DISP_SHIFT 0x18
#define CURSOR_MOVE 0x10
#define RIGHT 0x14
#define LEFT 0x10
#define BIT_8 0x30
#define BIT_4 0x20
#define DUTY_16 0x28
#define DUTY_8 0x20
#define FONT_10 0x24
#define FONT_7 0x20
#define TAB_SPACE 4
void lcd_configSet(void);
void lcd_dataSet(void);
void lcd_endSet(void);
void i2c_dly(void);
void i2c_start(void);
void i2c_stop(void);
unsigned char i2c_rx(char ack);
bit i2c_tx(unsigned char d);
void lcd_config(int sel,unsigned char data);
void lcd_init(void);
void locate(int x, int y);
void scroll(int shift,int direction,int num);
int putcharLCD(char data);
int putsLCD(char *s);
int getcharLCD(void); // No program
int getsLCD(void); // No program
int printLCD(const char *str, ...);
#endif
処理が長いので他のヘッダファイルは続きね!
LCD.h↓(
作成翌日、小数、unsign対応させました)
続きを読む
テーマ : 趣味と日記
ジャンル : 趣味・実用