Уборка сахарного тростника. Сезонная. Пайка кастрюль. Сдельная. Предложения работы.
Ответить

Вывод кириллицы на ЖК-дисплей

Ср июн 07, 2023 21:45:49

Добрый день, необходимо составить функцию putstr для вывода текстовой строки, завершающейся нуль-символом 0, на ЖК-дисплей стенда (ЖКД). Строка может содержать латиницу, символы, и кириллицу в кодировке Windows ср1251. Указание: в знакогенераторе ЖКД кириллические символы представлены в нестандартной кодировке, в функции putstr необходимо предусмотреть: 1) детектор кириллических символов; 2) табличный преобразователь кода кириллицы из Windows ср1251 во внутреннюю кодировку ЖК-дисплея. Используя putstr, составить демонстрационную программу для вывода на ЖКД текста, поступающего из компьютера. Предусмотреть: 1) при заполнении первой строки — автоматический перевод строки; 2) при заполнении второй строки — короткий звуковой сигнал. Платформа х51, микроконтроллер ADuC842, ЖК-дисплей WH1602b, язык программирования С51.

Прошу Вас, помогите! (не за бесплатно)

Re: Вывод кириллицы на ЖК-дисплей

Чт июн 08, 2023 11:45:14

Вывод строки символов с перекодировкой реализуется несложно,и практически аппаратно независим,
при наличии функции вывода на дисплей одного символа, вроде putchar().
А вот она уже зависит от схемы подключения ЖКД.
Тестовую строку будете получать с компьютера,через какой интерфейс(UART?)- тоже нужна функция и настройка периферии.
Работоспособная тестовая программа получится гораздо больше ,чем функция вывода строки.
Как пример:
Спойлер
Код:
#define LCD_E  PORTB.5  //6выв
#define LCD_RW PORTB.6  //5выв 1-read 0-write
#define LCD_A0 PORTB.7  //4выв 0-команда 1-данные(RS)

#define LCD0 PORTB.4    //11выв DB4
#define LCD1 PORTB.3    //12выв DB5
#define LCD2 PORTB.2    //13выв DB6
#define LCD3 PORTB.1    //14выв DB7

//LCD_RW=0;
//DisplayInit();
//loadfont(  &Character[0][0]  );


void PutNibble(unsigned char c)//,unsigned char cmdFlag)
{
char n=c;
//LCD_E=1;
LCD0=0;if(n&0x1)LCD0=1;
LCD1=0;if(n&0x2)LCD1=1;
LCD2=0;if(n&0x4)LCD2=1;
LCD3=0;if(n&0x8)LCD3=1;
  //LCD_RW=0;
//LCD_A0=1;if (cmdFlag)LCD_A0=0;
LCD_E=0;
LCD_E=1;
}

void WriteCmd(char cmd) {
LCD_A0=0;//команда
  PutNibble(cmd>>4);
  PutNibble(cmd);
  delay_us(40);


void Lcdchar(char ch) {
LCD_A0=1;//данные
  PutNibble(ch>>4);
  PutNibble(ch);
  delay_us(40);//надо! не успевает LCD
}

void DisplayClear(void) {
  WriteCmd(1);
  delay_ms(10);
}

#define DL8     0x10    //8 разр интерфейс
#define P1      0x02    //1 page знакогенератора
#define D_ON    0x04    //display ON
#define CUR_ON  0x02    //cursor ON
#define BLINK   0x01    //blinking cursor
//#define
    //static inline void DisplayInit(void) {
void DisplayInit(void) {
LCD_A0=0;
  PutNibble(0x3);delay_us(100);
  PutNibble(0x3);delay_us(100);
  PutNibble(0x3);delay_us(100);
  PutNibble(0x2);delay_us(100);
  WriteCmd(0x28 );//|P1 | DL8);//4бита 1 страница зн ген
//  WriteCmd(0x08);// уст парам
//  WriteCmd(0x0c |0 |0); //0c включ диспл и тип курсора
                        //2-кур есть 1-мигает
  WriteCmd(0x08 | D_ON );//| CUR_ON | BLINK ); //0c включ диспл и тип курсора
  WriteCmd(0x04 |2 |0); //2 сдвиг кур вправо 1 сдв диспл
  DisplayClear();
}

//char a_lcd[]={0,0x40,0x14,0x54};
char a_lcd[]={0x80,0xc0};
static void gotoXY(unsigned char x,unsigned char y) {
  WriteCmd(0x80|(a_lcd[y])+(x&0x1f));
}

void at_yx(char y,char x)
{
 WriteCmd(0x80|(a_lcd[y])+(x&0x1f));
//gotoXY(x,y);
}

//char string[]=("Hello мир! и вся Коммунистическая партия");

void lcd_str(flash char *p)//важно flash, иначе строки в RAM
//void puts(char *p)
{
char c;
for(;c = *p++ ;) Lcdchar(c);
//while(c = *p++ ) Putchar(c);
}

//lcd_rus("as\0\1\2f\3\4\5\6\7$");//'$'конец строки
void lcd_rus(flash char *p)//выв строки конец '$'
{
char c;
for(;(c = *p++)!='$' ;)  Lcdchar(c);
}


void printYX(char y,char x,flash char *p)
{//char *p=ps;
//y=*p++;x=*p++;
at_yx(y,x);
lcd_str(p);
}

//загрузка фонта в lcd
//loadfont(  &Character[0][0]  );
//loadfont(  &Character[8][0]  );
void loadfont(flash unsigned char *p)
{
char i;
WriteCmd(0x40);//CGRAM mode
for(i=0;i<64;i++) Lcdchar(*p++);
WriteCmd(0x80);
}

Ответить