#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 секунд..как это можно сделать?