首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >液晶显示与atmega16接口

液晶显示与atmega16接口
EN

Stack Overflow用户
提问于 2014-06-16 15:44:12
回答 3查看 1.6K关注 0票数 1

我试着将液晶显示器与atmega16接口,我的液晶显示器是jhd 162 A。我附加了代码以及schematic.whenever,我连接了适当的引脚,只看到了黑点,而不是我想要显示的。我不能知道我的问题是什么。我还附了示意图。

代码语言:javascript
运行
复制
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000L

#define lcd_data    PORTC
#define control     PORTB
#define rs          PB2
#define rw          PB1
#define en          PB0

void lcd_init (void);
void lcd_command(unsigned char cmd);
void lcd_write(unsigned char data);
void lcd_string(unsigned char *str);
void dis_cmd(char cmd_value);
void dis_write(unsigned char data);

int main()
{
    DDRB = 0xFF;
    DDRC = 0xFF;

    lcd_init();
    _delay_ms(50);

    _delay_ms(1);
    lcd_str("PROGRAMMING");
    _delay_ms(50);
    dis_cmd(0xc0);
    lcd_str("IS FUN");
     return 0;
}

void lcd_init (void)
{
    dis_cmd(0x02); //initialises lcd  on 4 bits mode
    _delay_ms(1);
    dis_cmd(0x28); //initialises lcd to use 2 line and 5*7 matrix ie 16*2 lcd on 8 bits
    _delay_ms(1);
    dis_cmd(0x01);//clears lcd screen
    _delay_ms(1);
    dis_cmd(0x0E);//display ON cursor ON
    _delay_ms(1);
    dis_cmd(0x80);//cursor is set on the 1st line
    _delay_ms(1);
    return;

}

void lcd_command(unsigned char cmd)
{
    lcd_data =cmd;
    control = (0<<rs)| (0<<rw) | (1<<en); // setting rs to 0 is command mode when rw=0 write mode
    _delay_ms(1);
    control = (0<<rs)| (0<<rw) | (0<<en);
    _delay_ms(50);

    // 2ta control command is used for the high to low transition of enable as the code works on the falling 
    // edge of the enable en
    return;
}

void lcd_write(unsigned char data)
{
    lcd_data= data;
    control = (1<<rs)| (0<<rw) | (1<<en); // setting rs to 0 is command mode when rw=0 write mode
    _delay_ms(1);
    control = (1<<rs)| (0<<rw) | (0<<en);
    _delay_ms(50);
    return;
}

void dis_write(unsigned char data)
{
    char data1;

    data1 = data & 0xF0;        //mask lower nibble because PA4-PA7 pins are used. 
    lcd_write(data1);


    data1 = ((data<<4) & 0xF0); //shift 4-bit and mask
    lcd_write(data1);

    return;
                // send to LCD

}
void lcd_str(unsigned char *str)
{
    int i = 0;
    while(str[i] != '\0')
    {
        dis_write(str[i]);
        i++;

    }
    return;

}
void dis_cmd(char cmd_value)
{
    char cmd_value1;

    cmd_value1 = cmd_value & 0xF0;      //mask lower nibble because PB4-PA7 pins are used. 
    lcd_command(cmd_value1);            // send to LCD

    cmd_value1 = ((cmd_value<<4) & 0xF0);   //shift 4-bit and mask
    lcd_command(cmd_value1);            // send to LCD
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-17 07:34:46

我认为您没有执行所需的init序列。在lcd_init()中,首先发送函数集。

但是,在此之前,显示将等待这样的序列:

我不知道如何使用4位接口来处理这个问题,但我认为这就是DB3-0“不关心”的原因。您可能只需将DB7-4应用于您的4位总线(读取数据表)。

我会在启动时等待几百毫秒,以确保Vcc是稳定的。然后,按照重置顺序与放松的时间,如

PowerOn

等待200

发送指令

等待20

发送指令

等待5毫秒

发送指令

等待5毫秒

发送函数集

..。

由于您没有轮询繁忙的标志,我将等待至少1ms之间的所有指示。

票数 0
EN

Stack Overflow用户

发布于 2014-06-21 11:08:25

您正在lcd_init中定义四位模式,您的编程是8位模式。

对于8位模式,请像这样使用它

代码语言:javascript
运行
复制
void lcd_init (void)
{
    dis_cmd(0x02); //initialises lcd  on 4 bits mode
    _delay_ms(1);
    dis_cmd(0x38); //initialises lcd to use 2 line and 5*7 matrix ie 16*2 lcd on 8 bits
    _delay_ms(1);
    dis_cmd(0x01);//clears lcd screen
    _delay_ms(1);
    dis_cmd(0x0E);//display ON cursor ON
    _delay_ms(1);
    dis_cmd(0x80);//cursor is set on the 1st line
    _delay_ms(1);
    return;

}

此外,PORTC有时会在lcd上产生问题,为此您必须禁用JTAG。

票数 0
EN

Stack Overflow用户

发布于 2014-12-23 04:47:29

您的代码中有两个问题:-

1)您正在使用“dis_cmd(0x28)”命令,该命令定义了4位模式。如果要使用8位模式,请将其更改为“dis_cmd(0x38);”

2)不要将PORTC用于lcd数据或禁用JTAG。使用JTAG启用时,PORTC不会将数据提供给lcd。我不知道背后的原因,但我已经学会了这一点,我自己的经验。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24247495

复制
相关文章

相似问题

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