lazudhic Опубликовано 13 декабря, 2015 Поделиться Опубликовано 13 декабря, 2015 (изменено) Я начинающий в языке си. и у меня возникла проблемка : 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 лучше отключить т.к. он будет ждать пока не прилетит как минимум две точки Изменено 13 декабря, 2015 пользователем lazudhic 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
koms45 Опубликовано 13 декабря, 2015 Поделиться Опубликовано 13 декабря, 2015 (изменено) 2004.rarСи органически не перевариваю. Но помочь несложно. В первой строке десятичный код, во второй символ. С фузами надеюсь управишся. RST особенно, я на схеме не указал что его подтянуть надо. Изменено 13 декабря, 2015 пользователем koms45 0 Так ку или не ку ?! Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
COKPOWEHEU Опубликовано 13 декабря, 2015 Поделиться Опубликовано 13 декабря, 2015 (изменено) Самое простое - таблица перекодировки. 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'ов, но уж таблицу оттуда выдрать не проблема. Изменено 13 декабря, 2015 пользователем COKPOWEHEU 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Особенности хранения литиевых аккумуляторов и батареекПотеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
lazudhic Опубликовано 13 декабря, 2015 Автор Поделиться Опубликовано 13 декабря, 2015 (изменено) ну первое у меня lcd поддерживает кириллицу. мне нужно как то узнать какой символ прилетел по usart . ну что то типа такого int main(void) { char f[] = "z"; while(1) { int buff; buff=getchar (f); lcd_putstring(buff); } } программа жутко ругается . пробовал (atoi, getchar) , ещё немного возьму бубен и в пляс пойду вокруг сего устройства Изменено 13 декабря, 2015 пользователем lazudhic 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Секреты депассивации литиевых батареек FANSO EVE EnergyСамыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
lazudhic Опубликовано 13 декабря, 2015 Автор Поделиться Опубликовано 13 декабря, 2015 (изменено) попробовал прикрутить к 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-..... } } в чём я ошибся пока не пойму . Изменено 13 декабря, 2015 пользователем lazudhic 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
lazudhic Опубликовано 14 декабря, 2015 Автор Поделиться Опубликовано 14 декабря, 2015 ну немного о флеш памяти 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
__alexander Опубликовано 14 декабря, 2015 Поделиться Опубликовано 14 декабря, 2015 дарю. __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; } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
lazudhic Опубликовано 16 декабря, 2015 Автор Поделиться Опубликовано 16 декабря, 2015 СПАСИБО . КОД ПОЧТИ ЗАРАБОТАЛ БЕЗ НЕСКОЛЬКИХ БУКВ . МОЖНО ХОТЬ АНГЛИЙСКИЕ ХОТЬ РУССКИЕ СДЕЛАЛ ТАК 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; } ТЕПЕРЬ НЕ ХВАТАЕТ ТОЛЬКО- ёЁЬ ,КАК УЗНАТЬ В ШЕСТНАДЦАТЕРИЧНОМ ВИДЕ КАКИЕ БУДУТ ЗНАЧЕНИЯ 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 16 декабря, 2015 Поделиться Опубликовано 16 декабря, 2015 Рас Два Дальше справитесь? 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
lazudhic Опубликовано 17 декабря, 2015 Автор Поделиться Опубликовано 17 декабря, 2015 КОРОЧЕ БОЛЕЕ МЕНИЕ СНОСНЫЙ КОД ПОЛУЧИЛСЯ МК // 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-..... } } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.