2016-11-15 59 views
0

我目前正在为学习目的而编写一个库,并且遇到了一个奇怪的问题。
所以,
1.我有一个函数在主体(main.c)读取LCD的DDRAM地址。
2.我将完全相同的功能移动到库文件(HD44780.c)中。
3.我在主体中包含头文件(HD44780.h)。
当我从主体调用函数时,我得到64的结果。正确。
当我从库中调用相同的函数时,在之前的调用之后立即得到87的结果。错误。
也许它与库文件和函数的可达性有关。我的图书馆分为三个文件。不同文件中的相同函数返回不同的结果

  • HD44780.h(包括HD44780_Config.hHD44780.c和护头装置)
  • HD44780.c(不包括任何东西)
  • HD44780_Config.h (包括HD44780.h并且有头卫兵)

有什么想法?如果需要更多信息,请询问。

MAIN.C

#define F_CPU 16000000L 

#include <util/delay.h> 
#include <avr/io.h> 
#include "IO_macros.h" 
#include "HD44780.h" 

uint8_t _read(void); 

int main(void) 
{ 
    uint8_t x1, x2; 

    LCD_setup(); 

    LCD_gotoXY(0,1); 
    x1 = _read(); //64, Correct answer 
    x2 = LCD_read(); //87, False answer 

    return 0; 
} 

uint8_t _read(void) 
{ 
    uint8_t status = 0; 

    pinMode(LCD_D4, INPUT);    //D7:D4 = Inputs 
    pinMode(LCD_D5, INPUT); 
    pinMode(LCD_D6, INPUT); 
    pinMode(LCD_D7, INPUT); 
    digitalWrite(LCD_RS, LOW);   //RS = 0 
    digitalWrite(LCD_RW, HIGH);   //RW = 1 

    //High nibble comes first 
    digitalWrite(LCD_EN, HIGH);  
    _delay_us(LCD_PULSE_US); 
    status |= digitalRead(LCD_D4)<<4; 
    status |= digitalRead(LCD_D5)<<5; 
    status |= digitalRead(LCD_D6)<<6; 
    digitalWrite(LCD_EN, LOW); 

    //Low nibble follows 
    digitalWrite(LCD_EN, HIGH);  
    _delay_us(LCD_PULSE_US); 
    status |= digitalRead(LCD_D4); 
    status |= digitalRead(LCD_D5)<<1; 
    status |= digitalRead(LCD_D6)<<2; 
    status |= digitalRead(LCD_D7)<<3; 
    digitalWrite(LCD_EN, LOW); 

    pinMode(LCD_D4, OUTPUT);   //D7:D4 = Outputs 
    pinMode(LCD_D5, OUTPUT); 
    pinMode(LCD_D6, OUTPUT); 
    pinMode(LCD_D7, OUTPUT); 
    digitalWrite(LCD_RW, LOW);   //RW = 0 

    return status; 
} 

HD44780.h

#ifndef HD44780_H_ 
#define HD44780_H_ 

#include "HD44780_Config.h" 
//Irrelevant function definitions... 
extern uint8_t LCD_read(void); 

#endif 

HD44780_Config.h

#ifndef HD44780_CONFIG_H_ 
#define HD44780_CONFIG_H_ 

#include "HD44780.h" 

//----- Configuration --------------------------// 
//Irrelevant definitons here 
//----------------------------------------------// 
#endif 

HD44780.c

//Irrelevant functions precede... 
uint8_t LCD_read(void) 
{ 
    uint8_t status = 0; 

    pinMode(LCD_D4, INPUT);    //D7:D4 = Inputs 
    pinMode(LCD_D5, INPUT); 
    pinMode(LCD_D6, INPUT); 
    pinMode(LCD_D7, INPUT); 
    digitalWrite(LCD_RS, LOW);   //RS = 0 
    digitalWrite(LCD_RW, HIGH);   //RW = 1 

    //High nibble comes first 
    digitalWrite(LCD_EN, HIGH); 
    _delay_us(LCD_PULSE_US); 
    status |= digitalRead(LCD_D4)<<4; 
    status |= digitalRead(LCD_D5)<<5; 
    status |= digitalRead(LCD_D6)<<6; 
    digitalWrite(LCD_EN, LOW); 

    //Low nibble follows 
    digitalWrite(LCD_EN, HIGH); 
    _delay_us(LCD_PULSE_US); 
    status |= digitalRead(LCD_D4); 
    status |= digitalRead(LCD_D5)<<1; 
    status |= digitalRead(LCD_D6)<<2; 
    status |= digitalRead(LCD_D7)<<3; 
    digitalWrite(LCD_EN, LOW); 

    pinMode(LCD_D4, OUTPUT);   //D7:D4 = Outputs 
    pinMode(LCD_D5, OUTPUT); 
    pinMode(LCD_D6, OUTPUT); 
    pinMode(LCD_D7, OUTPUT); 
    digitalWrite(LCD_RW, LOW);   //RW = 0 

    return status; 
} 
//...irrelevant functions follow 

更新#1
我使用爱特梅尔Studio 6中编译。默认优化级别(-O1)。
更新#2
我检查了预处理器输出,它们也是相同的。
更新#3
由于地址随着每次读取而增加/减少,因此会产生错误的结果。问题仍然存在。它与功能的位置有关,但我不知道它是什么。
如果我打电话main.c的功能,它的工作原理。
如果我从HD44780.c调用它,它不能正常工作。
#更新#4
在另一个论坛的人解决了我的问题。你可以在下面查看我的答案。

+0

有(在HD44780.h)的函数原型? – LPs

+2

简化您的代码。把东西拿出来,直到你有一个最小的repro案例。 –

+0

你如何编译和链接它? –

回答

1

问题是在F_CPU的定义。
它在HD44780.c文件中没有定义。每个.c文件是一个独立的编译单元,它在编译时与其余的.c文件相链接。
我只在main.c中定义的F_CPU,所以_delay_usHD44780.c有错F_CPU值。作为解决方案,我在解决方案的makefile中声明了F_CPU,以便它对所有文件均可见。 原因和解决方案是由于另一个论坛中的一个人,在那里我拼命地问了同样的问题。
谢谢大家的时间!

http://www.avrfreaks.net/comment/2029541#comment-2029541

2

综观the controller manual 31页:

读取后,输入模式自动地增加或减少1

这意味着,两个连续的读命令读取的两个不同的地址数据的地址。

EDIT

先前指定确定CG或DDRAM是否将被读出。在进入该指令之前,必须执行CGRAM或DDRAM地址设置指令。如果未执行,则第一个 读取的数据将无效。 当连续执行读取指令时,通常从第二次读取中读取下一个地址数据 。当光标移位指令移动光标时(读取DDRAM时),地址设置指令不需要在读取指令 之前执行。光标移位指令的操作与设置的DDRAM地址指令相同。

重点煤矿

+0

你完全正确。在阅读您的评论之后,我尝试重新将光标重新放在相同的位置,以便再次重新阅读。 **转到**,**阅读**,**转到**,**阅读**,我得到相同的虚假结果。我必须进一步测试它。 – ThymiosK

+0

@ThymiosK我编辑。 – LPs

+0

拥有自己应用的全日这个特殊的问题,弄得我晕头转向。我能够理解你的观点和报价,尽管看起来你可能已经找到了解决方案。你可以简单地把它吗? – ThymiosK

相关问题