2013-02-25 3 views
1

Я пытаюсь понять этот пример LCD на Pic16F887; http://www.mikroe.com/chapters/view/17/chapter-4-examples/#c4v12ЖК-библиотека - 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() или что? (Windows 7/XC8/MPLAB X)

+0

Вам не хватает какого-либо файла #include (тот, который объявляет функции и константы из библиотеки LCD). 'pic16f887.h' включает только определенные контроллером определения, такие как SFR.Ваша ссылка на учебное пособие не работает (страница не найдена), поэтому я не могу быть более конкретным –

+0

Да, отсутствует и я не могу ее найти> _ <возможно, это какая-то конкретная библиотека> _ < вот ссылка: http://www.mikroe.com/chapters/view/17/chapter-4-examples/#c4v12 – user1428734

+0

«Чтобы этот пример работал правильно, необходимо отметить следующие библиотеки в Менеджере библиотек перед компиляцией: 'ADC'' LCD' " –

ответ

0

Хорошо, сначала сначала. Теоретически все, что вы сделали, правильно. Однако вам нужно будет разработать множество функций, которые вы вызываете конкретно: LCD_Init(), LCD_CMD(), LCD_OUT(). Это не собственные команды, поэтому вам придется писать код самостоятельно.

Если вы хотите его запустить. Лучший способ сделать это - найти документацию на ЖК-дисплее и выяснить, какие биты/байты ему необходимы для выполнения операции. Поскольку вы уже определили LCD_RS как RB4, вы должны убедиться, что контакт RS на вашем ЖК-дисплее подключен к RB4. И выполните эту проверку на всех других контактах. В документации на ваш ЖК-дисплей они сообщают вам, какие значения должны быть настроены для выполнения конкретной операции. т.е. LCD_EN может включить запись на экран, чтобы вы могли отображать символы. Хотя D7-D4 может быть вашей шиной данных, вы отправляете по 4 бита за один раз из своего байта. Поскольку данные не могут быть отправлены мгновенно из-за времени отклика ЖК-дисплея, возможно, вам придется вставлять задержки.

Задержки достаточно просты, вам просто нужно установить один из бесплатных таймеров для измерения времени в микросекундах и поднять флаг, и как только флаг поднят, вы можете отправить следующую команду. Вы также можете сделать задерживать опрос. Это делается путем сброса значения таймера до нуля и ожидания до тех пор, пока оно не достигнет определенного значения, которое было бы предопределено, в коде будет 2000.

Наконец, вам нужно будет написать ADC_Read(), ADC_Init() [это не в вашем коде, но я думаю, что писать один лучше, чем разоблачение операций с регистром в вашем коде]. Также это может выглядеть пугающе, но не беспокойтесь. Это одна из тех вещей, которые, как только вы запрограммировали один ЖК-дисплей, вы запрограммировали их все. Лично я думаю, что сначала вы должны написать свои процедуры таймера, а затем перейти к ЖК-экрану. Надеюсь, что это помогло.

1

Легко! Вы используете MPLAB, но библиотека, которую вы ищете, предназначена для использования на совершенно другой IDE под названием MikroC.

Вам нужно будет написать свои собственные функции или сменить IDE. Кстати, написание ЖК-функции не так уж трудно, посмотрите на этот пример:

Interfacing PIC to HD44780 LCD

0

Для MPLAB XC8 использовать библиотеку в следующей ссылке: Interfacing LCD with PIC Microcontroller - MPLAB XC8

пример в этой статье, используя Микроконтроллер PIC 16F877A. Вы можете преобразовать его в PIC 16F877, просто изменив его в настройках MPLAB.

Смежные вопросы