「PIC16F88でコンデンサの容量を比べる」でテストした回路のプリント基板を作成した。
作成したのはいいのだが、LCD(SC1602BS)の表示部分は本来「PIC16F84A + SC1602BS + XC8」で使わせてもらっているものと同じで、
E–>RB0, RS–>RB1, DB4-7–>RB4-7
という配線を前提としたプログラムになっている。
ブレッドボード上ではこの通りだったのが、どういうわけかPCB作成ソフトを経ると、
RS–>RB5, E–>RB6, DB4-7–>RB0-3
という配線に変わってしまっていて、当然電源を入れても全く何も表示されなかった。
しかも、そのことにしばらく気付かなかったので、あれこれ余分なチェックばかりをしていた。
ブレッドボード上での間違えなら、コードを直すより配線を変える方を選ぶわけだが、プリント基板になってしまっているのでコードを直すしかない。
まず、機械的に変更できるピンの設定は以下のように直す。
//#define LCD_E RB0
#define LCD_E RB6
//#define LCD_RS RB1
#define LCD_RS RB5
さらに、ポートに直接データを書いているものは、あまり考えずに以下のようにすぐ書き換えられる。
//LCD_PORT=0x30;
LCD_PORT=0x03;
//LCD_PORT=0x20;
LCD_PORT=0x02;
EもRSもゼロで、データの部分は
DB7,DB6,DB5,DB4,—,—,RS,E
を
—,E,RS,—,DB7,DB6,DB5,DB4
にしてしまったのだから、データを4ビット分右へシフトして代入すればいいわけだ。
通常のデータは上位4ビットと下位4ビットに分けてLCD(SC1602BS)に送っているので、若干面倒だが以下のように変更する。
void Putc_LCD4(char c, char rs){
__delay_us(52);
LCD_RS=rs;
//rs=LCD_PORT & 0x0F;
rs=LCD_PORT & 0xF0;
//上の3行は、ポート上のEやRSの入っている部分を変数rsへキープしている処理だ。
//キープするべき部分が上位4ビットに変わってしまったので0xF0とのANDを取るように変更した。
//LCD_PORT=((c & 0xF0)+rs);
LCD_PORT=((c >> 4)+rs);
//上の2行はLCD(SC1602BS)に送るデータの上位4ビット分をセットしている部分だ。
//下位4ビットになるように、右へ4ビット分シフトするように変更した。
STROBE;
//LCD_PORT=((c << 4)+rs);
LCD_PORT=((c & 0x0F)+rs);
//上の2行はデータの下位4ビットをセットしている部分だ。
//変更後はそのまま下位に置けばいいのでシフトせずに0x0FとのANDを取るだけにした。
STROBE;
}