2013-11-19 9 views
1

Я создал библиотеку для ЖК-дисплея с контроллером 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; 
} 

Я имел в виду, что, когда я сжег этот код я excepected что aftr (1000/2) мс этот выход будет смещаться влево enter image description here

но что появляется был (слово исчезает вместо сдвига влево на один postition)

enter image description here

может любой Помогите мне в этой проблеме, пожалуйста ?!

+0

Из технического описания (я нашел здесь: www.sparkfun.com/datasheets/LCD/HD44780.pdf), команду для переключения курсора или экрана в двоичном формате - 0001YZ00. Y = 1 для перемещения дисплея, Z = 1 для переключения вправо, Z = 0 для сдвига влево. Итак, да, 0x1C должен сдвигаться вправо, а 0x18 должен сдвинуть его влево ... – Ross

+0

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

+1

Я понимаю; однако я не видел ничего неправильного в вашем коде, которое могло бы привести к его возникновению. Функция lcd_command() должна работать, поскольку вы используете ее в lcd_init() и lcd_gotoxy() ... Правильно ли работает _delay_ms()? В коде LCD вы используете _delay_us() ... Кроме этого у меня нет никаких догадок. – Ross

ответ

2

Я попробовал ваш код в протей версии 7.10 и сдвиг влево работает отлично

shift left

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

delay.h manual

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

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

while (d--) 
{ 
    _delay_ms(1); 
} 
Смежные вопросы