PIC16F877のビルドについての質問です。
PIC初心者です。
MPLAB IDE v8.30を使用して、PIC16F877でLCD SC1602BS*B を駆動しようとしていますが、メインプログラムを書く前に、最初の段階(おそらくは設定かインクルードの方法)でつまづいてしまい、エラーだらけになってしまいます。
・ConfigureのSelectDiviceは、16F877を選択
・ネットで見つけた"lcd_lib3.c"をヘッダとしてインクルード
http://www.picfun.com/p877frame.html
・出てくるエラーは、
・illegal # directive "byte"
・ function declared implicit int
・ undefined identifier "PIN_D0"
等の3種類のエラーです。
どこが悪いのでしょうか?
以下にプログラムと ヘッダーを記載します。
#include<pic.h>
//////// link LCD library
#include <lcd_lib3.c>
// コンフィギュレーションワードの設定
__CONFIG(UNPROTECT & PWRTEN & HS & WRTEN & DEBUGEN & LVPDIS & BORDIS & WDTDIS);
// プロトタイプ宣言
static void pic_init();
// メイン関数
void main(void){
int cnt,j;
pic_init();
lcd_init();//initialize LCD
}
// =============== PICの初期化 =======================
static void pic_init() {
//OSCCON = 0x71;// INTOSC 8MHz
//ANSEL = 0x00;// AN未使用
//ANSELH = 0x00;// AN未使用
ADCON1 = 7; //すべてデジタルI/O
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTE = 0x00;
TRISA = 0x00;
TRISB = 0x00;
TRISC = 0x00;
//TRISD = 0x00;
TRISE = 0x00;
//OPTION = 0x88;// TMR0プリスケーラ:なし
//INTCON = 0xA8;// GIE:1 ,T0IE:1 ,RBIE:1
}
"lcd_lib3.c"の内容
///////////////////////////////////////////////
// LCD control Library
// functions are below
// lcd_init()-------- initialize
// lcd_ready()------- busy check
// lcd_cmd(cmd)------ send command
// lcd_data(string)-- display string
// lcd_clear() ------ clear display
//////////////////////////////////////////////
////// port define to port D
#byte port = 8 //port D
#define set_tris_x set_tris_d
#define rs PIN_D0
#define rw PIN_D1
#define stb PIN_D2
/////////// lcd ready check function
int lcd_ready(){
static int higha;
int high,low;
set_tris_x(0xF0); //upper is input
output_low(rs);
output_high(rw); //read mode
output_high(stb);
high=port & 0xF0; //input upper
output_low(stb);
output_high(stb);
low=port & 0xF0; //input lower
output_low(stb);
set_tris_x(0);
return(high | (low>>4)); //end check
}
////////// lcd display data function
void lcd_data(int asci){
port = (asci & 0xF0) | (port & 0x0F); //set upper data
output_low(rw); //set write
output_high(rs); //set rs high
output_high(stb); //strobe
output_low(stb);
asci=asci<<4;
port = asci | (port & 0x0F); //set lower data
output_high(stb); //strobe
output_low(stb);
while(bit_test(lcd_ready(),7));
}
////////// lcd command out function
void cmdout(int cmd){
port = (cmd & 0xF0) | (port & 0x0F); //set upper data
output_low(rw); //set write
output_low(rs); //set rs low
output_high(stb); //strobe
output_low(stb);
cmd=cmd<<4;
port = cmd | (port & 0x0F); //set lower data
output_high(stb); //strobe
output_low(stb);
}
void lcd_cmd(int cmd){
cmdout(cmd);
while(bit_test(lcd_ready(),7)); //end check
}
////////// lcd display clear function
void lcd_clear(){
lcd_cmd(1); //initialize command
}
///////// lcd initialize function
void lcd_incmd(int cmd){
port = (cmd & 0xF0) | (port & 0x0F); //mode command
output_low(rw); //set write
output_low(rs); //set rs low
output_high(stb); //strobe
output_low(stb);
delay_us(100);
}
void lcd_init(){
set_tris_x(0); //initialise
delay_ms(15);
lcd_incmd(0x30); //8bit mode set
lcd_incmd(0x30); //8bit mode set
lcd_incmd(0x30); //8bit mode set
lcd_incmd(0x20); //4bit mode set
lcd_cmd(0x2E); //DL=0 4bit mode
lcd_cmd(0x08); //disolay off C=D=B=0
lcd_cmd(0x0D); //display on C=D=1 B=0
lcd_cmd(0x06); //entry I/D=1 S=0
}
お礼
ご回答ありがとうございました。 私は、ハードは詳しくないのでとにかく抵抗値を計ってみました。 ショートはしていないみたいですが、RC5をHighセット固定にしてソケット(ソケットを使用しています)にさしたままだと0Vなのですが、ピンをうかせると5Vになりました。 データーシートには特に記述がないのですが、ハード面でなにか問題があるのかもしれません。このハードを設計した人は別にいますのでその人に相談したいと思います。