ふとネットでLCDのサンプルプログラムを見ていたら、簡単な定義だけでLCDとPICのポートの任意設定ができるものがあった。対応する箇所は同じだが、シンプルですばらしい。ビットシフトとかで頭を使ったのに、こんなに良い方法があるとは、といった感じだ。内容は次の通りでした。
main.c上の変更対応箇所はPORTA用のTRISAの設定で全く同じ方法です。
TRISA = 0b00111000; //ポートAの方向を設定 RA3,RA4,RA5 INPUT RA6用
lcd.cでは以下の定義部追加と先の2関数の差し替えで対応します。
--------------------------------------------------------
#define lcd_d7 RA6
#define lcd_d6 RA2
#define lcd_d5 RA1
#define lcd_d4 RA0
--------------------------------------------------------
void lcd_data_byteset(unsigned char c){
lcd_d4 = (( c ) & 0x01);
lcd_d5 = (( c >> 1 ) & 0x01);
lcd_d6 = (( c >> 2 ) & 0x01);
lcd_d7 = (( c >> 3 ) & 0x01);
LCD_STROBE;
}
void lcd_data_set(unsigned char c){
lcd_d4 = (( c >> 4 ) & 0x01);
lcd_d5 = (( c >> 5 ) & 0x01);
lcd_d6 = (( c >> 6 ) & 0x01);
lcd_d7 = (( c >> 7 ) & 0x01);
LCD_STROBE;
lcd_d4 = (( c ) & 0x01);
lcd_d5 = (( c >> 1 ) & 0x01);
lcd_d6 = (( c >> 2 ) & 0x01);
lcd_d7 = (( c >> 3 ) & 0x01);
LCD_STROBE;
}
---------------------------------------------------------
#defineで定義したポートビット単体に引数cの対応するビットシフト時の値をいちいち読み込んでいるので、ポートに対して1対1に設定できている。
lcd_data_setについて確認してみると。
引数cのデータを(C7,C6,C5,C4,C3,C2,C1,C0)とすると最初の4行で上位の(C7,C6,C5,C4)が(RA6,RA2,RA1,RA0)に出力される
またLCD_STROBE;の後の4行では引数cの下位の(C3,C2,C1,C0)が(RA6,RA2,RA1,RA0)に出力される。きちんと引数cの上位データ値、下位データ値と設定できています。ということで、ポートの定義を変えることのみで対応ができる。早速今までのlcd.cの部分を上記に変更して確認してみた。こんなにシンプルに任意ポート対応ができてしまいました。やはり先人はすごいですね。THANKS!
なお、参考プログラムに関しての利用はホームページ上で以下の通り問題ないようです。
----------------------------------------------------------------------------------
当サイトのソフトウエアは特に記述が無い限りPDS(Public Domain Software)とします。
作権表示義務無し。商用利用、改造、自由。連絡不要とします。
役立ててやって下さい。
作権表示義務無し。商用利用、改造、自由。連絡不要とします。
役立ててやって下さい。
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
これだけ簡単にポート定義とTRISAの簡単な書き換えだけでLCDポートとPIC側の任意ポート対応できるならファンクション化は必要ないですね。