我目前正在写一个图书馆的学习目的,我遇到了一个奇怪的问题。
所以,
一。我在主体(main.c)中有一个函数,它读取LCD的DDRAM地址。
2。我将完全相同的函数移到库文件(HD44780.c)中。
三.我在主体中包括头文件(HD44780.h)。
当我从主体调用函数时,得到的结果是64。对的。
当我从库中调用同一个函数时,在上一次调用之后,立即得到87的结果。假的。
可能与库文件和函数的可访问性有关。我的图书馆被分成三个文件。
HD44780.h(包括HD44780配置h和HD44780.c以及护头板)
HD44780.c(不包括任何内容)
HD44780 U配置h(包括HD44780.h和带护头罩)
知道吗?如果需要更多信息,尽管问。
主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;
}
高密度脂蛋白44780.h
#ifndef HD44780_H_
#define HD44780_H_
#include "HD44780_Config.h"
//Irrelevant function definitions...
extern uint8_t LCD_read(void);
#endif
HD44780配置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
我正在使用Atmel Studio 6进行编译。默认优化级别(-O1)。
更新#2
我已经检查了预处理器的输出,它们也是一样的。
更新#3
由于地址随每次读取而增加/减少,因此连续读数有错误结果。但问题仍然存在。这与函数的位置有关,但我不知道它是什么。
如果我调用main.c中的函数,它就会工作。
如果我从HD44780.c调用它,它就不能正常工作。
#更新#4
另一个论坛的人解决了我的问题。你可以在下面查我的答案。
最佳答案
查看第31页的the controller manual:
读取后,输入模式会自动将地址增加或减少1
这意味着两个连续的读取命令读取两个不同的地址数据。
编辑
先前的名称决定是要读取CG还是DDRAM。在输入此读取之前
指令,必须执行CGRAM或DDRAM地址集指令。如果不执行,第一个
读取的数据将无效。当串行执行读取指令时,下一个地址数据通常被读取
从第二次读起。地址集指令不必在此读取指令之前执行
用光标移位指令移动光标时(读取DDRAM时)。操作
光标移位指令与set DDRAM地址指令相同。
强调我的