AVR单片机驱动LCD1602

发布者:SparklingMoon最新更新时间:2018-06-21 来源: eefocus关键字:AVR单片机  驱动LCD1602 手机看文章 扫描二维码
随时随地手机看文章

这几天一直在学习AVR单片机的使用,也移植了几个以前在51单片机上用到的一些函数库,今天在调试LCD1602,把经验分享给大家


在进行读写操作的时候,如果使用了较高的晶振频率,那么在操作时序的时候要适当延时,一般一个空指令就可以了。


在读忙操作的时候要把数据口设置为输入,并开启内部上拉。


下面是实现的代码:

#include  

  

#define LCD1602_DB  PORTA   //PA  

#define LCD1602_RS (1<<7) //PC7  

#define LCD1602_RW (1<<6) //PC6  

#define LCD1602_EN (1<<5) //PC5  

  

#define SET_RS() (PORTC|=LCD1602_RS)  

#define CLR_RS() (PORTC&=~LCD1602_RS)  

  

#define SET_RW() (PORTC|=LCD1602_RW)  

#define CLR_RW() (PORTC&=~LCD1602_RW)  

  

#define SET_EN() (PORTC|=LCD1602_EN)  

#define CLR_EN() (PORTC&=~LCD1602_EN)  

  

/* 等待液晶准备好 */  

void LcdWaitReady()  

{  

    unsigned char sta;  

    DDRA = 0x00;  

    PORTA = 0xFF;  

    LCD1602_DB = 0xFF;  

    CLR_RS();  

    asm("nop");  

    SET_RW();  

    asm("nop");  

    do {  

        SET_EN();  

        asm("nop");  

        sta = PINA; //读取状态字  

        CLR_EN();  

        asm("nop");  

    } while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止  

    DDRA=0xFF;  

    asm("nop");  

}  

  

/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */  

void LcdWriteCmd(unsigned char cmd)  

{  

    LcdWaitReady();  

    CLR_RS();  

    asm("nop");  

    CLR_RW();  

    asm("nop");  

    LCD1602_DB = cmd;  

    asm("nop");  

    SET_EN();  

    asm("nop");  

    CLR_EN();  

    asm("nop");  

}  

/* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */  

void LcdWriteDat(unsigned char dat)  

{  

    LcdWaitReady();  

    SET_RS();  

    asm("nop");  

    CLR_RW();  

    asm("nop");  

    LCD1602_DB = dat;  

    asm("nop");  

    SET_EN();  

    asm("nop");  

    CLR_EN();  

    asm("nop");  

}  

/* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */  

void LcdSetCursor(unsigned char x, unsigned char y)  

{  

    unsigned char addr;  

      

    if (y == 0)  //由输入的屏幕坐标计算显示RAM的地址  

        addr = 0x00 + x;  //第一行字符地址从0x00起始  

    else  

        addr = 0x40 + x;  //第二行字符地址从0x40起始  

    LcdWriteCmd(addr | 0x80);  //设置RAM地址  

}  

/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */  

void LcdShowStr(unsigned char x, unsigned char y, unsigned charchar *str)  

{  

    LcdSetCursor(x, y);   //设置起始地址  

    while (*str != '\0')  //连续写入字符串数据,直到检测到结束符  

    {  

        LcdWriteDat(*str++);  

    }  

}  

/* 打开光标的闪烁效果 */  

void LcdOpenCursor()  

{  

    LcdWriteCmd(0x0F);  

}  

/* 关闭光标显示 */  

void LcdCloseCursor()  

{  

    LcdWriteCmd(0x0C);  

}  

/* 初始化1602液晶 */  

void InitLcd1602()  

{  

    DDRA = 0xFF;  

    DDRC = 0xE0;  

    LcdWriteCmd(0x38);  //16*2显示,5*7点阵,8位数据接口  

    LcdWriteCmd(0x38);  //16*2显示,5*7点阵,8位数据接口  

    LcdWriteCmd(0x0C);  //显示器开,光标关闭  

    LcdWriteCmd(0x06);  //文字不动,地址自动+1  

    LcdWriteCmd(0x01);  //清屏  


关键字:AVR单片机  驱动LCD1602 引用地址:AVR单片机驱动LCD1602

上一篇:基于ATmega16单片机 NRF24L01无线收发驱动程序源代码
下一篇:AVR单片机软件按钮消抖与确认

推荐阅读最新更新时间:2024-03-16 16:06

AVR单片机PCF8591AD-DA实验
未加入 滤波 函数所以数值有点晃动 //PCF8591 AVR单片机程序 默认为输入模式下通道0开始通道0 光敏电阻 ,通道1, 热敏电阻 ,通道2 电位器 ,通道3外接电位器,如有标点符号丢失格式错乱的情况可从这里下载 源码 : http://www.51hei.com/f/avr8591.rar #include iom16.h #include intrinsics.h #define uchar unsigned char #define uint unsigned int #define k1 PIND_Bit4 //模拟量输出值按键 #define k2 PIND_Bit5 //模
[单片机]
<font color='red'>AVR单片机</font>PCF8591AD-DA实验
AVR单片机—(三)、ATMEGA16驱动16*2点阵字符液晶模块—01
三、ATMEGA16驱动16*2点阵字符液晶 三—(01)、ATMEGA16驱动16*2点阵字符液晶 这篇文章只是简单的驱动并让1602显示,并没有用到读数据和读状态的部分,也没有用到读写检测(要是感兴趣的话还是写写这里吧) 1、那就是用什么样的液晶,又该怎么驱动,现在把datasheet的部分图片贴出来,看看,so easy~~的 1)就是它的引脚说明(个人感觉要想具体了解还是在网上搜搜吧~~我这里也就是简单了解~) 这里也就三个引脚需要注意就是RS、R/W、E,这三个引脚,传输数据的必用引脚,别的就不用详细介绍了吧~~(后面的程序就是根据这三个引脚的时序图来写的! 2)(说实话,我真的不太想详细说,因为好多人对于驱动
[单片机]
<font color='red'>AVR单片机</font>—(三)、ATMEGA16<font color='red'>驱动</font>16*2点阵字符液晶模块—01
AVR单片机教程——矩阵键盘
开发板上有4个按键,我们可以把每一个按键连接到一个单片机引脚上,来实现按键状态的检测。但是常见的键盘有104键,是每一个键分别连接到一个引脚上的吗?我没有考证过,但我们确实有节省引脚的方法。 矩阵键盘 这是一个4*4的矩阵键盘,共有16个按键只需要8个引脚就可以驱动。我们先来看看它的原理。 每个按键有两个引脚,当按键按下时接通。每一行的一个引脚接在一起,分别连接到左边4个端口,称为“行引脚”;每一列的另一个引脚接在一起,分别连接到右边的4个端口,称为“列引脚”。这就是矩阵键盘内部的电路连接方式。 那么如何驱动它呢?首先我们简化一下,只考虑第一排: 这样就很简单了吧,只要让行引脚保持低电平,4个列引脚设置为输入并开启
[单片机]
<font color='red'>AVR单片机</font>教程——矩阵键盘
AVR单片机学习总结
1. 引脚:0入1出 设置状态 输出状态IO寄存器设置 DDR×某一位 置1,相应位IO被设为输出; PORT×某一位 置1/0,相应位电平为高/低。 输入状态IO寄存器设置 DDR×某一位 置0,相应位的IO口被设为输入; PORT×某一位 置1,使能对应IO口相应位的上拉电阻 ; PIN×的对应位是输入的数据,0或1。 E.G.输出设置 DDRB=0xff; DDRB=0x10; //第五位设为输出 PORTB|=0x10; //第五位输出高电平 PORTB&=~0x10; //第五位输出低电平 PORTB^
[单片机]
怎样制作AVR单片机ISP下载线
下面介绍利用Protel99se电路绘图软件和热转印技术制作这种下载线的方法和步骤。 一、设计ISP下载线 PCB文件利用Protel99se绘带0《自带AVR单片机ISP下载线》一文中的原理图1(为方便制作,可省略该图中的VDl)。并将图中各元件按附表所述进行封装选择。 原理图绘制完毕后,依次点击原理图编辑器中的Tools(工具)/Up-date PCB(更新原理图)菜单,自动生成下载线PCB文件。在编辑下载线PCB文件时,可先按图1所示规划PCB板的大小和布局PCB板上的元件,然后让系统自动布线(为减小PCB尺寸,采用双面布线),最后对自动布线作适当调整,经过手动调整布线后的PCB板如图2所示。 二、分图层打印 P
[单片机]
怎样制作<font color='red'>AVR单片机</font>ISP下载线
AVR单片机教程——烧写HEX文件
每一次build项目,编译器都会生成多个文件,其中有一个就是hex文件。之前在IDE中配置的external tools,就是把这个hex文件烧写到单片机中去的。 然而,有些时候你想运行别人的程序,但拿不到别人的源码,只能拿到一个hex文件。比如,我现在就把明天作业的答案(没错,明天有作业)以hex文件的形式(平台不让上传hex文件,所以我就打了个包,使用前请先解压)给你,让你抢先体验一下。这时,你就需要用AVRDUDESS来烧写hex文件。 初次打开AVRDUDESS,界面上所有选项都是默认的。 在左上角下拉框中选择USBasp(在最后的位置)。 点击右上角Detect,会自动选择好单片机型号。 在Flash
[单片机]
<font color='red'>AVR单片机</font>教程——烧写HEX文件
AVR单片机通用I/O设计注意事项
简介:AVR单片机通用I/O设计注意事项 一、数据寄存器PORTx和数据方向寄存器DDRx为读/写寄存器,而端口输入引脚PINx为只读寄存器。但是需要注意的是,对PINx寄存器某一位写入逻辑“1”将造成数据寄存器相应位的数据发生“0”与“1”的交替变化。 当寄存器MCUCR的上拉电阻禁止位PUD置位时所有端口引脚的上拉电阻都被禁止。不论如何配置DDxn,都可以通过读取PINxn寄存器来获得引脚电平。PINxn寄存器的各个位与前面的锁存器组成了一个同步器。这样就可以避免在内部时钟状态发生改变的短时间范围内由于引脚电平变化而造成的信号不稳定。其缺点是引入了延迟。 二、AVR I/O具备多种I/O模式: 1.高阻态,多用
[单片机]
基于AVR单片机的中频电源测试系统
1引言   电参数的测量和监控是电力系统的重要组成部分,本文从测试系统的工程学实际出发,完成了对中频电源系统的电压、电流、频率、功率因数、有功功率等参数的测量和实时监控,较好的实现了中频电源测试系统的功能和工程要求。   AVR单片机相对传统的 51系列单片机,具有更高的集成度和更强的功能,与 C语言有很好的兼容性,RISC指令架构使其运行速度可达 1MIPS/MHZ。随着其越来越广泛的应用,必将取代 51系列成为单片机的主流。其主要功能包括看门狗、FLASH程序存储器、 E2PROM、 A/D转换器、定时器、计数器、USART接口等多种功能,这使得本测试系统的硬件实现变得简单,可靠。   2硬件结构设计与实现   
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved