AVR单片机驱动的LCD2004的源程序

发布者:爱笑的猫咪最新更新时间:2016-09-18 来源: eefocus关键字:AVR  单片机驱动  LCD2004 手机看文章 扫描二维码
随时随地手机看文章
/*=======================================================

20x4字符液晶主程序,编译软件(ICCAVR_6.31)

CPU内部晶振8M

数据线B0~B7接PORTB, E=D7 RW=D6 RS=D5

=========================================================

接线图如下:

_______________           ______________

               |      --1|GND           |

               |      --2|+5V           |

               |      --3|V0            |

               |         |              |

            PD5|--------4|RS            |

            PD6|--------5|RW            |

            PD7|--------6|E             |

 CPU           |         |              |

 ATmmega16L PB0|--------7|D0  LCD20x4   |

            PB1|--------8|D1            |

            PB2|--------9|D2            |

PB3|-------10|D3            |

            PB4|-------11|D4            |

            PB5|-------12|D5            |

            PB6|-------13|D6            |

            PB7|-------14|D7            |

               |         |              |

               |     --15|+LED          |

               |     --16|-LED          |

_______________|         |______________|

========================================================*/

#i nclude //CPU_ATmmega16L

#define RS_H    asm("sbi 0x12,5")  //RS设为高电平

#define RS_L    asm("cbi 0x12,5")  //RS设为低电平

#define RW_H    asm("sbi 0x12,6")  //RW设为高电平

#define RW_L    asm("cbi 0x12,6")  //RW设为低电平

#define E_H     asm("sbi 0x12,7")  //E设为高电平

#define E_L     asm("cbi 0x12,7")  //E设为低电平

//=======================================================

//微秒级延时程序

void delay_us(int time)

{

    do

    {

        time--;

    } 

    while (time > 1);

}

//=======================================================

//毫秒级延时程序

void delay_ms(unsigned int time)

{

    while(time != 0)

    {  

        delay_us(1000);

        time--;

    }

}

//=======================================================

//读取lcd是否内部操作(忙碌)状态

char Lcd_Busy()

{

    char r;

    DDRB = 0x00;       //端口B设为输入方式

    E_L;RS_L;RW_H;     //E=0(致能),RS=0(命令),RW=1(读)

    delay_us(2);       //液晶延时子程序

    E_H;

    delay_us(2);       //液晶延时子程序

    r = PINB & 0x80;   //读取lcd_data第八位

    E_L;

    DDRB=0xff;         //端口B设为输出方式

    return r;          //读取结果返回

}

//=======================================================

//向Lcd发送命令程序

void Lcd_Command(unsigned char Command)

{

    while(Lcd_Busy()); //判断lcd是否内部操作状态

    E_L;RS_L;RW_L;     //E=0(致能),RS=0(命令),RW=0(写)

    delay_us(2);       //液晶延时子程序

    E_H;

    PORTB = Command;   //向Lcd发送命令

    delay_us(2);       //液晶延时子程序

    E_L;

}

//=======================================================

//向lcd写入一个字符程序

void Lcd_Write(unsigned char Data)

{

    while(Lcd_Busy()); //判断lcd是否内部操作状态

    E_L;RS_H;RW_L;     //E=0(致能),RS=1(数据),RW=0(写)

    delay_us(2);       //液晶延时子程序

    E_H;

    PORTB = Data;      //向lcd写入一个字符

    delay_us(2);       //液晶延时子程序

    E_L;

}

 

/*=======================================================

LCD第1行显示地址1~20(0x80~0x93)

LCD第2行显示地址1~20(0xc0~0xd3)

LCD第3行显示地址1~20(0x94~0xa7)

LCD第4行显示地址1~20(0xd4~0xe7)

=======================================================*/

//初始化LCD_8位接口,4行x20字符的工作方式

void Lcd_Init()

{

    DDRB = 0xff;       //端口B设为输出方式

    DDRD = 0xff;       //端口D设为输出方式

    Lcd_Command(0x38); //

    Lcd_Command(0x38); //

    Lcd_Command(0x38); //

    Lcd_Command(0x38); //

    Lcd_Command(0x08); //令显示器off

    Lcd_Command(0x01); //清除显示器

    Lcd_Command(0x06); //令LCD每接收到1Byte数据后,AC自动加1

    Lcd_Command(0x0C); //令光标,0x0c=不显示,0x0d=显示闪动.

}

//=======================================================

//写ASCII字符串程序

void asc_tran(unsigned char *asc)

{

    while((*asc) != 0)   //判断字是否结束

    {

        Lcd_Write(*asc); //向lcd写入字符串

        asc++;           //移下一个字符

    }

}

//=======================================================

//测试主LCD主程序

void main()

{

    Lcd_Init(); //初始化LCD

    while(1)

    {

        Lcd_Command(0x83);               //设置显示位址

        asc_tran("-----@_@------");      //显示字符串

        Lcd_Command(0x97);               //设置显示位址

        asc_tran("www.ouravr.com");      //显示字符串

        delay_ms(1000);                  //延迟1秒

        Lcd_Command(0x01);               //清除显示器

        Lcd_Command(0x83);               //设置显示位址

        asc_tran("-----^_^------");      //显示字符串

        Lcd_Command(0x94);               //设置显示位址

        asc_tran("http://59.36.96.196"); //显示字符串

        delay_ms(1000);                  //延迟

        Lcd_Command(0x01);               //清除显示器

    }

}

关键字:AVR  单片机驱动  LCD2004 引用地址:AVR单片机驱动的LCD2004的源程序

上一篇:AVR单片机ADC转换程序
下一篇:AVR微控制器蓄电池充放电控制器的设计

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

单片机驱动DS1302时间DS18B20温度12864液晶显示完整程序设计
程序说明:这是一个用51单片机驱动DS1302时间模块+DS18B20温度传感器模块+12864液晶显示完整程序设计实例,有四个键盘KEY0 到KEY3,key0是修改时间的 首先是秒到分到时到年到月到日到星期 key1是加1 key2是减一 在修改时间状态再按一下key3的时候就出去并修改时间日期,在平时状态按着key3再按着key2 就会打开lcd 的灯 单单是只按key3那就是把灯关了。 文件一:DS1302驱动.c #include reg52.h //ds1302 sbit sclk=P0^3; sbit io=P0^4; sbit rst=P0^5; sbit acc0=ACC^0; sbit acc1=ACC^
[单片机]
微控制器 PWM 如何输出更高效地驱动负载
  大多数微控制器至少有一个脉冲宽度调制 (PWM) 外设,以方波形式生成多个波形。这些 PWM 输出可用于驱动同步负载,例如机械系统中的步进电机和电源转换器的功率 MOSFET。对于这些负载,要使目标负载正常工作,PWM 波形必须精确同步,这一点非常重要。   如果 PWM 外设未经过仔细编程,它可能偶尔会在波形之间产生相位延迟,从而导致在波形边沿未正确对齐时失去同步。这些相位延迟将会降低负载的驱动效率,从而浪费功率并可能产生过多的热量。对于常见的 PWM 外设,可以启用或禁用某个 PWM,但同时会导致其他 PWM 输出发生相位延迟。   这对于小规格电池供电型物联网 (IoT) 应用而言尤其是个问题。在此类应用中,单个
[嵌入式]
<font color='red'>微控制器</font> PWM 如何输出更高效地<font color='red'>驱动</font>负载
使用单片机STM8S 驱动 CT1642
/*定义LED 数码管的位数,本驱动只实现3位和4位的操作,所以LED_BIT_COUNT的值只能是3或4*/ #define LED_BIT_COUNT 4 /****************************************************************************************************** ***************** * 按键值定义 *********************************************************
[单片机]
太阳能工程热水器控制器的设计与实现
简介:设计了一套全自动太阳能工程热水器控制器。该系统利用低功耗高性能的RISC 单片机AVR 作为控制电路的核心实时监测水温及水位, 可实现温度、水位检测管理, 故障及相关报警提示等功能, 利用E2 PROM 对设置的参数保存, 具有断电记忆功能, 断电后, 参数无须重新设置。该款全自动太阳能热水器控制器具有使用方便、稳定性高、节能等特点, 实用性高。 0 引 言 随着人们生活水平的提高, 各种热水器的使用已相当普及, 与之相配套的控制仪也相继问世。然而, 目前市场上的各种热水器控制电路还与理想要求相差甚远。消费者需要真正的全自动 控制, 以实现使用的最简单化, 就像家用电视机、电冰箱一样, 接通电源、设定完毕就不用再操心
[单片机]
太阳能工程热水器控制器的设计与实现
基于AVR和激光测距仪实现轮胎内径测量
轮胎模具用于成型轮胎,其加工质量对轮胎的生产非常重要。为了生产出好的轮胎,必须对轮胎模具加工质量提出高的要求。传统的加工质量检测法主要是靠百分表,人为采集数据后分析得出加工质量报告。这种办法的局限性是需要操作者有一定的工作经验,而且取样过程人为控制,精度受到一定影响。近几年来,轮胎模具工业随着轮胎的大量需求而得到了快速发展,传统的检测方法不能满足市场需求。光栅尺是一种数字位移测量设备,测量范围可达几十米,测量精确在微米级;激光测距仪是一种非接触测量设备,可以对不规则表面的目标位移进行测量,但是测量距离较小。将大范同的光栅尺和非接触测量的激光测距仪结合起来就可以实现对不规则面的目标距离进行测量。将光栅尺读头与激光测距仪固定在机械横梁
[单片机]
基于<font color='red'>AVR</font>和激光测距仪实现轮胎内径测量
AVR单片机与串行时钟器件DS3231的接口设计
1 引言 由单片机构成的测控系统或智能显示屏经常需要用到实时日历或时钟信号。为节省CPU资源,本文介绍了串行时钟器件DS3231的应用及其与AVR单片机ATmega8的接口,该系统具有抗干扰能力强,计时准确且不随季节变化产生误差的特点。 2 DS3231的结构及工作原理 DS3231是低成本、高精度I2C实时时钟(RTC)器件,具有集成的温度补偿晶体振荡器(TCXO)。该器件包含电池输入端,断开主电源时仍可保持精确计时。集成的晶体振荡器可提高器件的长期精确度。DS3231的寄存器能保存秒、分、时、星期、日期、月、年和闹钟设置等信息。少于31天的月份,可自动调整月末日期,包括闰年补偿。时钟的工作格式为24小时或带AM/PM指示
[单片机]
AVR AD转换的C语言编程
#include io8535v.h #define uchar unsigned char #define uint unsigned int uchar Table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar Da ta ={0,0,0,0}; void DelayMs(uint i) //0.25ms {uchar j; for(;i!=0;i--) {for(j=250;j!=0;j--) {;}} } void Display(uchar *p) //间隔5ms显示 {uchar i,sel=0x01; for(i=0;i 4;i++)
[单片机]
基于AVR单片机的高精度频率调节器
1?引言? 在现代化工业生产与高精度测试中,我们需要相当精确的频率来帮助判断设备性能指标。而且我们希望能够微调该频率。采用压控振荡器得到的频率不够精确,微调频率步骤烦琐,耗时漫长,因此有些测试项目限制了压控振荡器的使用。 Mega系列单片机是Atmel公司于2002年起陆续推出的。这款AVR增强型单片机具有速度快,抗干扰能力强,价格低廉等诸多优点。为了加快AVR单片机的软件编制,Atmel以及第三方提供的开发工具多种多样,程序开发方便有效。该单片机内部FLASH结构功能灵活,加锁后很难解密,可以最大限度地保护知识产权。AVR单片机可以广泛应用于通信、野外测试、汽车电子、医疗器械等领域,并且适用于各种低电压、低功耗的场合。? 本文
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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