Не могли бы подсказать, где ошибка? на дисплее просто мигающий курсор
#include <avr/io.h>
//#include <intrinsics.h>
#define F_CPU 8000000
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
// #define _delay_us(us) __delay_cycles((F_CPU / 1000000) * (us));
// #define _delay_ms(ms) __delay_cycles((F_CPU / 1000) * (ms));
//порт к которому подключена шина данных ЖКД
#define PORT_DATA PORTD
#define PIN_DATA PIND
#define DDRX_DATA DDRD
//порт к которому подключены управляющие выводы
#define PORT_SIG PORTB
#define PIN_SIG PINB
#define DDRX_SIG DDRB
//номера выводов микроконтроллера
//к которым подключены управляющие выводы ЖКД
#define RS 4
#define RW 5
#define EN 6
//макросы для работы с битами
#define ClearBit(reg, bit) reg &= (~(1<<(bit)))
#define SetBit(reg, bit) reg |= (1<<(bit))
//функция записи команды
void LcdWriteCom(unsigned char data)
{
ClearBit(PORT_SIG, RS); // устанавливаем RS в 0
PORT_DATA = data; // выводим данные на шину
SetBit(PORT_SIG, EN); // устанавливаем Е в 1
_delay_ms(60);
ClearBit(PORT_SIG, EN); // устанавливаем Е в 0
_delay_ms(60);
}
//функция записи данных
void LcdWriteData(unsigned char data)
{
SetBit(PORT_SIG, RS); //устанавливаем RS в 1
PORT_DATA = data; //выводим данные на шину
SetBit(PORT_SIG, EN); //устанавливаем Е в 1
_delay_ms(60);
ClearBit(PORT_SIG, EN); // устанавливаем Е в 0
_delay_ms(60);
}
//функция инициализации
void InitLcd(void)
{
//настраиваем порты ввода/вывода
DDRX_DATA = 0xff;
PORT_DATA = 0xff;
DDRX_SIG = 0xff;
PORT_SIG |= (1<<RW)|(1<<RS)|(1<<EN);
ClearBit(PORT_SIG, RW);
_delay_ms(60);
LcdWriteCom(0x38); //0b00111000 - 8 разрядная шина, 2 строки
LcdWriteCom(0x0f); //0b00001111 - дисплей, курсор, мерцание включены
LcdWriteCom(0x01); //0b00000001 - очистка дисплея
_delay_ms(60);
LcdWriteCom(0x06); //0b00000110 - курсор движется вправо, сдвига нет
}
void InitADC(void)
{
ADMUX |=(1<<REFS0)|(1<<ADLAR);//AVCC — источник опорного напряжения
ADCSRA |=(1<<ADEN)|(1<<ADIE)|(1<<ADPS1)|(1<<ADPS2);
}
void Send_Str (char* str,char length)// Отправить строку LCD, длины length
{
for (int i = 0;i<length;i++)
{
LcdWriteData(*str);
str++;
_delay_us(60);
}
}
ISR (ADC_vect) //Прерывание окончания преобразования АЦП
{
float Voltage = ADCH*0.00489;//Результат преобразования хранится в ADCW = ADCH:ADCL
char buffer [5];// Строка для отправки LCD
sprintf(buffer,"U=%.2f V",Voltage);// Преобразуем значение напряжения к строке
LcdWriteCom(0b00000001);// Подаем команду очистки экрана
_delay_ms(2);// Пауза для ожидания завершения исполнения команды
Send_Str(buffer,10); // Отправляем строку
_delay_ms(100); //Пауза
ADCSRA |=(1<<ADSC); //Запускаем следующее преобразование
}
int main(void)
{
InitADC();
InitLcd();
while(1)
{
}
}