Перейти к содержанию

LCD 2004, Atmega32, Си. Узнать кодировку символов LCD


Рекомендуемые сообщения

Я начинающий в языке си. и у меня возникла проблемка :

1) Хочу сделать перебор символов хранящихся в lcd.

2) Если русские символы присутствуют в lcd то создать таблицу в которой будет указанны правильные символы (т.е. по usart прилетает к примеру буква ю . так как она выходит за приделы английских букв таблицы lcd с английскими буквами, то ищем переадресацию(другой адрес для символа) в нашей таблице после чего выводим на lcd букву ю.

чтоб начать осуществлять эту идею мне не хватает малости- как из числа (от 0 до 255) преобразовать в символ и как из символа получить число

привожу код программы

mk

#define F_CPU 1000000UL // указываеться честота МК
#include <avr/io.h> // основная библиотека
#include <util/delay.h> // библиотека для паузы
#include <stdio.h>
#include <stdlib.h>
#include "lcd.h"	 // библиотека для работы с жк экраном
void lcd()
{
init_port(); // инициализируем порт A для lcd
lcd_init(); // инициализируем ЖКИ дисплей
lcd_clear();
}
// работа с usart
void uart_init( void )
{
//настройка скорости обмена
UBRRH = 0;
UBRRL = 12;// 4800 скорость
//8 бит данных, 1 стоп бит, без контроля четности
UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
//разрешить прием и передачу данных
UCSRB = ( 1 << TXEN ) | ( 1 <<RXEN );
}
unsigned char uart_getc( void )//прием данных с ПК
{
//ждем приема байта
while(!( UCSRA & ( 1 << RXC )) );
//считываем принятый байт
return UDR;
}
void uart_putc( unsigned char g )//передача данных на ПК
{
//ждем окончания передачи предыдущего байта
while(( UCSRA & ( 1 << UDRE ) )==0 );
UDR = g;
}
void uart_puts( char *str )
{
unsigned char g;
while( ( g = *str++ ) != 0 ) {
uart_putc( g );
}
}
int main( void )//основная программа
{
lcd();// инициализируем жк
uart_init();// инициализируем usart
//unsigned char g;
//uart_puts( "Hello uart\r\n" );// r,n- переход на новую строку
int x=0;
int y=0;
int m=0;
//int b=0;
while( 1 ) // бесконечный цикл программы
{
lcd_clear();// очистка экрана жк
lcd_putstring("zapusc");// выводим zapusc на жк
_delay_ms(500);// пауза 0.5 секунды
uart_puts("H" );// отправить H по usart
// очистка экрана жк
lcd_clear();
for (m = 0; m <= 81; m++)
{
char f = uart_getc();// присваеваем с принятые байты

 if(f == '.') {//проверяем условие c = '.' означающее конец строки
 if(m<41){m=42;y=1;x=0;}//проверяем условие если первоя строка перепрыгиваем на вторую
 else{m=82;}//получаеться вторая значит заканчиваем работать
 }
else {// если точка не пришла то выводим символ
 lcd_gotoxy (x,y);
 lcd_putchar( f );

 _delay_ms(2000);
 x++;
 }
}

//for (b = 0xA0; b <= 0xE6; b++){
//lcd_gotoxy (0,0);
// lcd_putchar( b );


// _delay_ms(100);
//}
m=0;
x=0;
y=0;
}
return 0;
}

lcd.h

//проект написан для lcd использовалась атмега32
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
//#define F_CPU 1000000// не на что не влияет
#define LCD_E_SET PORTD|=0x04 // установка лог. «1″ на линии E
#define LCD_E_CLR PORTD&=0xFB // установка лог. «0″ на линии E
#define LCD_RS_SET PORTD|=0x8 //установка лог. «1″ на линии RS
#define LCD_RS_CLR PORTD&=0xF7 // установка лог. «0″ на линии RS
#define LCD_COMMAND 0 // макрос, указывающий функции, что передаются команды
#define LCD_DATA 1 // макрос, указывающий функции, что передаются данные
#define BUF_SIZE 128//размер памяти
void init_port()//инициализация портов, подключенных к жки
{
DDRD=0xFC;//настраевает на выход сигнала на порту
PORTD=0x00;//на выходе устанавливаються 0
}
void lcd_putnibble(char t) //функция передачи тетрады в жки
{
t<<=4; // сдвиг в лево (пример) 0b0101 1100<<4 = 0b1100 0000
LCD_E_SET; // установка лог. «1″ на линии E
_delay_us(50);
PORTD&=0x0F; // стираем прошлую половинку байта
PORTD|=t;				 // рисуем половинку байта на порте A
LCD_E_CLR; // установка лог. «0″ на линии E
_delay_us(50);
}
/* функция передачи байта в жки.
char c — сам байт
char rs — переменная, указывающая что передается:
 rs = 0 — команда (устанавливается линия RS)
 rs = 1 — данные (сбрасывается линия RS) */
void lcd_putbyte(char c, char rs)
{
char highc=0; //переменная для хранения старшой части байта
highc=c>>4; //заносим старшую часть байта в переменную
if (rs==LCD_COMMAND) LCD_RS_CLR; //определяем что передаем данные или команду
else LCD_RS_SET;
lcd_putnibble(highc);// передачи тетрады в жки
lcd_putnibble(c);
}
void lcd_putchar(char c) // то же самое что и lcd_putbyte (почти)
{
char highc=0;
highc=c>>4;
LCD_RS_SET;
lcd_putnibble(highc);
lcd_putnibble(c);
}
void lcd_init() //функция инициализации ЖКИ
{


_delay_ms(15); //ждем 15мс после подачи питания на жки.
lcd_putnibble(0b00000011); //0b00000011<<4 = 0b00110000 (выбор 8битного режима)
_delay_ms(4);
lcd_putnibble(0b00000011); //0b00000011<<4 = 0b00110000 (выбор 8битного режима)
_delay_us(100);
lcd_putnibble(0b00000011); //0b00000011<<4 = 0b00110000 (выбор 8битного режима)
_delay_ms(1);
lcd_putnibble(0b00000010); //0b00000010<<4 = 0b00100000 (выбор 4битного режима)
_delay_ms(1);
lcd_putbyte(0x2A, LCD_COMMAND); //0b00101000 (4 битный режим+подкл 2ую строку)поменял 28->2A
_delay_ms(1);
lcd_putbyte(0x0C, LCD_COMMAND); //0b00001100 (включаем изображение)
_delay_ms(1);
lcd_putbyte(0x06, LCD_COMMAND); //0b00000110 (смещение курсора влево)
_delay_ms(1);
}
void lcd_clear() // функция очистки дисплея и возврата курсора в начальную позицию
{
lcd_putbyte(0x01, LCD_COMMAND);
_delay_us(1500);
}
//* функция перемещения курсора в заданную позицию
//col — номер знакоместа по горизонтальной оси (от 0 до 15)
//row — номер строки (0 или 1) */
void lcd_gotoxy(char col, char row)
{
char adr;
adr=0x40*row+col;
adr|=0x80;//80-НАЧАЛО СТРОКИ
lcd_putbyte(adr, LCD_COMMAND);
}
void lcd_putstring (char stroka[])// разбивка строк на буквы
{ unsigned char i;
for(i=0;stroka[i]!='\0';i++)
{
lcd_putchar(stroka[i]);// буквы в строке 1-2-3-.....
}
}

если решите опробовать код usart лучше отключить т.к. он будет ждать пока не прилетит как минимум две точки

Изменено пользователем lazudhic
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

2004.rarСи органически не перевариваю. Но помочь несложно. В первой строке десятичный код, во второй символ. С фузами надеюсь управишся. RST особенно, я на схеме не указал что его подтянуть надо. Изменено пользователем koms45

Так ку или не ку ?!

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Самое простое - таблица перекодировки.

PROGMEM const char table[255] = {0,0,/*вырезано*/,'o',0xBE,'p',/*вырезано*/,0xC3,0xC4,0xC5,0xC6,0xC7};
lcd_putchar( pgm_read_byte( &table[ch] ) );

Но можно хранить только русскую часть таблицы. Для cp1251 это 0xC0 - 0xFF

PROGMEM const char table[64] = {'A', 0xA0, 'B', 0xA1, 0xE0, /*вырезано*/, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7};
if( ch < 0xC0 )lcd_putchar( ch ); else lcd_putchar( pgm_readbyte( &table[ch-0xC0] ) );

Полной таблицы у меня нет - надобности не возникало, но гугль выдал ссылку на соседний форум. Правда, там для PIC'ов, но уж таблицу оттуда выдрать не проблема.

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

ну первое у меня lcd поддерживает кириллицу. мне нужно как то узнать какой символ прилетел по usart . ну что то типа такого

int main(void)

{

char f[] = "z";

while(1)

{

int buff;

buff=getchar (f);

lcd_putstring(buff);

}

}

программа жутко ругается . пробовал (atoi, getchar) , ещё немного возьму бубен и в пляс пойду вокруг сего устройства :dance2:

Изменено пользователем lazudhic
Ссылка на комментарий
Поделиться на другие сайты

попробовал прикрутить к lcd.h . немного переделав студия начала ругаться выдавая код ошибки- Error 4 expected declaration or statement at end of input при том что указывалась последняя строка mk.c -}

выкладываю код

mk.с

#define F_CPU 1000000UL // указываеться честота МК
#include <avr/io.h> // основная библиотека
#include <util/delay.h> // библиотека для паузы
#include <stdio.h>
#include <stdlib.h>
#include "lcd.h"	 // библиотека для работы с жк экраном
void lcd()
{
init_port(); // инициализируем порт A для lcd
lcd_init(); // инициализируем ЖКИ дисплей
lcd_clear();
}
// работа с usart
void uart_init( void )
{
//настройка скорости обмена
UBRRH = 0;
UBRRL = 12;// 4800 скорость
//8 бит данных, 1 стоп бит, без контроля четности
UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
//разрешить прием и передачу данных
UCSRB = ( 1 << TXEN ) | ( 1 <<RXEN );
}
unsigned char uart_getc( void )//прием данных с ПК
{
//ждем приема байта
while(!( UCSRA & ( 1 << RXC )) );
//считываем принятый байт
return UDR;
}
void uart_putc( unsigned char g )//передача данных на ПК
{
//ждем окончания передачи предыдущего байта
while(( UCSRA & ( 1 << UDRE ) )==0 );
UDR = g;
}
void uart_puts( char *str )
{
unsigned char g;
while( ( g = *str++ ) != 0 ) {
uart_putc( g );
}
}
int main( void )//основная программа
{
lcd();// инициализируем жк
uart_init();// инициализируем usart
//unsigned char g;
//uart_puts( "Hello uart\r\n" );// r,n- переход на новую строку
int x=0;
int y=0;

int m=0;
while( 1 ) // бесконечный цикл программы
{
lcd_clear();// очистка экрана жк
lcd_putstring("zapusc");// выводим zapusc на жк
_delay_ms(500);// пауза 0.5 секунды
uart_puts("H" );// отправить H по usart
lcd_clear();// очистка экрана жк
for (m = 0; m <= 81; m++)
{
char f = uart_getc();// присваеваем с принятые байты
	 if(f == '.')
{//проверяем условие c = '.' означающее конец строки
if(m<41){m=42;y=1;x=0;}//проверяем условие если первоя строка перепрыгиваем на вторую
else{m=82;}//получаеться вторая значит заканчиваем работать
}
else {// если точка не пришла то выводим символ
lcd_gotoxy (x,y);
lcd_putchar( f );
_delay_ms(2000);
x++;
 }
}
m=0;
x=0;
y=0;
}
return 0;
}

lcd.h

//проект написан для lcd использовалась атмега32
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
//#define F_CPU 1000000// не на что не влияет
#define LCD_E_SET PORTD|=0x04 // установка лог. «1″ на линии E
#define LCD_E_CLR PORTD&=0xFB // установка лог. «0″ на линии E
#define LCD_RS_SET PORTD|=0x8 //установка лог. «1″ на линии RS
#define LCD_RS_CLR PORTD&=0xF7 // установка лог. «0″ на линии RS
#define LCD_COMMAND 0 // макрос, указывающий функции, что передаются команды
#define LCD_DATA 1 // макрос, указывающий функции, что передаются данные
#define BUF_SIZE 128//размер памяти
void init_port()//инициализация портов, подключенных к жки
{
DDRD=0xFC;//настраевает на выход сигнала на порту
PORTD=0x00;//на выходе устанавливаються 0
}
void lcd_putnibble(char t) //функция передачи тетрады в жки
{
t<<=4; // сдвиг в лево (пример) 0b0101 1100<<4 = 0b1100 0000
LCD_E_SET; // установка лог. «1″ на линии E
_delay_us(50);
PORTD&=0x0F; // стираем прошлую половинку байта
PORTD|=t;				 // рисуем половинку байта на порте A
LCD_E_CLR; // установка лог. «0″ на линии E
_delay_us(50);
}
/* функция передачи байта в жки.
char c — сам байт
char rs — переменная, указывающая что передается:
 rs = 0 — команда (устанавливается линия RS)
 rs = 1 — данные (сбрасывается линия RS) */
void lcd_putbyte(char c, char rs)
{
char highc=0; //переменная для хранения старшой части байта
highc=c>>4; //заносим старшую часть байта в переменную
if (rs==LCD_COMMAND) LCD_RS_CLR; //определяем что передаем данные или команду
else LCD_RS_SET;
lcd_putnibble(highc);// передачи тетрады в жки
lcd_putnibble(c);
}
//const char table[64] = {0x41, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA3, 0xA4, 0xA5, 0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8,
// 0x50, 0x43, 0x54, 0xA9, 0xAA, 0x58, 0xE1, 0xAB, 0xAC, 0xE2, 0xAD, 0xAE, 0xAD, 0xAF, 0xB0, 0xB1,
// 0x61, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE,
//0x70, 0x63, 0xBF, 0x79, 0xE4, 0x78, 0xE5, 0xC0, 0xC1, 0xE6, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7};
void lcd_putchar(char c) // то же самое что и lcd_putbyte (почти)
{
int ta[] = {0x41, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA3, 0xA4, 0xA5, 0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8, 0x50, 0x43, 0x54, 0xA9, 0xAA, 0x58, 0xE1, 0xAB, 0xAC, 0xE2, 0xAD, 0xAE, 0xAD, 0xAF, 0xB0, 0xB1, 0x61, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE, 0x70, 0x63, 0xBF, 0x79, 0xE4, 0x78, 0xE5, 0xC0, 0xC1, 0xE6, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7};
if( c < 0xC0 ){
char highc=0;
highc=c>>4;
LCD_RS_SET;
lcd_putnibble(highc);
lcd_putnibble(c);
}
else {
char c=( pgm_readbyte( &ta[c-0xC0] ) );
char highc=0;
highc=c>>4;
LCD_RS_SET;
lcd_putnibble(highc);
lcd_putnibble(c);
}
void lcd_init() //функция инициализации ЖКИ
{


_delay_ms(15); //ждем 15мс после подачи питания на жки.
lcd_putnibble(0b00000011); //0b00000011<<4 = 0b00110000 (выбор 8битного режима)
_delay_ms(4);
lcd_putnibble(0b00000011); //0b00000011<<4 = 0b00110000 (выбор 8битного режима)
_delay_us(100);
lcd_putnibble(0b00000011); //0b00000011<<4 = 0b00110000 (выбор 8битного режима)
_delay_ms(1);
lcd_putnibble(0b00000010); //0b00000010<<4 = 0b00100000 (выбор 4битного режима)
_delay_ms(1);
lcd_putbyte(0x2A, LCD_COMMAND); //0b00101000 (4 битный режим+подкл 2ую строку)поменял 28->2A
_delay_ms(1);
lcd_putbyte(0x0C, LCD_COMMAND); //0b00001100 (включаем изображение)
_delay_ms(1);
lcd_putbyte(0x06, LCD_COMMAND); //0b00000110 (смещение курсора влево)
_delay_ms(1);
}
void lcd_clear() // функция очистки дисплея и возврата курсора в начальную позицию
{
lcd_putbyte(0x01, LCD_COMMAND);
_delay_us(1500);
}
//* функция перемещения курсора в заданную позицию
//col — номер знакоместа по горизонтальной оси (от 0 до 15)
//row — номер строки (0 или 1) */
void lcd_gotoxy(char col, char row)
{
char adr;
adr=0x40*row+col;
adr|=0x80;//80-НАЧАЛО СТРОКИ
lcd_putbyte(adr, LCD_COMMAND);
}
void lcd_putstring (char stroka[])// разбивка строк на буквы
{ unsigned char i;
for(i=0;stroka[i]!='\0';i++)
{
lcd_putchar(stroka[i]);// буквы в строке 1-2-3-.....
}
}

в чём я ошибся пока не пойму .

Изменено пользователем lazudhic
Ссылка на комментарий
Поделиться на другие сайты

дарю.

__flash unsigned char RusChar[] =

{0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,

0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,0xAC,0xE2,0xAD,0xAE,0xC4,0xAF,0xB0,0xB1,

0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe,

0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0,0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7};

char ConvertSymToDisplayCode(char sym)

{

char c;

c = sym;

if(c >= 'А') return RusChar[c-192];

else if (c=='Ё') return 0xA2;

else if (c=='ё') return 0xB5;

else if (c=='Ь') return 0xAD;

else if (c>=0x80) return c+0x40;

return c;

}

Ссылка на комментарий
Поделиться на другие сайты

СПАСИБО . КОД ПОЧТИ ЗАРАБОТАЛ БЕЗ НЕСКОЛЬКИХ БУКВ . МОЖНО ХОТЬ АНГЛИЙСКИЕ ХОТЬ РУССКИЕ

СДЕЛАЛ ТАК

const unsigned char Russim[]PROGMEM = {0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,\
0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,0xAC,0xE2,0xAD,0xAE,0xC4,0xAF,0xB0,0xB1,\
0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe,\
0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0,0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7};

const unsigned char ConvertSymToDisplayCode(unsigned char sym)
{
//unsigned char t;
unsigned char c;
c = sym;
if(c >= 0xC0) return pgm_read_byte (Russim +(c-192));
else if (c=='Ё') return 0xA2;
else if (c=='ё') return 0xB5;
else if (c=='Ь') return 0xAD;
//else if (c>=0x80) return c+0x40;
return c;
}

ТЕПЕРЬ НЕ ХВАТАЕТ ТОЛЬКО- ёЁЬ ,КАК УЗНАТЬ В ШЕСТНАДЦАТЕРИЧНОМ ВИДЕ КАКИЕ БУДУТ ЗНАЧЕНИЯ

Ссылка на комментарий
Поделиться на другие сайты

Рас

Два

Дальше справитесь?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

КОРОЧЕ БОЛЕЕ МЕНИЕ СНОСНЫЙ КОД ПОЛУЧИЛСЯ

МК

// lcd 2004(c русскими буквами ) + usart + atmega32
#define F_CPU 1000000UL // указываеться частота МК
#include <avr/io.h> // основная библиотека
#include <util/delay.h>  // библиотека для паузы
#include <stdio.h>
#include <stdlib.h>
#include <avr/pgmspace.h>//нужен для работы const unsigned char Russim[]PROGMEM
#include "lcd.h" // библиотека для работы с жк экраном
// перекодировка на русские буквы
const unsigned char Russim[]PROGMEM = {0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,\
0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,0xAC,0xE2,0xAD,0xAE,0xC4,0xAF,0xB0,0xB1,\
0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe,\
0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0,0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7};
void lcd()
{
init_port(); // инициализируем порт A для lcd
lcd_init(); // инициализируем ЖКИ дисплей
lcd_clear();
}
// работа с usart
void uart_init( void )
{
//настройка скорости обмена
UBRRH = 0;
UBRRL = 12;// 4800 скорость
//8 бит данных, 1 стоп бит, без контроля четности
UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
//разрешить прием и передачу данных
UCSRB = ( 1 << TXEN ) | ( 1 <<RXEN );
}
unsigned char uart_getc( void )//прием данных с ПК
{
//ждем приема байта
while(!( UCSRA & ( 1 << RXC )));
//считываем принятый байт
return UDR;
}
void uart_putc( unsigned char g )//передача данных на ПК
{
//ждем окончания передачи предыдущего байта
while(( UCSRA & ( 1 << UDRE ) )==0 );
UDR = g;
}
const unsigned char ConvertSymToDisplayCode(unsigned char sym)
{
unsigned char c;
c = sym;
if(c >= 0xC0) return pgm_read_byte (Russim +(c-192));
else if (c==0xA8) return 0xA2;
else if (c==0xB8) return 0xB5;
else if (c==0xDC) return 0xAD;
return c;
}
void uart_puts( char *str )
{
unsigned char g;
while( ( g = *str++ ) != 0 ) {
 uart_putc( g );
}
}
int main( void )//основная программа
{
lcd();// инициализируем жк
uart_init();// инициализируем usart
//uart_puts( "Hello uart\r\n" );// r,n- переход на новую строку
char x=0;
char y=0;
char m=0;
unsigned char r=0;
while( 1 ) // бесконечный цикл программы
{
 lcd_clear();// очистка экрана жк
 lcd_putstring("zapusc");// выводим zapusc на жк
 _delay_ms(500);// пауза 0.5 секунды
 uart_puts("H" );// отправить H по usart
 lcd_clear();// очистка экрана жк
 for (m = 0; m <= 80; m++)
 {// в первой строке 20сим+3строка 20 сим.вторая строка 20 сим+4строка 20 сим
  unsigned char f = uart_getc();// присваеваем с принятые байты
  if(f == '.') //проверка на конец строки
  {//проверяем условие c = '.' означающее конец строки
   if(m<40){m=40;y=1;x=0;lcd_putchar( f );}//проверяем условие если первоя строка перепрыгиваем на вторую
   else{m=81;lcd_putchar( f );}//получаеться вторая значит заканчиваем работать
  }
  else {// если точка не пришла то выводим символ
   lcd_gotoxy (x,y);
   r=ConvertSymToDisplayCode ( f );// проверяем есть ли русские символы если есть, то меняем код
   lcd_putchar( r );
   x++;
    }
 }
 m=0;
 x=0;
 _delay_ms(2000);
 y=0;
}
return 0;
}

LCD

//проект написан для lcd использовалась атмега32
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
//#define F_CPU 1000000// не на что не влияет
#define LCD_E_SET PORTD|=0x04  // установка лог. «1″ на линии E
#define LCD_E_CLR PORTD&=0xFB // установка лог. «0″ на линии E
#define LCD_RS_SET PORTD|=0x8 //установка лог. «1″ на линии RS
#define LCD_RS_CLR PORTD&=0xF7 // установка лог. «0″ на линии RS
#define LCD_COMMAND 0 // макрос, указывающий функции, что передаются команды
#define LCD_DATA 1 // макрос, указывающий функции, что передаются данные
#define BUF_SIZE 128//размер памяти
void init_port()//инициализация портов, подключенных к жки
{
DDRD=0xFC;//настраевает на выход сигнала на порту
PORTD=0x00;//на выходе устанавливаються 0
}
void lcd_putnibble(char t) //функция передачи тетрады в жки
{
t<<=4;  // сдвиг в лево (пример) 0b0101 1100<<4 = 0b1100 0000
LCD_E_SET; // установка лог. «1″ на линии E
_delay_us(50);
PORTD&=0x0F; // стираем прошлую половинку байта
PORTD|=t;				  // рисуем половинку байта на порте A
LCD_E_CLR;  // установка лог. «0″ на линии E
_delay_us(50);
}
/* функция передачи байта в жки.
char c — сам байт
char rs — переменная, указывающая что передается:
    rs = 0 — команда (устанавливается линия RS)
    rs = 1 — данные (сбрасывается линия RS) */
void lcd_putbyte(char c, char rs)
{
char highc=0; //переменная для хранения старшой части байта
highc=c>>4; //заносим старшую часть байта в переменную
if (rs==LCD_COMMAND) LCD_RS_CLR; //определяем что передаем данные или команду
else LCD_RS_SET;
lcd_putnibble(highc);// передачи тетрады в жки
lcd_putnibble(c);
}

void lcd_putchar(char c) // то же самое что и lcd_putbyte (почти)
{
char highc=0;
highc=c>>4;
LCD_RS_SET;
lcd_putnibble(highc);
lcd_putnibble(c);
}

void lcd_init() //функция инициализации ЖКИ
{
_delay_ms(15);   //ждем 15мс после подачи питания на жки.
lcd_putnibble(0b00000011); //0b00000011<<4 = 0b00110000 (выбор 8битного режима)
_delay_ms(4);
lcd_putnibble(0b00000011); //0b00000011<<4 = 0b00110000 (выбор 8битного режима)
_delay_us(100);
lcd_putnibble(0b00000011); //0b00000011<<4 = 0b00110000 (выбор 8битного режима)
_delay_ms(1);
lcd_putnibble(0b00000010); //0b00000010<<4 = 0b00100000 (выбор 4битного режима)
_delay_ms(1);
lcd_putbyte(0x2A, LCD_COMMAND); //0b00101000 (4 битный режим+подкл 2ую строку)поменял 28->2A
_delay_ms(1);
lcd_putbyte(0x0C, LCD_COMMAND); //0b00001100 (включаем изображение)
_delay_ms(1);
lcd_putbyte(0x06, LCD_COMMAND); //0b00000110 (смещение курсора влево)
_delay_ms(1);
}
void lcd_clear() // функция очистки дисплея и возврата курсора в начальную позицию
{
lcd_putbyte(0x01, LCD_COMMAND);
_delay_us(1500);
}
//* функция перемещения курсора в заданную позицию
//col — номер знакоместа по горизонтальной оси (от 0 до 15)
//row — номер строки (0 или 1) */
void lcd_gotoxy(char col, char row)
{
char adr;
adr=0x40*row+col;
adr|=0x80;//80-НАЧАЛО СТРОКИ
lcd_putbyte(adr, LCD_COMMAND);
}
void lcd_putstring (char stroka[])// разбивка строк на буквы
{ unsigned char i;
for(i=0;stroka[i]!='\0';i++)
{
lcd_putchar(stroka[i]);// буквы в строке 1-2-3-.....
}
}

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...