1

我正在尝试理解 Pic16F887 上的这个 LCD 示例; http://www.mikroe.com/chapters/view/17/chapter-4-examples/#c4v12

但编译器不断向我显示错误:

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 库,以便编译器可以识别类似Lcd_Init()或什么的方法吗?(Windows 7 / XC8 / MPLAB X)

4

4 回答 4

1

简单的!您正在使用 MPLAB,但您正在查看的库旨在用于名为 MikroC 的完全不同的 IDE。

您将不得不编写自己的函数或更改您的 IDE。顺便说一句,编写 LCD 函数并不难,看看这个例子:

将 PIC 连接到 HD44780 LCD

于 2014-08-07T16:12:42.273 回答
0

对于 MPLAB XC8,请使用以下链接中的库:将 LCD 与 PIC 微控制器连接 - MPLAB XC8

那篇文章中的示例使用 PIC 16F877A 微控制器。您只需在 MPLAB 项目设置中更改它即可将其转换为 PIC 16F877。

于 2014-08-21T05:31:30.733 回答
0

嗯,第一件事。理论上你所做的一切都是正确的。但是,您将需要设计很多专门调用的函数:LCD_Init()、LCD_CMD()、LCD_OUT()。这些不是本机命令,因此您必须自己编写代码。

如果您想启动并运行它。最好的方法是找到 LCD 的文档并找出执行操作所需的位/字节。由于您已经将 LCD_RS 定义为 RB4 ,因此您必须确保 LCD 上的 RS 引脚连接到 RB4。并对所有其他引脚执行此检查。在 LCD 的文档中,它们会告诉您需要设置哪些引脚值才能执行特定操作。即 LCD_EN 可能会启用对屏幕的写入,以便您可以显示字符。虽然 D7-D4 可能是您的数据总线,但您一次从字节发送 4 位。由于 LCD 的响应时间无法立即发送数据,因此您可能需要插入延迟。

延迟相当简单,您只需要设置一个空闲计时器以以微秒为单位测量时间并引发标志,一旦引发标志,您就可以发送下一个命令。您还可以进行轮询延迟。这是通过将计时器值重置为零并等待它达到您预先确定的某个值来完成的,在代码中它将是 2000。

最后,您必须编写 ADC_Read(),ADC_Init() [这不在您的代码中,但我认为编写一个比在代码中公开寄存器操作要好]。此外,这可能看起来令人生畏,但不要担心。这是其中之一,一旦你对一个 LCD 进行了编程,你就已经对它们全部进行了编程。就个人而言,我认为您应该先编写计时器例程,然后再转到 LCD 屏幕。希望有帮助。

于 2013-06-26T15:30:16.033 回答
0

这个网站提供了很好的 MPLABX IDE 和 XC8 编译器的库和示例,但不要忘记在项目属性 >> XC8 编译器中添加_XTAL_FREQ=20000000 micro ,否则无法编译!

如果您使用 PIC16F877A,它将填满 256 字节 EEPROM 数据存储器的 20%!和 14KB 程序存储器的 1%。

于 2020-04-19T09:22:41.920 回答