Консультация № 190055
17.11.2016, 16:28
0.00 руб.
0 7 1
Здравствуйте! Прошу помощи в следующем вопросе:
Данный код написанный в (CodeVisionAVR) под atmega16, выводит фамилии слева на право русским шрифтом,а вопрос заключается в следующем как изменить код, чтобы вывод на дисплей происходил с права налево, а также примечательно то,что для каждой буквы своя команда и код,хотелось бы узнать как или где узнать код под нужную букву.


Приложение:
#include <io.h>
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#include <math.h>
#include <stdlib.h>
volatile long int k,k1,ct1,ct0,p,H,L,code,START;
void main(void)
{
while (1)
{
DDRA=0xFF;
PORTA=0;
for (k=0; k<2; k++) { /*4-хбитный интерфейс, 1строка*/
PORTA=0b00101000;
PORTA.3=0;
PORTA=0b11001000;
PORTA.3=0;
delay_us(42);
}
PORTA=0b00001000; /*Включить дисплей, выключить курсор*/
PORTA.3=0;
PORTA=0b11001000;
PORTA.3=0;
delay_us(42);


// установить курсор в 7 позицию
// PORTA=0b10001000;
// PORTA.3=0;
// PORTA=0b01111000;
// PORTA.3=0;
// delay_us(42);
//Установить курсор в поз.71
//PORTA=0b11001000;
//PORTA.3=0;
//PORTA=0b01111000;
//PORTA.3=0;
//delay_us(42);

// установить курсор в 0 позицию
//PORTA=0b00001000;
//PORTA.3=0;
//PORTA=0b00001000;
//PORTA.3=0;
//delay_us(42);

//Установить курсор в 64 позицию
PORTA=0b11001000;
PORTA.3=0;
PORTA=0b00001000;
PORTA.3=0;
delay_ms(500);

//Сдвиг экрана влево
PORTA=0b00001000;
PORTA.3=0;
PORTA=0b01011000;
PORTA.3=0;
delay_us(42);

//Вывод симмвола "в"
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b00111100;
PORTA.3=0;
delay_ms(500);


//Вывод О
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b11111100;
PORTA.3=0;
delay_ms(500);



//Вывод н
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b11011100;
PORTA.3=0;
delay_ms(500);


//Вывод О
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b11111100;
PORTA.3=0;
delay_ms(500);


//Вывод З
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b01111100;
PORTA.3=0;
delay_ms(500);

//пробел
PORTA=0b00101100;
PORTA.3=0;
PORTA=0b00001100;
PORTA.3=0;
delay_ms(500);

// вывод а
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b00011100;
PORTA.3=0;
delay_ms(500);

//Вывод симмвола "в"
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b00111100;
PORTA.3=0;
delay_ms(500);

//Вывод О
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b11111100;
PORTA.3=0;
delay_ms(500);

// вывод Л
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b10111100;
PORTA.3=0;
delay_ms(500);

//вывод С
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b00111100;
PORTA.3=0;
delay_ms(500);

// вывод а
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b00011100;
PORTA.3=0;
delay_ms(500);

// вывод М
PORTA=0b01001100;
PORTA.3=0;
PORTA=0b11011100;
PORTA.3=0;
delay_ms(500);

//пробел
PORTA=0b00101100;
PORTA.3=0;
PORTA=0b00001100;
PORTA.3=0;
delay_ms(500);

//Вывод симмвола "в"
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b00111100;
PORTA.3=0;
delay_ms(500);

//Вывод О
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b11111100;
PORTA.3=0;
delay_ms(500);

// выводим Д
PORTA=0b11101100;
PORTA.3=0;
PORTA=0b00001100;
PORTA.3=0;
delay_ms(500);

// вывод а
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b00011100;
PORTA.3=0;
delay_ms(500);

//вывод Р
PORTA=0b01111100;
PORTA.3=0;
PORTA=0b00001100;
PORTA.3=0;
delay_ms(500);

//выводим Г
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b01001100;
PORTA.3=0;
delay_ms(500);

//Вывод О
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b11111100;
PORTA.3=0;
delay_ms(500);

//Вывод н
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b11011100;
PORTA.3=0;
delay_ms(500);

//вывод И
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b10001100;
PORTA.3=0;
delay_ms(500);

//Вывод симмвола "в"
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b00111100;
PORTA.3=0;
delay_ms(500);

//пробел
PORTA=0b00101100;
PORTA.3=0;
PORTA=0b00001100;
PORTA.3=0;
delay_ms(500);
}}

Обсуждение

давно
Посетитель
7438
7205
17.11.2016, 17:00
общий
17.11.2016, 17:01
Адресаты:
1) Какой дисплей?
2) Как дисплей подключен? На порт А, понятноКакие выводы куда?
Можно дать схему или описать словами...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400192
3
17.11.2016, 17:06
общий
Адресаты:
Цитата: Лысков Игорь Витальевич
Можно дать схему или описать словами..

Вот схема
Прикрепленные файлы:
2923d5fc6373ec3ac57b0a063ec888ea.png
давно
Посетитель
7438
7205
17.11.2016, 17:13
общий
17.11.2016, 17:18
Адресаты:
Дисплей какой?
WH1602?
Ну да, похоже
Ок, посмотрю...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
17.11.2016, 17:43
общий
это ответ
Здравствуйте, KORSAJan!
1) Прежде чем изучать программу, надо почитать datasheet на "железо"
WH1602A-YGH-CTK.pdf (233.0 кб)
На странице 13 приведена кодовая таблица, в соответствии с которой и кодируются символы.
2) Команды и данные посылаются в 2 этапа, сначала старший полубайт, потом младший.
Например:
Код:
//Вывод символа "в" 
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b00111100;
PORTA.3=0;
delay_ms(500);

Имеем код 0b1011 * 16 + 0b0011 = 0b10110011 = 0xb3
Что посылается, команда или данные, определяет управление RS (= 1/0 - данные/управление)
3) Направление, а также автоинкремент/автодекремент задается командой Entry Mode Set (стр 14 datasheet)
Имеем код команды 0b000001(I/D)(SH), SH задает автоинкремент/автодекремент, I/D - инкремент/декремент (0/1)
Вам надо задать команду 0b00000111 (вместо 0b00000101). Здесь:
Код:
 //Сдвиг экрана влево
PORTA=0b00001000;
PORTA.3=0;
PORTA=0b01011000;
PORTA.3=0;
delay_us(42);

Не забудьте установить начальную позицию с правого края экрана
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400704
4
21.11.2016, 17:40
общий
Адресаты:
Вот что у меня получилось, но я так и не разобрался исходя из Вашей подсказки как сделать так чтобы, надпись шла справа налево,а так же если у вас есть можете ли посмотреть правильно ли я закодировал символы. Таблицу кодов из лабораторной я прикрепил
Код:

#include <io.h>
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#include <math.h>
#include <stdlib.h>
volatile long int k,k1,ct1,ct0,p,H,L,code,START;
void main(void)
{
while (1)
{
DDRA=0xFF;
PORTA=0;
for (k=0; k<2; k++) { /*4-хбитный интерфейс, 1строка*/
PORTA=0b00101000;
PORTA.3=0;
PORTA=0b11001000;
PORTA.3=0;
delay_us(42);
}
PORTA=0b00001000; /*Включить дисплей, выключить курсор*/
PORTA.3=0;
PORTA=0b11001000;
PORTA.3=0;
delay_us(42);


// установить курсор в 7 позицию
// PORTA=0b10001000;
// PORTA.3=0;
// PORTA=0b01111000;
// PORTA.3=0;
// delay_us(42);
//Установить курсор в поз.71
//PORTA=0b11001000;
//PORTA.3=0;
//PORTA=0b01111000;
//PORTA.3=0;
//delay_us(42);

// установить курсор в 0 позицию
//PORTA=0b00001000;
//PORTA.3=0;
//PORTA=0b00001000;
//PORTA.3=0;
//delay_us(42);

//Установить курсор в 64 позицию
PORTA=0b11001000;
PORTA.3=0;
PORTA=0b00001000;
PORTA.3=0;
delay_ms(500);

//Сдвиг экрана влево
PORTA=0b00001000;
PORTA.3=0;
PORTA=0b01011000;
PORTA.3=0;
delay_us(42);

// вывод Л
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b10111100;
PORTA.3=0;
delay_ms(500);

//вывод И
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b10001100;
PORTA.3=0;
delay_ms(500);

//вывод С
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b00111100;
PORTA.3=0;
delay_ms(500);

//Вывод О
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b11111100;
PORTA.3=0;
delay_ms(500);

//выводим Г
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b01001100;
PORTA.3=0;
delay_ms(500);

//выводим У
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b10101001;
PORTA.3=0;
delay_ms(500);

//выводим б
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b010100000;
PORTA.3=0;
delay_ms(500);

//выводим е
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b01101110;
PORTA.3=0;
delay_ms(500);

//Вывод н
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b11011100;
PORTA.3=0;
delay_ms(500);

//Вывод к
PORTA=0b10111100;
PORTA.3=0;
PORTA=0b10111010;
PORTA.3=0;
delay_ms(500);

//Вывод О
PORTA=0b01101100;
PORTA.3=0;
PORTA=0b11111100;
PORTA.3=0;
delay_ms(500);

//пробел
PORTA=0b00101100;
PORTA.3=0;
PORTA=0b00001100;
PORTA.3=0;
delay_ms(500);

}}
Прикрепленные файлы:
895f41aa9cc3644ede05f1febddef799.jpg
давно
Посетитель
7438
7205
21.11.2016, 18:31
общий
Вы кто? KORSAJan или dteplyakova80?
Неправильно!
Ваша ошибка в том, что Вы не понимаете, как управляется дисплей!
Полубайты данных задаются в старшем полубайте порта PORTA!!!!
Посмотрите приведенную схему, если не соизволили разобраться в программировании дисплея!

Рассказываю, как надо задать код, например, символа 'б' = 0b10110010 = 0xb2
//старшие 4 бита содержат старшие 4 бита кода = 0b1011
//бит porta.3 = 1 формируем первую фазу строба
//бит porta.2 = 1 задает обмен данными (а не командой)
//остальные не задействованы, указываем нулями
//при задании данных последние четыре бита должны быть всегда 0b1100
PORTA=0b10111100;
PORTA.3=0; //вторая фаза строба, старший полубайт взят дисплеем

//старшие 4 бита содержат младшие 4 бита кода = 0b0010
//младшие 4 бита 0b1100 !
PORTA=0b00101100;
PORTA.3=0; //вторая фаза строба, младший полубайт взят дисплеем
delay_ms(500); //пауза, чтобы дисплей отработал код

Далее, для задания автосдвига влево необходимо дать команду 0b00000111
Вместо
//Сдвиг экрана влево
PORTA=0b00001000;
PORTA.3=0;
PORTA=0b01011000;
PORTA.3=0;
delay_us(42);

//старшие 4 бита содержат старшие 4 бита кода = 0b0000
//бит porta.3 = 1 формируем первую фазу строба
//бит porta.2 = 0 задает команду!
//остальные не задействованы, указываем нулями
//при задании команды последние четыре бита должны быть всегда 0b1000
PORTA=0b00001000;
PORTA.3=0; //строб по porta.3

//старшие 4 бита содержат младшие 4 бита кода = 0b0111
//младшие 4 бита 0b1000 !
PORTA=0b01111000;
PORTA.3=0; //строб по porta.3
delay_us(42); //пауза
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400704
4
21.11.2016, 19:48
общий
Адресаты:
Наконец-то мне стало все передельно ясно))
Форма ответа