首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >液晶显示器右移和左移错误

液晶显示器右移和左移错误
EN

Stack Overflow用户
提问于 2013-11-19 02:03:06
回答 1查看 3.4K关注 0票数 1

我为液晶显示器制作了一个带有HD44780控制器的库,从数据表中我看到,代码0x18会将整个显示移到左边一个位置,但当我这样做时,显示就消失了。我还读到0x1C会将整个显示器的一个位置向右移动,但当我这样做时,整个显示器就会向左移动。

我的代码:

代码语言:javascript
复制
    /*
 * 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;
}

我的意思是,当我刻录这段代码时,我例外地认为,在(1000/ 2) ms之后,输出将向左移动。

但出现的是(这个词消失了,而不是左移一个位置)。

有人能帮我解决这个问题吗?!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-09 00:32:11

我在ProteusVersion7.10中试用了您的代码,shift left工作正常

请注意,您使用的是带有变量参数的_delay_us函数,这不是正确的方法,它会产生错误的延迟并生成大十六进制文件,因为它强制包含浮点库。

延迟.h手册

注意:为了使这些函数按预期工作,必须启用编译器优化,而延迟时间必须是编译时已知的常量。如果不满足这些要求,所产生的延迟将更长(而且基本上无法预测),否则不使用浮点计算的应用程序将因链接到应用程序的浮点库例程而出现严重的代码膨胀。

将代码替换为多次调用延迟的循环。

代码语言:javascript
复制
while (d--) 
{
  _delay_ms(1);
} 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20061749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档