【问题标题】:lcd interfacing with atmega16液晶与atmega16接口
【发布时间】:2014-06-16 15:44:12
【问题描述】:

我尝试将 lcd 与 atmega16 连接,我的 lcd 是 jhd 162A。我附上了代码和原理图。每当我连接适当的引脚时,只会看到黑点,而不是我想要显示的内容。我不知道我的问题是什么。我还附上了原理图。!

#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
}

【问题讨论】:

    标签: avr lcd


    【解决方案1】:

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

    但是,显示会在此之前等待一个序列,如下所示:

    我不确定如何使用 4 位接口来处理这个问题,但我认为这就是 DB3-0 “不在乎”的原因。您可能只需要在您的 4 位总线上应用 DB7-4(阅读数据表)。

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

    开机
    等待 200 毫秒
    发送指令
    等待 20 毫秒
    发送指令
    等待 5 毫秒
    发送指令
    等待 5 毫秒
    发送功能集
    ...

    由于您没有轮询忙标志,因此我会在所有后续指令之间等待至少 1 毫秒。

    【讨论】:

      【解决方案2】:

      您在 lcd_init 中定义了四位模式,而您的编程是针对 8 位模式的。

      对于8位模式,这样使用

      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

      【讨论】:

        【解决方案3】:

        你的代码有两个问题:-

        1) 您正在使用命令“dis_cmd(0x28);”它定义了 4 位模式。如果您想使用 8 位模式,请通过“dis_cmd(0x38);”更改它

        2) 要么不要将 PORTC 用于 lcd 数据,要么禁用 JTAG。启用 JTAG 后,PORTC 不会向 lcd 提供数据。我不知道它背后的原因,但我有自己的经验。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          • 1970-01-01
          • 2016-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多