//LCD display //PB4>LCD.11(DB4), PB5> LCD.12, PB6> LCD.13, PB7> LCD.14 //PB3>LCD.6(STB),PA2>LCD.4(RS) //LCD 1>VCC 2 GND 3 V0(BackLight) #include <16f88.h> #fuses INTRC_IO,NOWDT,NOLVP,NOMCLR,NOBROWNOUT//内部クロック、WDT,LVPなし #use delay(CLOCK=8000000) //クロック4MHz #use I2c(slave,sda=PIN_B1,scl=PIN_B4,address=0x74,FORCE_HW) #use fast_io(B) #define D1 PIN_B0 #define D2 PIN_A3 #define D3 PIN_B2 #define D4 PIN_B3 //for LCD control #define rs PIN_A0 //chip select #define stb PIN_A2 //strobe void lcd_init();//-------- initialize void lcd_cmd(cmd);//------ send command void lcd_data(string);//-- display string void lcd_clear();// ------ clear display /////////////////////////////////////////////// // LCD test program /////////////////////////////////////////////// char chbuf[17]={'h','e','l','l','o','\0'}; char display[2][17]={{'W','a','i','t','i','n','g',' ','f','o','r',' ','d','a','t','a'}, {'A','d','r','r','e','s','s',' ','0','x','7','4'}}; int ch2; int state; int cp,i; int done; #INT_SSP void ssp_interupt (){ state=i2c_isr_state(); output_toggle(PIN_A1);//チェック if(state>=0x80){//マスタから要求 } else if(state >0){//マスターから書き込み有 ch2=i2c_read(0); chbuf[cp++]=ch2; if(cp > 16) cp--; if (ch2=='\0') { lcd_clear(); //画面消去 cp=0; for(i=0;i<16;i++){ display[1][i]=display[0][i]; display[0][i]=chbuf[i]; } done=1; } } } main(){ done=0; enable_interrupts(INT_SSP); enable_interrupts(GLOBAL); //全ての割り込みを許可 output_float(PIN_B1); //I2C pin float output_float(PIN_B4); //I2C pin float set_tris_b(0b11010010); cp=0;state=100; output_low(PIN_A1); delay_ms(20); lcd_init(); //4ビットモードで初期設定 delay_ms(50); lcd_clear(); //画面消去 printf(lcd_data,display[0]);// delay_ms(200); lcd_cmd(0xC0); //2行目にカーソルを移すコマンド printf(lcd_data,display[1]);//printf()で2行目に数値表示 delay_ms(299); while(1){ //if(done){ lcd_clear(); printf(lcd_data,display[0]);// delay_ms(2); lcd_cmd(0xC0); //2行目にカーソルを移すコマンド printf(lcd_data,"state=%d",state);//printf()で2行目に数値表示 // printf(lcd_data,display[1]); // } delay_ms(200); } return 0; } void lcd_data_4(int data) { output_bit(D4,bit_test(data,7));//ビット単位で出力 output_bit(D3,bit_test(data,6)); output_bit(D2,bit_test(data,5)); output_bit(D1,bit_test(data,4)); output_high(stb); //stbにパルスを送る output_low(stb); } //データを送る void lcd_data(int asci){ output_high(rs); lcd_data_4(asci); //上位4ビット asci=asci<<4; lcd_data_4(asci); //下位4ビット delay_us(200); } //コマンドを送る void lcd_cmd(int cmd){ output_low(rs); //set rs low lcd_data_4(cmd); //set upper data cmd=cmd<<4; lcd_data_4(cmd); //set lower data delay_us(200); } // 画面消去 void lcd_clear(){ lcd_cmd(1); delay_ms(10); //initialize command } // 8ビットモードでコマンドを送る void lcd_incmd(int cmd){ output_low(rs); lcd_data_4(cmd); delay_us(100); } void lcd_init(){ delay_ms(15); lcd_incmd(0x30); //8bit モードを設定 delay_ms(5); lcd_incmd(0x30); //繰り返す delay_ms(5); lcd_incmd(0x30); delay_ms(5); lcd_incmd(0x20); delay_ms(5); lcd_cmd(0x2C); //4bit モードに移行 lcd_cmd(0x08); //データ非表示 lcd_cmd(0x0C); //データ表示、カーソル非表示 lcd_cmd(0x06); //カーソル移動 }