PIC16F88に書き込んだプログラムについて

このQ&Aのポイント
  • PIC16F88に書き込んだプログラムについての問題と解決方法の説明
  • 直流電圧と電流を測定する回路を製作し、LCDに表示するプログラムをPIC16F88に書き込んだが、最近になって正常に表示されなくなった
  • プログラムと回路図を掲載しており、どうすれば問題を解決できるか教えてほしい
回答を見る
  • ベストアンサー

PIC16F88に書き込んだプログラムについて

以前、直流電圧と電流を測定する回路を製作し、その時書いたプログラムでは正常にLCDに表示されていたのですが、最近になって測定した電圧および電流を1秒間に8回更新するように書き替えました。しかしLCDに正常に表示されなくなりました。 プログラムと回路図を掲載しますのでどなたか、どうすればいいか教えてください。 よろしくお願い致します。 ////////////////////以下プログラム/////////////////////////////////////////////////// <lcd.c> #include <pic.h> //#include "lcd.h" //#include "delay.h" #define _XTAL_FREQ 4000000 #define LCD_RS RA0 #define LCD_RW RA7 #define LCD_EN RA6 #define LCD_DATA PORTB #define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0)) /* write a byte to the LCD in 4 bit mode */ void lcd_write(unsigned char c) { //DelayUs(40); __delay_us(40); LCD_DATA = ( ( c >> 4 ) & 0x0F ); LCD_STROBE(); LCD_DATA = ( c & 0x0F ); LCD_STROBE(); } /* * Clear and home the LCD */ void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); //DelayMs(2); __delay_ms(2); } /* write a string of chars to the LCD */ void lcd_puts(const char * s) { LCD_RS = 1; // write characters while(*s) lcd_write(*s++); } /* write one character to the LCD */ void lcd_putch(char c) { LCD_RS = 1; // write characters lcd_write( c ); } /* * Go to the specified position */ void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void lcd_init() { char init_value; //ADCON1 = 0x06; // Disable analog pins on PORTA init_value = 0x3; //TRISA=0; //TRISB=0; LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; //DelayMs(15); // wait 15mSec after power applied, __delay_ms(15); LCD_DATA = init_value; LCD_STROBE(); //DelayMs(5); __delay_ms(5); LCD_STROBE(); //DelayUs(200); __delay_us(200); LCD_STROBE(); //DelayUs(200); __delay_us(200); LCD_DATA = 2; // Four bit mode LCD_STROBE(); lcd_write(0x28); // Set interface length //lcd_write(0xF); // Display On, Cursor On, Cursor Blink lcd_write(0x0C); lcd_clear(); // Clear screen //lcd_write(0x6); // Set entry Mode lcd_write(0x07); } <main.c> #include <pic.h> #include <stdlib.h> #include "lcd.h" #define _LEGACY_HEADERS #define _XTAL_FREQ 4000000 __CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & CCPMX_RB0 & CP_OFF); __CONFIG(FCMEN_OFF & IESO_OFF); unsigned int ADConv(unsigned char ch) { ADCON0=(ch<<3)&0x38; ADCS2=0; ADCS1=0; ADCS0=1; ADON=1; ADIF=0; __delay_us(20); GO_DONE=1; while(GO_DONE); return (ADRESH<<8) | ADRESL; } unsigned short Code2mV(unsigned char ch) { unsigned short ret; ret=0; ret += ADConv(ch)<<1; ret += ADConv(ch)>>1; ret += ADConv(ch)>>3; ret += ADConv(ch)>>4; ret += ADConv(ch)>>5; return ret; } void ioport(void) { CMCON=0x07; ANSEL= 0b00001110; TRISA = 0b00001110; PORTA=0x00; TRISB = 0b00000000; PORTB=0x00; } void main(void) { static double data, offset; static unsigned int v ,i,n1,n0; static unsigned char buf[8], cnt,tmp1[2],tmp2[2]; OSCCON = 0b01100000; // �N���b�N��8Mhz ioport(); ADCON1=0b11100000; lcd_init(); lcd_write(0x0D); lcd_goto(0); lcd_puts("Starting"); lcd_goto(0x40); lcd_puts("DC Meter"); __delay_ms(2500); lcd_clear(); offset=0.0; while (1) { data=0.0; for(cnt=0; cnt<10; cnt++) { data += Code2mV(1); } data /= 10.0; data *= 2.4287109375; data *= 11.0; data -= offset; v=(unsigned int)(data); n1=(unsigned int)(v/1000); n0=v-1000*n1; itoa(tmp2,n1,10); itoa(tmp1,n0,10); lcd_goto(1); lcd_puts(tmp2); lcd_goto(3); lcd_putch('.'); lcd_puts(tmp1); lcd_goto(6); lcd_puts("V"); data =0.0; for(cnt=0; cnt<10; cnt++) { data += Code2mV(2); } data /= 10.0; data *= 2.4287109375; data /= 11.0; offset = data; i=(unsigned int)(10.0 * data); itoa(buf,i,10); lcd_goto(9); lcd_puts(buf); lcd_goto(13); lcd_puts("mA"); __delay_ms(125); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.1

気付いた点だけですが tmp1[2],tmp2[2]; のバッファが少ないのでは? また #defineLCD_STROBE()((LCD_EN = 1),(LCD_EN=0)) は、 void LCD_STROBE(void){ LCD_EN=1; __delay_us(1); // LCD_EN パルス幅確保 LCD_EN=0; } の方が良いです

yf491224
質問者

お礼

夜分遅くの回答、大変ありがとうございます。 指摘された箇所を変更して再度挑戦してみます。

関連するQ&A

  • 温度センサIC LM35DZを使った回路について

    LM35Dzを使った温度測定回路をブレッドボードで作りました。 しかし、LCDに表示される温度と部屋の中にある温度計に表示されている温度の値が違います。 現在部屋の中にある温湿度計(TEM-200-W)では「22.8℃」と表示しています。 しかし、ブレッドボードで作った温度計では「26.6℃」と表示しています。 この差(誤差?)はどうして起こるのでしょうか? また、どのようにすれば自作した温度計回路の値を温湿度計の値に近づけることができるのでしょうか。 教えてください。 参考までに回路図とプログラムを掲載します。 /////////////////////////main.c////////////////////////////////////// #include <pic.h> #include <stdlib.h> #include "lcd.h" #define _LEGACY_HEADERS #define _XTAL_FREQ 4000000 __CONFIG(CCPMX_RB0 & DEBUG_OFF & LVP_OFF & BOREN_OFF & MCLRE_ON & PWRTE_ON & WDTE_OFF & FOSC_INTOSCIO); void ioport(void); unsigned short Adconv(unsigned char ch); unsigned short Code2mV(unsigned char ch); void main(void) { unsigned short V, T1,T0; char str1[8],str2[8]; OSCCON=0x60; ioport(); lcd_init(); lcd_clear(); while(1){ V = Code2mV(2); T1 = (unsigned short)((double)V/10.0); T0= V-10*T1; itoa(str2,T1,10); lcd_goto(0x00); lcd_puts(str2); lcd_goto(0x02); lcd_putch('.'); itoa(str1,T0,10); lcd_goto(0x03); lcd_puts(str1); lcd_goto(0x04); lcd_putch(0xDF); lcd_goto(0x05); lcd_putch('C'); __delay_ms(1000); lcd_clear(); } } void ioport(void){ CMCON=0x07; TRISA=0b00000100; ANSEL=0b00000100; PORTA=0x00; ADCON1=0x80; TRISB=0x00; PORTB=0x00; } unsigned short Adconv(unsigned char ch) { ADCON0=(ch<<3)&0x38; ADCS2=0; ADCS1=0; ADCS0=1; ADON=1; ADIF=0; __delay_us(20); GO_DONE=1; while(GO_DONE); return (ADRESH<<8) | ADRESL; } unsigned short Code2mV(unsigned char ch) { unsigned short ret, data; ret=0; data=Adconv(ch); ret += data<<2; ret += data>>1; ret += data>>2; ret += data>>3; ret += data>>7; return ret; } ///////////////////////////lcd.c///////////////////// #ifndef _XTAL_FREQ // Unless specified elsewhere, 4MHz system frequency is assumed #define _XTAL_FREQ 4000000 #endif #include<htc.h> #include"lcd.h" #defineLCD_RS RA0 #defineLCD_RW RA7 #define LCD_EN RA6 #define LCD_DATAPORTB //#defineLCD_STROBE()((LCD_EN = 1),(LCD_EN=0)) void LCD_STROBE(void) { LCD_EN=1; __delay_us(1); // LCD_EN パルス幅確保 LCD_EN=0; } /* write a byte to the LCD in 4 bit mode */ void lcd_write(unsigned char c) { __delay_us(40); LCD_DATA = ( ( c >> 4 ) & 0x0F ); LCD_STROBE(); LCD_DATA = ( c & 0x0F ); LCD_STROBE(); } /* * Clear and home the LCD */ void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); __delay_ms(2); } /* write a string of chars to the LCD */ void lcd_puts(const char * s) { LCD_RS = 1;// write characters while(*s) lcd_write(*s++); } /* write one character to the LCD */ void lcd_putch(char c) { LCD_RS = 1;// write characters lcd_write( c ); } /* * Go to the specified position */ void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void lcd_init() { char init_value; //ADCON1 = 0x06;// Disable analog pins on PORTA init_value = 0x3; TRISA=0x0E; TRISB=0x00; LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; __delay_ms(15);// wait 15mSec after power applied, LCD_DATA = init_value; LCD_STROBE(); __delay_ms(5); LCD_STROBE(); __delay_us(200); LCD_STROBE(); __delay_us(200); LCD_DATA = 2;// Four bit mode LCD_STROBE(); lcd_write(0x28); // Set interface length //lcd_write(0xF); // Display On, Cursor On, Cursor Blink lcd_write(0x0C);// Display On, Cursor On, Cursor Not Blink lcd_clear();// Clear screen lcd_write(0x6); // Set entry Mode

  • LCDのサブルーチンについて

    今、LCDとPICの接続方法を [PIC(下位4ビット)⇔LCD]から[PIC(上位4ビット)⇔LCD]に変更することを考えています。 LCDのサブルーチンはHi-Tech CコンパイラーのLCDのサンプルで使用されていたものを使用しています。 接続方法を変更するにあたりサブルーチンを書き換えなくてはいけないのですが、どのように書き換えればいいのかわかりません。 参考までにLCDのサブルーチンとPICとLCDとの接続方法を示した図を掲載します。 #define _LEGACY_HEADERS #define _XTAL_FREQ 4000000 #include <pic.h> #include "lcd.h" #define LCD_RS RA0 //#define LCD_RW RA4 #define LCD_EN RA1 #define LCD_DATA PORTB #define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0)) /* write a byte to the LCD in 4 bit mode */ void lcd_write(unsigned char c) { __delay_us(40); LCD_DATA = ( ( c >> 4 ) & 0x0F ); LCD_STROBE(); LCD_DATA = ( c & 0x0F ); LCD_STROBE(); } /* * Clear and home the LCD */ void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); __delay_ms(2); } /* write a string of chars to the LCD */ void lcd_puts(const char * s) { LCD_RS = 1; // write characters while(*s) lcd_write(*s++); } /* write one character to the LCD */ void lcd_putch(char c) { LCD_RS = 1; // write characters lcd_write( c ); } /* * Go to the specified position */ void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void lcd_init() { char init_value; //ADCON1 = 0x06; // Disable analog pins on PORTA init_value = 0x3; //TRISA=0; //TRISB=0; LCD_RS = 0; LCD_EN = 0; //LCD_RW = 0; __delay_ms(15); // wait 15mSec after power applied, LCD_DATA = init_value; LCD_STROBE(); __delay_ms(5); LCD_STROBE(); __delay_us(200); LCD_STROBE(); __delay_us(200); LCD_DATA = 2; // Four bit mode LCD_STROBE(); lcd_write(0x28); // Set interface length //lcd_write(0xF); // Display On, Cursor On, Cursor Blink lcd_write(0x0C); lcd_clear(); // Clear screen lcd_write(0x6); // Set entry Mode }

  • PICのプログラムについて質問です

    使用するPICは16F84Aで、MPLAB IDEv8.88を使ってこのようなプログラムを作りました。 #include"pic.h" static void pic_init(); static void Delay_ms(unsigned char ms); static void Delay_1ms(); void main(){ pic_init(); while(1) { RB0 = 1 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); RB0 = 0 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); } static void pic_init() { // GPIO = 0b00000000; TRISA = 0xFF ; TRISB = 0x00 } static void Delay_ms(unsigned char ms) { unsigned char c; for (c=ms ; c>0 ; c--) { Delay_1ms(); } } static void Delay_1ms() { unsigned int cnt; unsigned int i; cnt = 76; for (i=0 ; i<cnt ; i++) { NOP(); } } ポートB0の出力を0から1にするプログラムなのですが、実行すると Error [314] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 52.24 ";" expected Error [254] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 77.0 undefined variable: "pic_init" ********** Build failed! ********** というエラーが出ます。このようなエラーが出る原因を教えて頂けないでしょうか。お願いします。

  • PIC12F683を用いたCapture実験

    いま、PIC12F683を用いてCCPモジュールのCapture機能の実験をしています。一応、ビルドはできたので書き込んで動かしてみましたが、思ったとおり(スイッチを押したときにLEDを点灯させる)に動作しませんでした 動作はとしては、押しボタンスイッチを押したときにキャプチャーして LEDを点灯させるという簡単なものです。 下に使用しているプログラムを掲載しますので、どうしたらいいか教えてください。 // CaptureTest.c #include <pic.h> #include "delay.h" #include "CCP.h" __CONFIG( FCMDIS & IESODIS & BORDIS & WDTDIS & UNPROTECT & UNPROTECT & MCLRDIS & PWRTEN & INTIO); __IDLOC(0x00); unsigned char temp; ioport(); main(void) { //ポートの初期化、入出力設定など     ioport(); //Captureモード、立ち上がりエッジに設定 setCcpMode(CCP_CAPUTURE_PGE);      //フラグ(CCP1IF)を「0」にセット ResetCcpFlag();      //CCP割り込み許可 setCcpEnable(ENABLED); //TIMER1のプリスケーラを「1/8」に設定      T1CKPS1=1; T1CKPS0=1;     //外部回路を動作させない T1OSCEN=0;     //TIMER1を同期モードにセット T1SYNC=0;     //TIMER1のクロックは内部クロックを使用 TMR1CS=0;     //全割り込み、周辺割り込み許可 GIE=1; PEIE=1;      //TIMER1をリセット(0セット) ResetTMR1(); //TIMER1スタート     T1_START();      //CCP割り込みフラグが立つまでチェック while(ChkCcpFlag()==0);     //CCP割り込みフラグクリア ResetCcpFlag();     //GP3をハイレベルに設定してLEDを点灯 temp=1; GPIO3=temp; } ioport() { ANSEL=0x00; TRISIO=0x04; } //CCP.c #include <pic.h> void setCcpMode(unsigned char mode) { CCP1CON= mode; } void setPwmPeriod(unsigned char T) { PR2=(T-1); } void setPwmDuty(unsigned int duty) { DC1B0 = 0x01&duty; DC1B1 = 0x02&duty; CCPR1L = 0xFC &duty; } void setCcpEnable(unsigned char flag) { CCP1IE=flag; } void ResetCcpFlag(void) { CCP1IF=0; } unsigned char ChkCcpFlag(void) { unsigned char ret=0; if(CCP1IF==1) return ret=1; return ret; } void ResetTMR1(void) { TMR1H=0x00; TMR1L=0x00; } void T1_START(void) { TMR1ON=1; } void T1_STOP(void) { TMR1ON=0; } //CCP.h #define ENABLED 1 #define DISABLED 0 #define CCP_OFF 0x00 #define CCP_CAPUTURE_NGE 0x04 #define CCP_CAPUTURE_PGE 0x05 #define CCP_CAPUTURE_4th_PGE 0x06 #define CCP_CAPUTURE_16th_PGE 0x07 #define CCP_COMPARE_SET_ON_MATCH 0x08 #define CCP_COMPARE_CLR_ON_MATCH 0x09 #define CCP_COMPARE_INT 0x0A #define CCP_COMPARE_RESET_TIMER 0x0B #define CCP_PWM 0x0C extern void setCcpMode(unsigned char); extern void setPwmPeriod(unsigned char); extern void setPwmDuty(unsigned int); extern void setCcpEnable(unsigned char); extern void ResetCcpFlag(void); extern unsigned char ChkCcpFlag(void); extern void ResetTMR1(void); extern void T1_START(void); extern void T1_STOP(void);

  • secが・・確認お願いできませんか?

    秒数が出ないのですがどこが違うのでしょうか? #define TCNT0 (*(volatile unsigned int *)0xffff68) #define GRA0 (*(volatile unsigned int *)0xffff6a) #define GRB0 (*(volatile unsigned int *)0xffff6c) #define TCR0 (*(volatile unsigned char *)0xffff64) #define TIOR0 (*(volatile unsigned char *)0xffff65) #define TIER0 (*(volatile unsigned char *)0xffff66) #define TSR0 (*(volatile unsigned char *)0xffff67) #define TSTR (*(volatile unsigned char *)0xffff60) #define ITU_CLOCK8 3 #define ITU_CLEAR_GRA 32 #define ITU_IE_IMFA 1 #define DI asm( "orc.b #0xc0,ccr" ) #define EI asm( "andc.b #0x3f,ccr" ) void start_itu0(); void int_imia0(void) __attribute__ ((interrupt_handler)); int cnt = 0, sec = 0, min = 0, hour = 0; char str[] = "timer 00:00:00"; int main(void) { lcd_init(); lcd_puts(str); start_itu0(); EI; for(;;) { if (cnt >=100) { cnt = 0; sec++; if (sec >=60) { sec = 0; min++; if (min >= 60) { min = 0; hour++; if (hour >= 24) hour = 0; } str[6] = '0' + hour /10; str[7] = '0' + hour %10; str[9] = '0' + min /10; str[10] = '0' + min %10; str[12] = '0' + sec /10; str[13] = '0' + sec %10; lcd_home(); lcd_puts(str); } } } return 0; }

  • LCDを用いたカウントダウンプログラムについて

    今、PIC16F84AとLCDを用いて255からカウントダウンするところをLCDに表示するプログラムを作っています。 開発環境は ・MPLAB X IDE ・XC8コンパイラー ・PIC Kit3 を使っています。 プログラムはコンパイル、ビルドおよび書き込みは正常にできます。 しかし、いざ動かしてみるとカウントが「255」から「254」にならず「52」になってしまいます。 プログラムのどこがおかしいか全くわかりません。 また、プログラムにおいてLCDの表示ルーチンは、「Hi-Tech C」のサンプルを使用していて (Delay関数の個所をXC8用に書き換えています。)パスコンは、つけたほうが良いのですが、今回はつけていません。 参考のため回路図とプログラムを掲載しますので解決策がありましたら教えてください。 よろしくお願いいたします。 ////////////////以下ソースコード//////////////////// /* * File: main.c * * Created on 2015/12/24, 16:37 */ //#define _LEGACY_HEADERS #include <pic.h> #include <stdlib.h> #include "lcd.h" #define _XTAL_FREQ 4000000 #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is disabled) #pragma config CP = OFF // Code Protection bit (Code protection disabled) void ioport(void); void main(void) { unsigned char data; char str[2]; ioport(); lcd_init(); data=255; while(1){ lcd_clear(); lcd_goto(0x00); itoa(str,data,10); lcd_puts(str); if(data<0){ data=255; } __delay_ms(250); __delay_ms(250); data--; } } void ioport(void) { TRISA=0x00; PORTA=0x00; TRISB=0x00; PORTB=0x00; } //////////////////////////////////

  • PIC A/D変換での問題

    PIC16F690を使用しLCDにA/D変換をした数値を表示させる物を作ったのですが 抵抗を一定の速度で回しても数値が一定の速度で変化しません。 詳しく説明しますと、今回書いたプログラムは8bitで255までの値を表示させるものです。 抵抗をめいいっぱい回して数値を1にし(0にはどうしてもなりません。おそらく抵抗の問題) そこからゆっくりと一定の速度で抵抗を回すと数値が上がっていきます。 30辺りまでは一定の速度で数値が変化するのですが、そこから少し回すといきなり数値が220ぐらいにまで上がります。(一応30~210までの数値も出ている様なのでいきなり飛んでるわけではない) 抵抗を1Kのものから10Kものに変えてみたりしたのですが症状に変化はありませんでした。 どうしても解決できなかったので質問をした次第です。 解決方法がわかる方がいらっしゃいましたらお教え下さい。 プログラムを載せておきます。 #include<pic.h> #include<stdio.h> #include "lcd.h" unsigned int temp; unsigned int x = 1; unsigned char outString[20]; unsigned char count[20]; void init_a2d(void){ ADCON1=0x10; // A/D Clock Fosc/8 ADCON0=0x01; // A2D 入力をChannel 0 (RA0), // Left justified, A/D をON } // 指定された入力チャネルをA/D変換し8 bitの結果を返す unsigned char read_a2d(unsigned char channel){ channel&=0x0F; // 4 bitsを確認し ADCON0&=0xC3; // 現行入力チャネルをクリア ADCON0|=(channel<<2); // 新入力チャネルを設定 GODONE=1; // 変換開始 while(GODONE)continue; // 変換終了を待つ return(ADRESH); // 8 bitの結果を返 } void main(void) { pic_init(); init_a2d(); // A/D モジュール初期化 lcd_init(); lcd_goto(0x00); while(1) { __delay_us(50); // 50uS待ち(AD充電待ち) temp=read_a2d(0); sprintf(outString,"A/D=%2d",temp); lcd_puts(outString); lcd_goto(0x40); sprintf(count,"Count=%d",x); lcd_puts(count); x++; __delay_ms(100); lcd_clear(); } }

  • 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 }

  • PIC18F1320でwarningがでる

    PIC18F1320で MPLAB X IDE v3.26 XC 8です warningがでる warningがでてもプログラムは動く warningがでなくしたい LCD液晶表示装置を使うので8ビット符号なし整数型がいい 0から255の8ビット符号なし整数型しか使わない キャラクターコードをLATB(PORTB)に送るため プログラムで-1や256になったりしないよう制御してある #include <xc.h> CONFIG 省略 ほとんど省略 // EQU unsigned char TMRA=1; unsigned char TMRB=1;//など void main(void) { TMRA = TMRA - 20; TMRB = TMR+1;//など } newmain.c: warning: (xxx) conversion to shorter data type よろしくお願いします。

  • H8S/2552Fにおけるプログラミング

    現在イエローソフト社のH8S/2552F USB-IF CPUボードを用いて,I/Oポートから32bitトルグスイッチの状態を出力しようとしています。それらのデータをシフトしつつ外部SRAMに送り、さらに32bitのデータとしてPCに取り込みたいと考えているのですが、その方法がわかりません。 以下に現状のプログラムを載せさせて頂きました。(間違いがあるのは十分承知です…) どなたか教えて下さい。よろしくお願い致します。 #define PORT4 (*((volatile unsigned char *)0xFFFFB3)) #define PORT9 (*((volatile unsigned char *)0xFFFFB8)) #define PORTH (*((volatile unsigned char *)0xFFFA14)) #define PORTJ (*((volatile unsigned char *)0xFFFA15)) unsigned long in_switch(void) {     return (PORTJ <<24);     return (PORTH <<16);     return (PORT9 <<8 );     return (PORTJ | PORTH | PORT9 | PORT4) ; } void main() {    puts("トグルスイッチテストプログラム");    while (1) {          unsigned long data;          printf("リターンキーで現在のスイッチ状態を表示します。");          fgetc(stdin); //リターンキー入力待ち          data = in_switch();//スイッチの状態を入力          printf("現在のスイッチ状態=%d(H'%02X)\n", data, data); //スイッチ状態表示 } }