0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何将16x2 LCD与Atmega16 AVR连接并显示简单的欢迎消息

科技观察员 来源:circuitdigest 作者:Abhimanyu Pandit 2022-11-11 17:29 次阅读

显示器是任何机器的必要部分,无论是任何家用电器还是工业机器。显示屏不仅显示操作机器的控制选项,还显示该机器执行的任务的状态和输出。电子产品中使用的显示器类型很多,如 7 段显示器、16x2 LCD 显示器、TFT 触摸屏显示器、OLED 显示器等。

16x2 LCD显示器是最基本的显示模块,也用于一些小型电子设备,如计算器,数字仪表等。

在本教程中,我们将了解如何将16x2 LCD 与 Atmega16 AVR 微控制器连接并显示简单的欢迎消息。

所需组件

阿特梅加16

16x2液晶模块

运动员

面包板

poYBAGNuFgCAPtxzAAApmrSZMRU395.png

电路图

poYBAGNuFgKAMsfuAABRYjVSthU814.png

poYBAGNuFgeAFMPNAAE4hBZh9uI552.jpg

用于 16x2 LCD 显示器的 Atmega16 编程

编程不需要任何外部库。在这里,

Atmega16使用USBASP和Atmel Studio7.0进行编程

。项目结束时会给出

完整的程序和工作视频

,只需在 Atmega16 中上传程序并旋转 10k POT 即可调整 LCD 的亮度。

首先定义 CPU 频率,并包含 Atmel Studio 软件包附带的必要库,例如用于访问 IO 引脚的 和用于在程序中生成延迟的 。

#include

#include

在程序中定义LCD的RS和EN引脚。RS 引脚用于选择数据和命令寄存器。使能引脚锁存数据。

#define en PA3

#define rs PA2

还要定义Atmega16的哪个端口将用于连接LCD。这里,使用了PORTA。

#define lcdDirection DDRA

#define lcdPort PORTA

下一步是构造一个函数,该函数将通过传递参数来接受命令。有许多液晶屏十六进制命令。十六进制命令用于定义LCD的功能。由于我们使用LCD的4位模式,因此字节(8位)将以两个数据包发送。一个数据包将是上半字节(4位),另一个数据包将是下半字节(4位)。

void lcdCommand( unsigned char commands )

{

lcdPort = (lcdPort & 0x0F) | (commands & 0xF0);

lcdPort &= ~ (1<

lcdPort |= (1<

_delay_us(1);

lcdPort &= ~ (1<

_delay_us(200);

lcdPort = (lcdPort & 0x0F) | (commands << 4);

lcdPort |= (1<

_delay_us(1);

lcdPort &= ~ (1<

_delay_ms(2);

}

下一步是接受字符并将其锁定到LCD端口。接收到的字符然后通过半字节发送到液晶屏半字节。该函数使用传递参数获取字符,然后获取上下半字节。对于数据寄存器,“rs”引脚设置为高电平,然后发送一个上升脉冲以锁存数据。类似地,通过更改使能值并发送使能的上升脉冲来发送较低的半字节。

void lcdChar( unsigned char string )

{

lcdPort = (lcdPort & 0x0F) | (string & 0xF0);

lcdPort |= (1<

lcdPort|= (1<

_delay_us(1);

lcdPort &= ~ (1<

_delay_us(200);

lcdPort = (lcdPort & 0x0F) | (string << 4);   

lcdPort |= (1<

_delay_us(1);

lcdPort &= ~ (1<

_delay_ms(2);

}

此函数只是将字符转换为字符串,以后可以在需要写入字符串的程序中使用。

void lcdString (char *str)

{

int j;

for(j=0;str[j]!=0;j++)

{

lcdChar (str[j]);

}

}

现在编写一个函数只是为了清除屏幕。您只需要在十六进制中发送命令 01,然后将光标设置为初始位置即可。

void lcdClear()

{

lcdCommand (0x01);

_delay_ms(2);

lcdCommand (0x80);

}

现在在主功能中,LCD已初始化。最初将液晶屏的端口方向设置为接口。在这里,端口设置为输出,因此设置 FF。

lcdDirection = 0xFF;

_delay_ms(20)

然后通过以十六进制发送 02 将 LCD 设置为 4 位模式。同时以十六进制发送 28,以将其设置为 4 位模式下的 2 行 15x7 矩阵像素。

lcdCommand(0x02);

lcdCommand(0x28);

命令 0c 和 06 用于控制光标位置。最后只需通过发送十六进制 01 来清除屏幕。这将完成LCD的初始化。

lcdCommand(0x0c);

lcdCommand(0x06);

lcdCommand(0x01);

初始化完成后,只需发送字符串来测试液晶屏。在这里,我们在 1 中发送一个字符串“接口 LCD”圣排。

lcdString("Interfacing LCD");

然后通过发送十六进制命令 c0 将光标移动到下一行。最后在这个位置上,写下字符串“With Atmega16”。

lcdCommand(0xC0);

lcdString("With Atmega16");

pYYBAGNuFgmAFENKAACLRmO1FOo452.jpg

关于将16x2 LCD与Atmega16接口的完整教程到此结束。请注意,如果您没有得到任何图像或像素,请根据代码和电路图检查接线,或者更改连接到LCDV0引脚的POT的值。

/*

LCD16x2 4 bit ATmega16 interface

CircuitDigest(www.circuitdigest.com)

*/



#define F_CPU 16000000UL // Define CPU Frequency here it 16MHz

#include // Include AVR std. library file

#include // Include Delay header file



#define en PA3 // Define Enable pin

#define rs PA2 // Define Register Select pin

#define lcdDirection DDRA // Define LCD data direction port

#define lcdPort PORTA //Define LCD data port







void lcdCommand( unsigned char commands ) // commands will be sent from this function

{

lcdPort = (lcdPort & 0x0F) | (commands & 0xF0); // send upper nibble of 8 bit

lcdPort &= ~ (1<
lcdPort |= (1<
_delay_us(1);

lcdPort &= ~ (1<


_delay_us(200);



lcdPort = (lcdPort & 0x0F) | (commands << 4); // sending lower nibble of 8 bit i.e 1byte

lcdPort |= (1<
_delay_us(1);

lcdPort &= ~ (1<
_delay_ms(2);

}



void lcdChar( unsigned char string )

{

lcdPort = (lcdPort & 0x0F) | (string & 0xF0); // send upper nibble

lcdPort |= (1<
lcdPort|= (1<
_delay_us(1);

lcdPort &= ~ (1<


_delay_us(200);



lcdPort = (lcdPort & 0x0F) | (string << 4); //send lower nibble 

lcdPort |= (1<
_delay_us(1);

lcdPort &= ~ (1<
_delay_ms(2);

}





void lcdString (char *str) // convert char to string fucntion

{

int j;

for(j=0;str[j]!=0;j++)

{

lcdChar (str[j]);

}

}



void lcdClear()

{

lcdCommand (0x01); // send hex 01 to Clear display

_delay_ms(2);

lcdCommand (0x80); // send hex 80 to Cursor at home position

}



int main()

{

// start Initializing 16x2 LCD

lcdDirection = 0xFF; // set LCD port direction in output

_delay_ms(20); // keep LCD Power ON delay >15ms always



lcdCommand(0x02); // send for 4 bit initialization of LCD

lcdCommand(0x28); // 2 line, 5*7 matrix in 4-bit mode

lcdCommand(0x0c); // Display on cursor off

lcdCommand(0x06); // take curson to next position (shift cursor to right)

lcdCommand(0x01); // Clear display screen

_delay_ms(2); //little delay



lcdString("Interfacing LCD"); // Write string on 1st row of 16x2 LCD

lcdCommand(0xC0); // move to 2nd row

lcdString("With Atmega16"); // write string on second line

}


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6786

    浏览量

    147562
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4272

    浏览量

    163902
  • ATmega16
    +关注

    关注

    5

    文章

    154

    浏览量

    45556
收藏 人收藏

    评论

    相关推荐

    16x2 LCD与ARM7-LPC2148连接显示文字

    在本教程中,我们将了解如何将 16x2 LCD 与 ARM7-LPC2148 微控制器连接,并显示简单
    的头像 发表于 10-28 17:12 1491次阅读
    将<b class='flag-5'>16x2</b> <b class='flag-5'>LCD</b>与ARM7-LPC2148<b class='flag-5'>连接</b>并<b class='flag-5'>显示</b>文字

    如何将GSM模与ATmega16连接实现发送和接收消息

    在本教程中,我们将学习如何将GSM模块(SIM900A)与AVR微控制器ATmega16连接,并通过使用GSM模块发送和接收消息来演示它。
    的头像 发表于 11-10 15:57 1861次阅读
    <b class='flag-5'>如何将</b>GSM模与<b class='flag-5'>ATmega16</b><b class='flag-5'>连接</b>实现发送和接收消息

    如何将DHT11与树莓派连接16x2 LCD屏幕上显示温度和湿度的值

    在本教程中,我们将学习如何将流行的DHT11传感器与Raspberry Pi连接,并在16x2 LCD屏幕上显示温度和湿度的值。
    的头像 发表于 11-14 16:53 3228次阅读
    <b class='flag-5'>如何将</b>DHT11与树莓派<b class='flag-5'>连接</b>在<b class='flag-5'>16x2</b> <b class='flag-5'>LCD</b>屏幕上<b class='flag-5'>显示</b>温度和湿度的值

    用到ATMEGA16型号的AVR单片机代码

    用到ATMEGA16型号的AVR单片机代码#includevoid delay(void){int x=0;while(x
    发表于 11-23 06:42

    Atmega16 AVR单片机

    Atmega16 AVR 单片机 proteus 仿真 计算器
    发表于 11-23 06:23

    ATMega16 AVR开发板的资料分享

    。LED显示屏LED显示屏为六位多路显示。数字为共阴极型,绿色,尺寸为 0.4"。PORTB 显示段,而 PORTC 控制数字。液晶显示
    发表于 08-02 07:50

    串行显示LCD 16x2监视器

    描述串行显示 LCD 16x2 监视器这是一个小项目,我需要能够通过串行将简单文本显示到便宜的 LCD
    发表于 08-19 06:16

    基于ATmega16的简易示波器设计

    介绍了以AVR单片机ATmega16为核心,采用前端信号调理电路、程控增益放大器以及波形显示LCD(GDM12864A)实现的一个简易示波器。并给出该系统设计的硬件和软件设计方案。
    发表于 12-25 16:12 275次下载

    ATmega16驱动的LCD2004的源程序(avr)

    ATmega16驱动的LCD2004的源程序(avr) /*==============================================20x4字符液晶主程序,编译软件
    发表于 04-02 19:03 1732次阅读

    Atmega16最小系统原理图

    基于ATMEGA16AVR单片机最小系统 PDF版
    发表于 11-30 18:14 10次下载

    AVR atmega16各功能程序

    AVR单片机中atmega16各功能程序,大家可以借鉴,都是自己积累的 希望可以帮助到大家
    发表于 07-29 15:32 17次下载

    ATmega16教程(AVR单片机概述)

    ATmega16教程2
    的头像 发表于 07-10 04:16 1.4w次阅读

    连接一个16x2字符LCD

    电子发烧友网站提供《连接一个16x2字符LCD.zip》资料免费下载
    发表于 11-17 09:31 0次下载
    <b class='flag-5'>连接</b>一个<b class='flag-5'>16x2</b>字符<b class='flag-5'>LCD</b>

    如何将16x2 LCD与Raspberry pi4连接

    电子发烧友网站提供《如何将16x2 LCD与Raspberry pi4连接.zip》资料免费下载
    发表于 06-19 11:45 0次下载
    <b class='flag-5'>如何将</b><b class='flag-5'>16x2</b> <b class='flag-5'>LCD</b>与Raspberry pi4<b class='flag-5'>连接</b>

    如何连接16x2 LCD显示

    电子发烧友网站提供《如何连接16x2 LCD显示器.zip》资料免费下载
    发表于 07-12 09:21 0次下载
    如何<b class='flag-5'>连接</b><b class='flag-5'>16x2</b> <b class='flag-5'>LCD</b><b class='flag-5'>显示</b>器