关于从Arduino UNO向mega2560移植特定比特代码的问题
这是大卫·约翰逊戴维斯的问题,因为他的博客使用了Disqus,因此很难发布代码示例。
博客文章在这里Text Display for the Arduino UNO
工作代码
很难理解以下代码的工作原理,特别是PIND
赋值,以及相同的代码如何使线路变为低/高,除非您只是依赖于之前对不同引脚的分配。 ..
// Write a data byte to the display
void Data (uint8_t d) {
PIND = 1<<cs; // cs low
for (uint8_t bit = 0x80; bit; bit >>= 1) {
PIND = 1<<clk; // clk low
if (d & bit) PORTB = PORTB | (1<<data); else PORTB = PORTB & ~(1<<data);
PIND = 1<<clk; // clk high
}
PIND = 1<<cs; // cs high
}
// Write a command byte to the display
void Command (uint8_t c) {
PIND = 1<<dc; // dc low
Data(c);
PIND = 1<<dc; // dc high
}
这是你的原始代码,适用于我的Diecimila!所以我不怀疑代码。
移植非工作代码
然而,尽管使用PORTB
的第4位上的数据引脚构造端口,但是将它移动到mega 2560上的引脚6,7,8,10是不工作,并且PORTH
上的其他3行,类似于PORTD
使用cs,dc,clk
,但PORTB
的第0位数据。下面有什么明显的错误吗?
// move pins to 6,7,8,10
// pin 6 PH3
int const cs = 3; // Bit in PORTH
int const cspin = 6;
// pin 7 PH4
int const dc = 4; // Bit in PORTH
int const dcpin = 7;
// pin 8 PH5
int const clk = 5; // Bit in PORTH
int const clkpin = 8;
// pin 10 PB4
int const data = 4; // Bit in PORTB
int const datapin = 10;
// Write a data byte to the display
void Data (uint8_t d) {
PINH = 1<<cs; // cs low
for (uint8_t bit = 0x80; bit; bit >>= 1) {
PINH = 1<<clk; // clk low
if (d & bit) PORTB = PORTB | (1<<data); else PORTB = PORTB & ~(1<<data);
PINH = 1<<clk; // clk high
}
PINH = 1<<cs; // cs high
}
// Write a command byte to the display
void Command (uint8_t c) {
PINH = 1<<dc; // dc low
Data(c);
PINH = 1<<dc; // dc high
}
void InitDisplay () {
// Define pins
pinMode(dcpin, OUTPUT); digitalWrite(dcpin,HIGH);
pinMode(clkpin, OUTPUT); digitalWrite(clkpin,HIGH);
pinMode(datapin, OUTPUT);
pinMode(cspin, OUTPUT); digitalWrite(cspin,HIGH);
for (uint8_t c=0; c<InitLen; c++) Command(Init[c]);
Display(12); // Clear display
Command(0xAF); // Display on
}
感谢您的任何建议!感谢你所做的所有这些精彩的工作。