2013-02-25 5 views
1

Pic16F887에서이 LCD 예제를 이해하려고합니다. http://www.mikroe.com/chapters/view/17/chapter-4-examples/#c4v12LCD 라이브러리 - MPLAB X

하지만 컴파일러는 나에게 오류를 보여주는 유지 :

lcdpic16.c:32: warning: function declared implicit int 
lcdpic16.c:33: warning: function declared implicit int 
lcdpic16.c:33: error: undefined identifier "_LCD_CURSOR_OFF" 
lcdpic16.c:34: error: undefined identifier "_LCD_CLEAR" 
lcdpic16.c:36: warning: illegal conversion between pointer types 
pointer to const unsigned char -> pointer to unsigned char 
lcdpic16.c:37: warning: function declared implicit int 
lcdpic16.c:38: warning: illegal conversion between pointer types 
pointer to const unsigned char -> pointer to unsigned char 
lcdpic16.c:43: warning: function declared implicit int 
lcdpic16.c:45: warning: illegal conversion between pointer types 
pointer to const unsigned char -> pointer to unsigned char 
lcdpic16.c:48: warning: function declared implicit int 
lcdpic16.c:54: warning: function declared implicit int 
lcdpic16.c:55: warning: function declared implicit int 
(908) exit status = 1 
make: *** [build/default/production/lcdpic16.p1] Error 1 

BUILD FAILED (exit value 2, total time: 22s) 

소스 코드 (lcdp16.c를)

/*Header******************************************************/ 
#include <pic16f887.h> 


// LCD module connections 
#define LCD_RS RB4 
#define LCD_RS RB4 
#define LCD_EN RB5 
#define LCD_D4 RB0 
#define LCD_D5 RB1 
#define LCD_D6 RB2 
#define LCD_D7 RB3 
#define LCD_RS_Direction TRISB4 
#define LCD_EN_Direction TRISB5 
#define LCD_D4_Direction TRISB0 
#define LCD_D5_Direction TRISB1 
#define LCD_D6_Direction TRISB2 
#define LCD_D7_Direction TRISB3 
// End LCD module connections 

unsigned char ch;     // 
unsigned int adc_rd;     // Declare variables 
char *text;       // 
long tlong;       // 

void main() { 
    INTCON = 0;      // All interrupts disabled 
    ANSEL = 0x04;     // Pin RA2 is configured as an analog input 
    TRISA = 0x04; 
    ANSELH = 0;      // Rest of pins are configured as digital 

    Lcd_Init();      // LCD display initialization 
    Lcd_Cmd(_LCD_CURSOR_OFF);  // LCD command (cursor off) 
    Lcd_Cmd(_LCD_CLEAR);    // LCD command (clear LCD) 

    text = "mikroElektronika";  // Define the first message 
    Lcd_Out(1,1,text);    // Write the first message in the first line 
    text = "LCD example";   // Define the second message 
    Lcd_Out(2,1,text);    // Define the first message 

    ADCON1 = 0x82;     // A/D voltage reference is VCC 
    TRISA = 0xFF;     // All port A pins are configured as inputs 
    Delay_ms(2000); 

    text = "voltage:";    // Define the third message 

    while (1) { 
     adc_rd = ADC_Read(2);  // A/D conversion. Pin RA2 is an input. 
     Lcd_Out(2,1,text);   // Write result in the second line 
     tlong = (long)adc_rd * 5000; // Convert the result in millivolts 
     tlong = tlong/1023;  // 0..1023 -> 0-5000mV 
     ch = tlong/1000;   // Extract volts (thousands of millivolts) 
            // from result 
     Lcd_Chr(2,9,48+ch);   // Write result in ASCII format 
     Lcd_Chr_CP('.'); 
     ch = (tlong/100) % 10;  // Extract hundreds of millivolts 
     Lcd_Chr_CP(48+ch);   // Write result in ASCII format 
     ch = (tlong/10) % 10;  // Extract tens of millivolts 
     Lcd_Chr_CP(48+ch);   // Write result in ASCII format 
     ch = tlong % 10;    // Extract digits for millivolts 
     Lcd_Chr_CP(48+ch);   // Write result in ASCII format 
     Lcd_Chr_CP('V'); 
     Delay_ms(1); 
    } 
} 

사람이 무슨 일이 일어나고 있는지 나에게 설명 할 수 있습니까? 컴파일러가 Lcd_Init() 같은 메서드를 인식 할 수 있도록 사용자 지정 LCD 라이브러리를 만들어야합니까? (Windows 7/XC8/MPLAB X)

+0

. 'pic16f887.h'는 SFR과 같은 컨트롤러 고유의 정의만을 포함합니다.자습서에 대한 링크가 작동하지 않습니다 (페이지를 찾을 수 없음). 더 구체적 일 수는 없습니다. –

+0

네, sth가 없어서 찾을 수 없습니다.> _ <특정 종류의 라이브러리 일 수 있습니다.> _ < 여기 있습니다 링크 : http://www.mikroe.com/chapters/view/17/chapter-4-examples/#c4v12 – user1428734

+0

"이 예제를 올바르게 작동 시키려면 라이브러리 관리자에서 다음 라이브러리를 체크해야합니다 컴파일하기 전에 :'ADC''LCD' " –

답변

0

글쎄, 우선 먼저. 이론적으로 당신이 한 모든 것은 정확합니다. 그러나 당신이 특별히 호출하는 많은 함수를 디자인 할 필요가 있습니다 : LCD_Init(), LCD_CMD(), LCD_OUT(). 이것들은 네이티브 커멘드가 아니기 때문에 코드를 직접 작성해야합니다.

이렇게하고 싶다면. 이를 수행하는 가장 좋은 방법은 LCD의 설명서를 찾고 작동을 수행하는 데 필요한 비트/바이트를 파악하는 것입니다. 이미 LCD_RS를 RB4로 정의 했으므로 LCD의 RS 핀이 RB4에 연결되어 있는지 확인해야합니다. 그리고 다른 모든 핀에 대해이 검사를 수행하십시오. LCD의 문서에서 특정 작업을 수행하기 위해 핀을 설정해야하는 값을 알 수 있습니다. 즉, LCD_EN을 사용하면 문자를 표시 할 수 있도록 화면에 쓸 수 있습니다. D7-D4가 데이터 버스 일 수 있지만 바이트에서 한 번에 4 비트를 전송합니다. LCD의 응답 시간 때문에 데이터를 즉시 전송할 수 없으므로 지연을 삽입해야 할 수 있습니다.

지연이 비교적 간단하여 마이크로 타이머로 시간을 측정하고 플래그를 올리면 무료 타이머 중 하나를 설정하고 플래그가 발생하면 다음 명령을 보낼 수 있습니다. 폴링 지연을 만들 수도 있습니다. 타이머 값을 0으로 재설정하고 코드에서 미리 정해진 값에 도달 할 때까지 기다려야합니다.

마지막으로 ADC_Read(), ADC_Init()를 작성해야합니다. [이 코드는 아니지만 코드 작성 작업을 레지스터에 노출하는 것보다 낫다고 생각합니다.] 또한 이것은 두려워할지 모르지만 걱정하지 마십시오. 하나의 LCD를 프로그래밍하고 나면 모든 것을 프로그래밍 한 것 중 하나입니다. 개인적으로 나는 먼저 타이머 루틴을 작성한 다음 LCD 화면으로 이동해야한다고 생각합니다. 그것이 도움이되기를 바랍니다.

1

쉽지! MPLAB를 사용하고 있지만,보고있는 라이브러리는 MikroC라는 완전히 다른 IDE에서 사용하기위한 것입니다.

당신은 당신이 기능을 소유 쓰기 또는 IDE를 변경해야합니다. MPLAB XC8는 다음 링크 라이브러리를 사용하십시오

Interfacing PIC to HD44780 LCD

0

: Interfacing LCD with PIC Microcontroller - MPLAB XC8

이 문서의 예제 사용 BTW, LCD 기능을 작성하는 것은이 예에서 보면, 어렵지 않았을 것입니다 PIC 16F877A 마이크로 컨트롤러. 당신은 MPLAB 프로젝트 설정에서 변경하여 PIC 16F877로 변환 할 수 있습니다 .. 당신은 몇 가지의 #include 파일 (액정 라이브러리에서 함수와 상수를 선언 한) 누락