Я использовал микроконтроллер 16x2LCD и renesasRl78/G, и я могу отображать вывод только один раз, как я могу выполнить прокрутку ЖК-дисплея на несколько экранов?

#c

Вопрос:

 #include <stdio.h>
#include <string.h>
#include "iodefine.h"
#include "common.h"
#include "config.h"
#include "system.h"
#include "sfr.h"
#include "lcd_con.h"

extern unsigned char TITL0[32] = "DISPLAYtest 2021";
extern unsigned char TITL1[32] = ">Welcome>Home";
extern unsigned char TITL0[32] = "DISPLAYtest 2020";
extern unsigned char TITL1[32] = ">Welcome>EARTH";
extern unsigned char TITL0[32] = "DISPLAYtest 2023";
extern unsigned char TITL1[32] = ">Welcome>EARTh";

void dispset_titl(void) {

  unsigned char n;
  unsigned char dsp_buf;

  lcd_l1(0x00);
  for (n = 0; n < 16; n  ) {
    dsp_buf = TITL0[n]; // line 1
    lcd_dout(dsp_buf);  // 1data write
  }

  lcd_l2(0x40);
  for (n = 0; n < 16; n  ) {
    dsp_buf = TITL1[n]; // line 2
    lcd_dout(dsp_buf);  // 1data write
  }
}

void dispset_count(void) {

  delay_msec(100);
  dpcnt[0]  ;
  if (dpcnt[0] > 9) {
    dpcnt[0] = 0;
    dpcnt[1]  ;
  }
  if (dpcnt[1] > 9) {
    dpcnt[1] = 0;
    dpcnt[2]  ;
  }
  if (dpcnt[2] > 9) {
    dpcnt[2] = 0;
    dpcnt[3]  ;
  }
  if (dpcnt[3] > 9) {
    dpcnt[3] = 0;
  }
  lcd_cout(0x8C);
  lcd_dout(dpcnt[3]   0x30);
  lcd_dout(dpcnt[2]   0x30);
  lcd_dout(dpcnt[1]   0x30);
  lcd_dout(dpcnt[0]   0x30);
}

void lcd_init(void) {

  P0 = 0x00; // E=0,R/W=0

  P2 = 0x03;
  P0 = 0x02; // E=1,R/W=0
  delay_micro(100);
  P0 = 0x00; // E=0,R/W=0
  delay_msec(5);

  P2 = 0x03;
  P0 = 0x02; // E=1,R/W=0
  delay_micro(100);
  P0 = 0x00; // E=0,R/W=0
  delay_msec(5);

  P2 = 0x03;
  P0 = 0x02; // E=1,R/W=0
  delay_micro(100);
  P0 = 0x00; // E=0,R/W=0
  delay_msec(5);

  P2 = 0x02;
  P0 = 0x02; // E=1,R/W=0
  delay_micro(100);
  P0 = 0x00; // E=0,R/W=0
  delay_msec(5);

  lcd_cout(0x28); // for 4-bit lcd intialization
  delay_msec(5);
  lcd_cout(0x0F);
  delay_msec(5);
  lcd_cout(0x06);
  delay_msec(5);
  lcd_cout(0x01);
  delay_msec(5);
  lcd_cout(0x02);
  delay_msec(5);
}

void lcd_l1(unsigned char column) {

  unsigned char pos;

  pos = column amp; 0x0F;
  pos = pos | 0x80;
  lcd_cout(pos);
  delay_msec(5);
}

void lcd_l2(unsigned char column) {

  unsigned char pos;

  pos = column amp; 0x4F;
  pos = pos | 0xC0;
  lcd_cout(pos);
  delay_msec(5);
}

void lcd_cout(unsigned char code) {

  unsigned char code_msb, code_lsb;

  code_msb = code / 0x10;
  code_lsb = code amp; 0x0F;
  P0 = 0x00; // E=0,R/W=0

  P2 = code_msb;
  P0 = 0x02; // E=1,R/W=0
  delay_micro(2);
  P0 = 0x00; // E=0,R/W=0

  delay_micro(2);

  P2 = code_lsb;
  P0 = 0x02; // E=1,R/W=0
  delay_micro(2);
  P0 = 0x00; // E=0,R/W=0
  delay_micro(50);
}

void lcd_dout(unsigned char code) {

  unsigned char code_msb, code_lsb;

  code_msb = code / 0x10;
  code_lsb = code amp; 0x0F;

  P0 = 0x01; // E=0,R/W=1

  P2 = code_msb;
  P0 = 0x03; // E=1,R/W=1
  delay_micro(2);
  P0 = 0x01; // E=0,R/W=1

  delay_micro(2);

  P2 = code_lsb;
  P0 = 0x03; // E=1,R/W=1
  delay_micro(2);
  P0 = 0x01; // E=0,R/W=1
  delay_micro(50);
}

void delay_micro(unsigned int icnt) {

  unsigned int del_cnt;
  for (del_cnt = 0; del_cnt < icnt; del_cnt  ) {
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
  }
}

void delay_msec(unsigned int icnt) {

  unsigned int del_cnt;
  for (del_cnt = 0; del_cnt < icnt; del_cnt  ) {
    delay_micro(1000);
  }
}
 

Комментарии:

1. ЖК-дисплей 16×2 будет прокручиваться влево/вправо (считывая символы в DDRAM), но для прокрутки вверх/вниз вам нужно будет очищать и записывать каждую новую строку на дисплей. Ваш буфер DDRAM для отображения составляет 80 символов. (по сути, 40 на строку), таким образом, вы получаете 2,5 экрана текста для прокрутки влево/вправо/подкачки без изменения DDRAM, но для up.down вам нужно изменить символы в буфере (DDRAM).

2. Как изменить символ в буфере (DDRAM)? Не могли бы вы, пожалуйста, помочь мне в этом вопросе!!!! Спасибо

3. На вашем дисплее будет использоваться контроллер HD44780U. Таблица данных, хотя и немного загадочная, если вы новичок в таблицах данных, объясняет, как вы взаимодействуете с DDRAM (символы, которые вы записываете на контроллер для отображения). На ЖК-дисплее есть основные режимы tso «команда» (где вы указываете ЖК-дисплею, что делать дальше (например, очистить, переместить положение курсора, записать символ, прокрутка и т. Д.) И «данные», В которых вы отправляете символы на дисплей. Используемая вами библиотека скроет от вас большинство деталей, но должна содержать основные команды.

4. Если вы заметили, ваши lcd_l1(0x00) и lcd_l2(0x40) являются командами отображения для строк 1 и 2. Обратите внимание на адреса 0x00 , это начало 40-символьного буфера, который может отображаться для строки 1 (например, символы 0-15, затем 16-32 и 33-40 с обтеканием 0-8. Начальный адрес строки 2 является 0x40 и ведет себя точно так же. Я нахожу, что проще просто использовать char TITL[80] = "both full lines together..."; , а затем просто сдвинуть дисплей влево на 16, чтобы отобразить следующий набор строк и т. Д… У вас может быть несколько массивов из 80 символов, ЖК-дисплей может довольно быстро очищаться/записываться.

5. спасибо за информацию @DavidC.Rankin, но я хочу печатать символ каждой первой и второй строки с некоторым новым символом в первой и второй строке каждые 5 секунд..как это можно сделать?