Tiny Lisp计算机2的文本显示

时间:2017-03-06 02:21:39

标签: arduino

关于从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
}

感谢您的任何建议!感谢你所做的所有这些精彩的工作。

0 个答案:

没有答案