Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Добавлено: Чт дек 27, 2012 15:08:38
Каждый со своей колокольни смотрит) Например мой дедушка или отец даже "выставить ногу Е" не смогли бы)
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
#include<avr/io.h>
#include<util/delay.h>
void LCD_Init(); //Функция инициализации дисплея
void LCD_PutChar(char value); //Фунция отправки символа
//И другие функции - установки типа курсора, направления перемещения текста, позиции символа, вывода числа, строки и т.п.
void LCD_Init()
{
//последовательность команд для инициализации
PORTB = blabla;
delay_ms(blabla);
PORTB = blabla;
delay_ms(blabla);
...
}
void LCD_PutChar(char value)
{
//последовательность команд для отрисовки символа
PORTB = blabla;
...;
PORTB = value;
...
delay_ms(blabla); //задержка вместо проверки занятости
}Код: Выделить всё
#define DATA_OUT PORTB.0
#define DATA_IN PINB.0
#define DATA_IO DDRB.0Код: Выделить всё
switch (rx_buffer) {
case 0:
#define DATA_OUT PORTB.0
#define DATA_IN PINB.0
#define DATA_IO DDRB.0
break;
case 1:
#define DATA_OUT PORTB.1
#define DATA_IN PINB.1
#define DATA_IO DDRB.1
break;
case 2:
#define DATA_OUT PORTB.2
#define DATA_IN PINB.2
#define DATA_IO DDRB.2
break;};Код: Выделить всё
#define DATA_IN switch(rx_buffer)
{
case 0: PINB.0; break;
case 1: PINB.1; break;
case 2: PINB.2; break;
}
#define DATA_OUT switch(rx_buffer)
{
case 0: PORTB.0; break;
case 1: PORTB.1; break;
case 2: PORTB.2; break;
}
//и т.д.Код: Выделить всё
#define DATA_IN PINA смею не согласитьсяibiza11 писал(а):#define - опция компилятора. Она используется только на этапе компиляции. Во время работы программы в контроллере нельзя переопределить константы)
Выводи в нужную позицию. Или я не понял вопроса?tux писал(а):Мне нужно вывести значение некоего счетчика на дисплей. Как это правильно сделать? Статично то LCD выводит символы, хотелось бы разобраться как выводить на дисплей значения после их обработки контроллером.
Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.Триод писал(а): Выводи в нужную позицию. Или я не понял вопроса?
Код: Выделить всё
#include <avr/pgmspace.h>
#define COMMAND 0
#define DATA 1
#define sbi(reg, bit) (reg|=(1<<bit))
#define cbi(reg, bit) (reg&=~(1<<bit))
//массив во флэш-памяти для русских символов
const char Decode2Rus[255-192+1] 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,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 };
//Тактирование LCD
void lcd_clk()
{
sbi(LCDPORT,LCD_PIN_E);
_delay_ms(1);
cbi(LCDPORT,LCD_PIN_E);
_delay_ms(1);
}
//отправка байта в LCD
void lcd_send(unsigned char type, unsigned char c)
{
if (type==COMMAND)
{cbi(LCDPORT,LCD_PIN_RS);}//RS=0 - комманда
else
{sbi(LCDPORT,LCD_PIN_RS);}
//Передача старшего полубайта
if (bit_is_set(c,7))
{ sbi(LCDPORT,LCD_PIN_D7);}
else
{cbi(LCDPORT,LCD_PIN_D7);}
if (bit_is_set(c,6))
{ sbi(LCDPORT,LCD_PIN_D6);}
else
{cbi(LCDPORT,LCD_PIN_D6);}
if (bit_is_set(c,5))
{ sbi(LCDPORT,LCD_PIN_D5);}
else
{cbi(LCDPORT,LCD_PIN_D5);}
if (bit_is_set(c,4))
{ sbi(LCDPORT,LCD_PIN_D4);}
else
{cbi(LCDPORT,LCD_PIN_D4);}
lcd_clk();
//Передача младшего полубайта
if (bit_is_set(c,3))
{ sbi(LCDPORT,LCD_PIN_D7);}
else
{cbi(LCDPORT,LCD_PIN_D7);}
if (bit_is_set(c,2))
{ sbi(LCDPORT,LCD_PIN_D6);}
else
{cbi(LCDPORT,LCD_PIN_D6);}
if (bit_is_set(c,1))
{ sbi(LCDPORT,LCD_PIN_D5);}
else
{cbi(LCDPORT,LCD_PIN_D5);}
if (bit_is_set(c,0))
{ sbi(LCDPORT,LCD_PIN_D4);}
else
{cbi(LCDPORT,LCD_PIN_D4);}
lcd_clk();
}
void lcd_write(char*t) //Отображение строки символов
{
unsigned char i;
for (i=0;i<255;i++)
{
if (t[i]==0)
{
return;
}
else
{
if (t[i]>=192)
{
lcd_send(DATA, pgm_read_byte(&(Decode2Rus[t[i]-192])));
}
else
{
lcd_send(DATA, t[i]);
}
}
}
}
Вам нужно преобразовать число в символы, тогда будет нормально выводитьtux писал(а):Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.Триод писал(а): Выводи в нужную позицию. Или я не понял вопроса?
ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.vitalik_1984 писал(а): Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
Интересно, чем проще ?на асме проще выделять из числа единицы
Функция именно этим и занимается самый простой способ взять эту функцию, откомпилить и посмотреть как она в асме выглядит.Триод писал(а):ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.vitalik_1984 писал(а): Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
Код цифры = цифра + 0x30
Код: Выделить всё
ascii2num:
; num = ascii - 0x30;
subi r24, 48
ret
num2ascii:
; ascii = num -(-0x30) = num + 0x30
subi r24, -48
ret