接口LCD显示在8位模式

我已经在这个网站的一个注释中讨论过液晶显示器。你可以阅读注意字符LCD显示在这里。现在让我们来看看LCD的接口方面。让我们先看看8位模式接口的LCD显示与AVR微控制器。我在这篇文章中增加了两个回路1)接口LCD与Avr Atmega82)与Atmega32.在最后你可以看到真实生活的图像,我在其中展示了角色今天“电路”

这里接口LCD与Avr, 8位数据总线是必需的。此外,我们需要2位控制总线只写模式或3位控制总线读加写模式。将LCD模块的引脚1连接到地,引脚2连接到+ve电源。在电源和地之间连接一个Pot(2到5 K欧姆)。将锅的中间引脚连接到LCD模块的引脚3。如果你想打开背光,连接- - - - - -LED引脚接地。连接+LED引脚的LCD +ve供应使用电阻器。下图是两个电路图!

1) LCD与Atmega8接口(8位模式)-电路图

LCD接口与avr单片机
LCD接口- Atmega8

2) 1) LCD与Atmega32接口(8位模式)-电路图

接口LCD显示与Avr
液晶Interfacing-Atmega32

现在,我已经为两个单独的循环写了两个例程。一个用于传输数据(或字符)。另一个发送命令。在C代码,它们列在函数下面“LCD()”“LCDcmd()”分别。为了防止数据崩溃,我们必须允许LCD完成每个操作的执行。在这里,我们将使用从AVR工作室库可用的延迟循环。每条指令或数据至少需要40美元被处决.最长的等待循环为1.65毫秒.欲了解更多细节,请阅读我的笔记在液晶显示器上显示(等一下。它不应该是' LCD display ',而应该是' LC display '。但“LCD显示”被广泛使用)AVR图书馆概述对于初学者来说。让我们检查一下代码

还有一件事,最好是在记事本(或word pad或MS word)中复制和粘贴这段代码,并检查这段代码。

//-------------------------------------------------------- 开始
# include
# include

#define DPORT PORTB //定义数据端口
#定义DPDDR DDRB

#define CPORT PORTD //定义信号端口
#定义CPDDR DDRD

#define RS PD6 //信号引脚,复位
#define EN PD7 //信号引脚,使能

/ /根据命令
#define LCDClear 0x01 //清除LCD显示
#define LCD8bit 0x38 //设置LCD在8位模式
#define LCDCursorOn 0x0f //启用游标
#define LCDSeek00 0x80 //寻找指向开始的指针

空白液晶(char ch);
空白LCDcmd(无效);
空白LCDInitialize(无效);

int main ()
{DPDDR = 0 xff;
CPDDR = 0 xf0;

_delay_ms (2000);

LCDInitialize ();
液晶显示器(' C ');
液晶显示器(“我”);
液晶显示器(' r ');
液晶显示器(' c ');
液晶显示器(' u ');
液晶显示器(“我”);
液晶显示器(' t ');
液晶显示器(“s”);
液晶显示器(' ');
液晶显示器(' T ');
液晶显示器(“o”);
液晶显示器(' d ');
液晶显示器(' a ');
液晶显示器(y);
返回0;

空白液晶(char ch)
{DPORT = ch;//给端口赋值
CPORT = (1 < < RS) | (1 < < EN);//发送数据的信令
_delay_us (10);
CPORT = (1 < < RS) | (0 < < EN);
_delay_us (45);

空白LCDcmd (char ch)
{DPORT = ch;
CPORT = (0 < < RS) | (1 < < EN);//发送命令的信号
_delay_ms (10);
CPORT = (0 < < RS) | (0 < < EN);
_delay_ms (45);
if(ch==0x01||ch==0x02) //如果命令为LCD Clear或
// LCDSeek00,延迟2mS
_delay_ms (2);

空白LCDInitialize(空白)
{LCDcmd (LCD8bit);
LCDcmd (LCDCursorOn);
LCDcmd (LCDClear);
LCDcmd (LCDSeek00);

//——————————————————– 结束

我在程序里用了很多疯狂的符号。以下是摘要。

  • 在C语言中,“0 x”前缀表示十六进制数。“0 b”代表二进制。
  • “|”位”或“操作。在这里,0 b0010 b0110 | 0 b0110 = 0。
  • “| |”逻辑”或“测试。如果在语句' A||B '中,如果其中一个或两个操作数的值不为零(或True),则语句结果为True。
  • “≪”表示按位右移操作。在这里,0 b0001≪b0100 2 = 0。
  • “≫”表示按位左移操作。在这里,0 b1000≫b0100 1 = 0。在本文中,我没有使用它们。

这就是代码的基本版本。让我们看看要编译的一些更好的函数。

//-------------------------------------------------------- 开始
# include
# include

#define DPORT PORTB //定义数据端口
#定义DPDDR DDRB

#define CPORT PORTD //定义信号端口
#定义CPDDR DDRD

#define RS PD6 //信号引脚,复位
#define EN PD7 //信号引脚,使能

#define LCDClear 0x01 //清除LCD显示
#define LCD8bit 0x38 //设置LCD在8位模式
#define LCDCursorOn 0x0f //启用游标
#define LCDSeek00 0x80 //寻找指向开始的指针

空白液晶(char ch);
空白LCDcmd(无效);
空白LCDInitialize(无效);
空白printStringLCD (char * str);
int printIntLCD(unsigned int i);

int main ()
{DPDDR = 0 xff;
CPDDR = 0 xf0;

_delay_ms (500);
LCDInitialize ();
今天printStringLCD(“电路”);
_delay_ms (5000);
LCDcmd (LCDClear);
prinStringLCD(“打印一个整数”);
LCDcmd (0 xc0);
printIntLCD (990);
返回0;

空白液晶(char ch)
{DPORT = ch;//给端口赋值
CPORT = (1 < < RS) | (1 < < EN);//发送数据的信令
_delay_us (10);
CPORT = (1 < < RS) | (0 < < EN);
_delay_us (45);

void LCDcmd(unsigned char ch)
{DPORT = ch;
CPORT = (0 < < RS) | (1 < < EN);//发送命令的信号
_delay_us (10);
CPORT = (0 < < RS) | (0 < < EN);
_delay_us (45);
如果(ch = = 0 x01 | | ch = = 0 x02)
_delay_ms (2);

空白LCDInitialize(空白)
{LCDcmd (LCD8bit);
LCDcmd (LCDCursorOn);
LCDcmd (LCDClear);
LCDcmd (LCDSeek00);

空白printStringLCD (char * str)
{int i = 0;
而(str[我]! = ' \ 0 ')
{DPORT = str(我);//给端口赋值
液晶显示器(ch);
我+ +;


int printIntLCD(unsigned int i)
{static int a;
= 0;
如果(我! = 0)
{printIntLCD (i / 10);
液晶(' 0 ' + i % 10);
+ +;

返回一个;

//——————————————————– 结束

LCD接口的照片

液晶显示器接口

你想要更专注的吗?

LCD-Circuits今天

作者

14评论

  1. 迈克

    你好,
    我在16×2 LCD (1602A)上得到不完整的字符显示
    我没有检查信号的示波器
    我正在使用准备PIC Dip 40与插座PIC18F45k22开发板。
    我接地未使用的引脚D0 - D3的LCD,因为我使用它在4位模式
    为了让它最终显示出来,我重新检查了我的线路,它开始工作了。它不是LCD,因为我用我的备件换掉了它,仍然得到相同的结果。
    现在我已经把它显示在LCD上,但是:

    输出没有显示所有字符。它缺少一些字符(它显示“Hell wrd”),而不是显示完整的“hello world”。每当我使用board reset按钮重置它时,它就会变成另一组不完整的字符:“Hlo ol”......“Hll rworld”......“Hll ol”。

    我在PIC v 7.2.0使用MikroC pro
    下面是我的代码:

    / /启动代码
    LCD_RS at LATD5_bit;
    sbit LCD_EN at LATD4_bit;
    // LCD_D0 at LATD6_bit;
    //sbit LCD_D1 at LATD7_bit;
    //sbit LCD_D2 at LATA0_bit;
    //sbit LCD_D3 at LATA1_bit;
    sbit LCD_D4 at LATD0_bit;
    LCD_D5 at LATD1_bit;
    sbit LCD_D6 at LATD2_bit;
    sbit LCD_D7 at LATD3_bit;

    sbit LCD_RS_Direction at TRISD5_bit;
    sbit LCD_EN_Direction at TRISD4_bit;
    // LCD_D0_Direction at TRISD6_bit;
    // LCD_D1_Direction at TRISD7_bit;
    // LCD_D2_Direction at tris0_bit; // LCD_D2_Direction at tris0_bit;
    // LCD_D3_Direction at trisas1_bit;
    sbit LCD_D4_Direction at TRISD0_bit;
    sbit LCD_D5_Direction at TRISD1_bit;
    sbit LCD_D6_Direction at TRISD2_bit;
    sbit LCD_D7_Direction at TRISD3_bit;

    void main () {

    TRISD = 0;//配置portd作为输出

    ANSELD = 0;// PortD为数字

    Delay_ms (2000);
    Lcd_Init ();/ /初始化液晶
    Delay_ms (5);

    Lcd_Cmd (_LCD_CLEAR);
    Delay_ms (5);
    Lcd_Cmd (_LCD_BLINK_CURSOR_ON);
    Delay_ms (5);
    Lcd_Cmd (_LCD_CURSOR_OFF);/ /光标闪烁
    Delay_ms (5);
    Lcd_Out(1, 1, " Hello World ");

    而(1)



    / /结束代码

  2. bhimesh

    先生在打印下一行做什么,我也想接口20×4 LCD与avr ..我应该在程序中做什么改变

  3. Kassadin

    嗯,我似乎不能让它工作。我定义了数据端口为D端口,信号端口为b端口,RS端口为PB2, EN端口为PB1。我在板和LCD上的所有连接都是正确的。我检查它们。当我加载程序时,它用所有的点填充第一行。我不知道为什么会这样。

  4. 维诺德

    你为什么使用电阻ri和r2(你可以在LCD接口的图像中看到)
    我们能不能通过将这个引脚连接到微控制器的任意引脚来直接给出rw信号呢

    • 拉克什

      我们已经把lcd的r/w引脚连接到+5V。它将保持LCD始终处于写模式。我们没有在LCD中使用读模式。所以为了让整个项目简单,我们将它连接到+5V。[它减少了代码和电路的复杂性,加上它,我们可以放弃多使用一个引脚]

  5. 维诺德

    1.#定义DPDDR DDRB
    2.空白液晶(char ch)
    {DPORT = ch;//给端口赋值
    CPORT = (1 < _delay_us (10);
    CPORT = (1 < _delay_us (45);

    3.液晶(' 0 ' + i % 10);
    先生告诉我这是什么意思

    • 拉克什

      在一个查询中有太多的问题。
      让我先回答第一件事。符号DDRB是在avr gcc库中预定义的。正如您所看到的,我们使用了头文件的组合来保持主C程序的简短。如果我们打算重用代码,但如果在电路中我们必须改变端口[这实际上发生了,我对ATmega16和32使用了相同的代码],我们将不得不在头文件中做出改变。这将减少代码重用。所以我们决定在代码中定义另一个符号。

    • 拉克什

      让我来回答第二个问题。
      首先,我想告诉你,由于一些问题与文字出版社编辑,我不能呈现程序的符号符号。这是非常必要的,但我失败了。它过去(现在仍然)不是精确的符号代码。你提到的函数是这样的:

      空白液晶(char ch) {
      DPORT = ch;
      CPORT | = (1 < < EN);
      _delay_us (10);
      CPORT& = ! (1 < < EN);
      _delay_us (45);}

      我们使用DPORT作为数据端口,CPORT作为控制端口。EN代表ENable。其目的是使数据在数据总线中可用,并脉冲EN引脚一次。它将在LCD屏幕上一次写一个字符。延迟用于为LCD提供足够的时间来准备接收字符并将字符写入LCD。

    • 拉克什

      回答3号。
      代码的这一部分是函数的一部分,该函数将无符号整数变量打印到LCD显示屏上。
      现在的问题是。我为什么需要那个角色?
      简单地说,在我们如何用符号表示数字[例如1241 214 9432 428等]和如何在寄存器中存储数字之间是有区别的
      [例如:0b0000010011011001 0b0000000011010110 0b0010010011011000 0b0000000110101100等]
      所以我们要把变量的值转换成符号。
      现在,我们首先转换变量LSB。我们将它除以10(我们用小数表示数字),并使用提醒符计算提醒符的ASCII字符。简单。

  6. 拉克什

    @ Ramit Debnath
    我们在字符编码上有一些问题!该网站使用UNICODE字符集,而c代码通常以ASCII格式编写。您还可以通过在“菜单栏>项目>配置选项>General”中提供CPU工作频率并提供工作频率来避免F_CPU错误。或者你可以这样陈述

    / /——
    #定义F_CPU 1000000
    # include
    ..........
    / /——

    如果你在使用延时循环。不能将变量作为参数提供给_delay_ms()或_delay_us()函数。这会产生一个错误。提供的值必须是常量并且必须是整型。

  7. Ramit Debnath

    解决了以下问题但现在它显示的构建错误和一些延迟特性应该是整数

  8. Ramit Debnath

    没有隐藏字符,但仍然显示错误\ 240。

    如何解决?

  9. Ramit Debnath

    Avr studio 5.1说明了这一点
    F_CPU没有定义

    并且有很多的杂散错误,如

    错误2在程序中偏离' \240 '

    这些错误是什么意思?如何解决这些问题?
    请尽快回复。

    • 拉克什保泰松

      只需在下面加上这一行:

      #定义F_CPU 1000000

Baidu