ЖК-сдвиг вправо и сдвиг влево ошибки

Я сделал библиотеку для ЖК-дисплея с контроллером HD44780 в нем, и из таблицы данных я прочитал, что код 0x18 сдвинет весь дисплей на одну позицию влево, но когда я это сделал, дисплей исчезнет. Я также читал, что 0x1C сдвигает весь дисплей на одну позицию вправо, но когда я это сделал, весь дисплей сдвигается влево.

Мой код:

    /*
 * main.c
 *
 * Created: 11/14/2013 7:54:02 PM
 *  Author: A R M T
 */ 
#include <avr/io.h>

#define F_CPU 1000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#define LCD_DPRT PORTA                   //LCD DATA PORT
#define LCD_DDDR DDRA                    //LCD DATA DDR
#define LCD_DPIN PINA                    //LCD DATA PIN
#define LCD_CPRT PORTB                   //LCD COMMANDS PORT
#define LCD_CDDR DDRB                    //LCD COMMANDS DDR
#define LCD_CPIN PINB                    //LCD COMMANDS PIN
#define LCD_RS 0                         //LCD RS
#define LCD_RW 1                         //LCD RW
#define LCD_EN 2                         //LCD EN

//*************************************************************

void delay_us(unsigned int d);
void lcdCommand(unsigned char cmnd);
void lcdData(unsigned char data);
void lcd_init(void);
void lcd_gotoxy(unsigned char x, unsigned char y);
void lcd_print(char *str);


//*************************************************************
void delay_us(unsigned int d)
{
    _delay_us(d);
}
//*************************************************************
void lcdCommand(unsigned char cmnd)
{
    LCD_DPRT = cmnd;                   //send cmnd to data port
    LCD_CPRT &= ~(1<<LCD_RS);          //RS = 0 for command
    LCD_CPRT &= ~(1<<LCD_RW);          //RW = 0 for write
    LCD_CPRT |= (1<<LCD_EN);           //EN = 1 for H-to-l pulse
    delay_us(1);                       //Wait to make enable wide
    LCD_CPRT &= ~(1<<LCD_EN);          //EN = 1 for H-to-l pulse
    delay_us(100);                     //Wait to make enable wide
}
//*************************************************************
void lcdData(unsigned char data)
{
    LCD_DPRT = data;                    //send data to data port
    LCD_CPRT |= (1<<LCD_RS);            //RS = 1 for data
    LCD_CPRT &= ~(1<<LCD_RW);           //RW = 0 for write
    LCD_CPRT |= (1<<LCD_EN);            //EN = 1 for H-to-L pulse
    delay_us(1);                        //wait to make enable wide
    LCD_CPRT &= ~(1<<LCD_EN);           //EN = 0 for H-to-L pulse
    delay_us(100);                      //wait to make enable wide
}
//*************************************************************
void lcd_init(void)
{
    LCD_DDDR = 0xFF;
    LCD_CDDR = 0xFF;

    LCD_CPRT &= ~(1<<LCD_EN);           //LCD_EN = 0
    delay_us(15000);                    //wait for init
    lcdCommand(0x38);                   //init. LCD 2 line, 5 * 7 matrix
    lcdCommand(0x0E);                   //display on, cursor on
    lcdCommand(0x01);                   //clear LCD
    delay_us(2000);                     //wait
    lcdCommand(0x06);                   //shift cursor right
}
//*************************************************************
void lcd_gotoxy(unsigned char x, unsigned char y)
{
    unsigned char firstCharAdr[] = {0x80, 0xC0, 0x94, 0xD4};
    lcdCommand(firstCharAdr[y-1] + x - 1);
    delay_us(100);
}
//*************************************************************
void lcd_print(char *str)
{
    unsigned char i = 0;
    while (str[i] != 0)
    {
        lcdData(str[i]);
        i++;
    }
}
//*************************************************************

int main(void)
{

    lcd_init();
    lcd_gotoxy(1,1);
    lcd_print("Armia");
    lcd_gotoxy(1,2);
    lcd_print("Wagdy");
    _delay_ms(1000 / 2);
    lcdCommand(0x18);   // Shift the entire display one position to the left
    while(1);
    return 0;
}

Я имел в виду, что когда я записал этот код, я исключил, что aftr (1000/2) мс этот вывод сместится влево enter image  описание здесь

но то, что появляется, было (слово исчезает вместо того, чтобы сдвинуться на одну позицию влево)

введите описание изображения здесь

Кто-нибудь может мне помочь в этой проблеме, пожалуйста ?!


person Armia Wagdy    schedule 19.11.2013    source источник
comment
Из таблицы (я нашел ее здесь: www.sparkfun.com/datasheets/LCD/HD44780.pdf) команда для перемещения курсора или экрана в двоичном формате - 0001YZ00. Y = 1 для перемещения дисплея, Z = 1 для сдвига вправо, Z = 0 для сдвига влево. Так что да, 0x1C должен сдвигать вправо, а 0x18 должен сдвигать его влево ...   -  person Ross    schedule 19.11.2013
comment
но то, что появляется, было (слово исчезает вместо того, чтобы сдвинуться на одну позицию влево)   -  person Armia Wagdy    schedule 19.11.2013
comment
Я понимаю; однако я не увидел в вашем коде ничего неправильного, что могло бы вызвать это. Функция lcd_command () должна работать, поскольку вы используете ее в lcd_init () и lcd_gotoxy () ... Правильно ли работает _delay_ms () в основном? В коде ЖК-дисплея вы используете _delay_us () ... В остальном я не догадываюсь.   -  person Ross    schedule 19.11.2013
comment
Это может быть ошибка модели симулятора, например, если они не переносят строку дисплея на 40, как должно. Сдвиг в одну сторону установит адрес дисплея как -1, который в реальном устройстве преобразуется в 39. Что это за симулятор?   -  person Yann Vernier    schedule 25.11.2013


Ответы (1)


Я пробовал ваш код в версии Proteus 7.10, и сдвиг влево работает нормально

сдвиг влево

Обратите внимание, что вы используете функцию _delay_us с параметром переменной, это неправильный способ, он дает неправильные задержки и генерирует большой шестнадцатеричный файл, потому что заставляет включать библиотеку с плавающей запятой.

руководство по delay.h

Примечание. Чтобы эти функции работали должным образом, необходимо включить оптимизацию компилятора, а время задержки должно быть выражением, которое является известной константой во время компиляции. Если эти требования не выполняются, результирующая задержка будет намного дольше (и в основном непредсказуемой), а приложения, которые в противном случае не используют вычисления с плавающей запятой, испытают серьезное раздувание кода из-за подпрограмм библиотеки с плавающей запятой, связанных с приложением.

Замените код циклом, который вызывает задержку несколько раз.

while (d--) 
{
  _delay_ms(1);
} 
person alexan_e    schedule 09.12.2013