我正在尝试理解Pic16F887;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_Init()之类的方法了吗?(Windows 7/ XC8 / MPLAB X)
发布于 2014-08-08 00:12:42
简单!您使用的是MPLAB,但是您看到的库是在一个完全不同的集成开发环境MikroC上使用的。
您必须编写自己的函数或更改您的IDE。顺便说一句,编写LCD函数并不难,看看下面的例子:
Interfacing PIC to HD44780 LCD
发布于 2013-06-26 23:30:16
好吧,首先要做的就是。理论上,你所做的一切都是正确的。然而,您将需要设计许多专门调用的函数: LCD_Init()、LCD_CMD()、LCD_OUT()。这些不是本机命令,因此您必须自己编写代码。
如果你想让它运行起来的话。要做到这一点,最好的方法是找到您的LCD的文档,并找出它需要多少位/字节来执行操作。由于您已经将LCD_RS定义为RB4,因此必须确保液晶屏上的RS引脚连接到RB4。并在所有其他引脚上执行此检查。在您的LCD文档中,它们会告诉您执行特定操作需要设置引脚的值。ie LCD_EN可能会启用写入屏幕,以便您可以显示字符。而D7-D4可能是你的数据总线,如果你从你的字节一次发送4位的话。由于LCD的响应时间,数据无法即时发送,因此您可能需要插入延迟。
您还可以设置轮询延迟。这是通过将计时器值重置为零并等待直到它达到您已预先确定的某个值来完成的,在代码中应该是2000。
最后,您必须编写ADC_Read(),ADC_Init(),这不在您的代码中,但我认为编写一个比在您的代码中公开寄存器操作要好。此外,这看起来可能很吓人,但不要担心。它是这样一种东西,一旦你对一个LCD进行了编程,你就可以对它们进行全部编程。就我个人而言,我认为你应该先编写计时器例程,然后再转到LCD屏幕上。希望这能帮上忙。
发布于 2014-08-21 13:31:31
对于MPLAB XC8,请使用以下链接中的库:Interfacing LCD with PIC Microcontroller - MPLAB XC8
那篇文章中的例子使用了PIC 16F877A单片机。只需在MPLAB项目设置中进行更改,即可将其转换为PIC 16F877。
https://stackoverflow.com/questions/15070398
复制相似问题