ATMEGA16 驱动1602 LCD程序

发布者:Mengyun最新更新时间:2017-12-17 来源: eefocus关键字:ATMEGA16  驱动1602  LCD程序 手机看文章 扫描二维码
随时随地手机看文章

下面表格是16*2 LCD液晶与 单片机 的硬件接法:


1

VSS

接地

2

VCC

电源,+5V

3

VO

反视度调整,接地吧

4

RS

寄存器选择,1-资料、0-指令

5

R/W

读写选择,1-读、0-写,如果LCD函数没有用到这个IO口的话就把它接地

6

E

信号使能,E由 1 -> 0 的下降沿时,LCD对RS和DATA进行取样和执行操作

7

DATA-DB0

悬空

8

DATA-DB1

悬空

9

DATA-DB2

悬空

10

DATA-DB3

悬空

11

DATA-DB4

接 单片机 IO口

12

DATA-DB5

接 单片机 IO口

13

DATA-DB6

接 单片机 IO口

14

DATA-DB7

接 单片机 IO口


// 04:lcd_init()            //LCD初始化函数 
// 05:lcd_DICtate(byte)     //写指令的函数 
// 07:lcd_gotoxy(x,y)       //列行定位函数 
// 06:lcd_putchar(byte)     //以ASCII方式显示一个字节变量 
// 08:lcd_hex(byte)         //以十六进制显示一个字节变量 
// 09:lcd_byte(byte)        //以十进制显示一个字节变量 
// 10:lcd_putsf(地址, 个数) //显示FLASH里面的字符串

#include  
#include  
#include <1602lcd.h> 
unsigned char byte;   
unsigned char flash string[]="M8V20"; 
void main(void) 
{   
   
  lcd_init();                         //1602LCD初始化函数  
  lcd_dICtate(1);                     //LCD清屏指令是(1) 
  while (1) 
        {   
          byte++; 
          lcd_gotoxy(4,0);             //光标定位到第4列第0行          
          lcd_byte(byte);              //以十进制的方式显示键值(字节形)  
          lcd_putchar('=');            //显示 = 字符 
          lcd_putchar(48);             //显示数字0 ,数字0的ASCII值是48 
          lcd_putchar('x');            //显示 x 字符 
          lcd_hex(byte);               //以十六进制的方式显示键值(字节型)             
          lcd_gotoxy(2,1);             //定位到第2列第1行          
          lcd_putsf(string,5);         //显示FLASH里面的字符串   
          lcd_putsf("-AVRDIY",7);      //显示FLASH里面的字符串 
          delay_ms(500); 
        } 
}

/*下面是<1602LCD.h>文件内容

在使用LCD之前先了解一下4位数据线传输的原理
1:LCD在E由 1->0 时对RS和DB4-DB7进行取样和执行操作 
2:RS=0 时表示"准备"写指令,RS=1 时表示"准备"写显示的数据 
3:不管是指令数据还是显示数据,数据位都是8位,由于LCD用的是4个数据线,所以在传输时先传输数据的高4位(Msb),然后再传输数据的低4位(Lsb) 
比如说我们要写一个指令,指令是0b11001000 ( 高4位是1100,低4位是1000 )  
那么就要这样: 
先传输高4位  |  接着传输低4位 
   E=1 ;     |    E=1 ; 
   RS=0 ;    |    RS=0 ; 
   DB7=1;    |    DB7=1; 
   DB6=1;    |    DB6=0; 
   DB5=0;    |    DB5=0; 
   DB4=0;    |    DB4=0; 
   E=0;      |    E=0; 
这样,我们就完成了写一个指令了,相反,写显示数据时就是把RS=1就可以了 
对LCD的写操作只有写指令和写显示数据两种,所以,一个"写指令函数"和一个"写显示数据函数"就可以满足全部要求 
*/   
#ifndef _1602lcd_INCLUDED_             //如果原来没有宏定义本名字就... 
#define _1602lcd_INCLUDED_             //定义一下,防止多次被头文件包含 
#include                      //本例使用7线连接(也可以使用6线,但是没有读"忙"功能,不推荐) 
#define RS        PORTB.4              //请修改LCD与 单片机 的连接IO口 
#define RS_DDRn    DDRB.4 

#define RW        PORTB.5  
#define RW_DDRn    DDRB.5      

#define E         PORTB.2 
#define E_DDRn     DDRB.2  

#define DB4       PORTC.4 
#define DB4_DDRn   DDRC.4  

#define DB5       PORTC.5 
#define DB5_DDRn   DDRC.5

#define DB6       PORTC.6 
#define DB6_DDRn   DDRC.6 

#define DB7       PORTC.7  
#define DB7_DDRn   DDRC.7 
#define DB7_PINn   PINC.7 

//====================================================================================== 
//写LCD 
//datas是数据,高4位有效,rs决定datas是显示还是指令,read_lcd决定是否需要读取忙标志BF 
void lcd_h(unsigned char datas,unsigned char rs,unsigned char read_lcd) 
{   
  RS_DDRn =1;                         //RS/RW/E设置为输出 
  RW_DDRn =1; 
  E_DDRn  =1;   
  if(read_lcd)                        //如果需要读LCD忙标志就... 
    {        
      DB4_DDRn=0;                     //先把4个数据口设置为输入 
      DB5_DDRn=0; 
      DB6_DDRn=0; 
      DB7_DDRn=0; 
      RS=0;  
      RW=1;                           //读BF 
      E=1; 
      E=1;                            //相同的操作相当于等待几个时钟周期 
      E=1; 
      while(DB7_PINn);                //等待,直到DB7=0  
    } 
  RS=rs;                              //写指令或者数据 
  RW=0;                               //写  
  DB4_DDRn=1; 
  DB5_DDRn=1; 
  DB6_DDRn=1; 
  DB7_DDRn=1;  
  E=1;    
  if(datas&128) DB7=1; else DB7=0;
  if(datas&64)  DB6=1; else DB6=0;
  if(datas&32)  DB5=1; else DB5=0;
  if(datas&16)  DB4=1; else DB4=0;
  E=0;                                //LCD在E下降沿时对RS与DB4-DB7进行取样 
}  
//================================================================================== 
void lcd_dictate(unsigned char data)  //写指令函数 
{  
  lcd_h(data,0,1);                    //输出高4位  
  lcd_h(data*16,0,1);                 //输出低4位 
}  
//=================================================================================== 
void lcd_putchar(unsigned char data)  //写显示函数 
{   
  lcd_h(data,1,1);                    //输出高4位  
  lcd_h(data*16,1,1);                 //输出低4位 
}  
//==================================================================================== 
//初始化函数 
void lcd_init(void) 
{    
  delay_ms(20); 
  lcd_h(48,0,0); delay_ms(6);         //这3条是初始化语句 
  lcd_h(48,0,0); delay_ms(5);  
  lcd_h(48,0,0);               
  lcd_h(32,0,1);                      //使能4位数据线 
  lcd_dictate(40);                    //显示参数设定 
  lcd_dictate(12);                    //显示参数设定 
}  
  
//====================================================================================== 
//列/行定位函数,最开头的地址是0列0行 
void lcd_gotoxy(unsigned char x, unsigned char y)  //列/行定位函数 
{       
  if(x<=19 && y<=3)                    //防止输入的数据不正确 
    {                                 
      if(y==0) lcd_dictate(x+128);     //第0行的地址是从128开始 
      if(y==1) lcd_dictate(x+192);     //第1行...... 
      if(y==2) lcd_dictate(x+148); 
      if(y==3) lcd_dictate(x+212); 
    } 
}      
//===================================================================================== 
void lcd_hex(unsigned char byte_data)                //以十六进制显示一个字节变量 

  unsigned char data;  
   
  data=byte_data>>4;                             //求高4位 
  if(data<10) data+=48; else data+=55; //转化为ASCII值 
  lcd_putchar(data);                             //显示 
   
  data=byte_data&15;                             //求低4位 
  if(data<10) data+=48; else data+=55; //转化为ASCII值 
  lcd_putchar(data);                             //显示 
}   
//===================================================================================== 
void lcd_byte(unsigned char byte_data)                //以十进制显示一个字节变量 

  unsigned char data;  
   
  data=byte_data/100;                            //求百位数 
  lcd_putchar(data+48);                          //转化为ASCII值再显示 
   
  data=byte_data/10%10;                          //求十位数 
  lcd_putchar(data+48);                          //转化为ASCII值再显示 
   
  data=byte_data%10;                             //求个位数 
  lcd_putchar(data+48);                          //转化为ASCII再再显示 
}   
//===================================================================================== 
void lcd_putsf(flash unsigned char *string , unsigned char n) //显示FLASH里面的字符串 
{         
  unsigned char i=0; 
  while(i       {   
         lcd_putchar( string[ i ] ) ;                 //顺序显示字符 
         i++;                          
       } 
}  
//===================================================================================== 
#endif//


关键字:ATMEGA16  驱动1602  LCD程序 引用地址:ATMEGA16 驱动1602 LCD程序

上一篇:ATMEGA8 SPI 总线读写 93C46
下一篇:ATMEGA16 12864LCD驱动程序(KS0108芯片)

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

ATMEGA16单片机Timer1的OC1A脚输出占空比可调的PWM信号
采用快速PWM方式,通过按键设置OCR1A的值,从而改变占空比; 当数值超出界限时,以了LED和LCD的方式报警; 输出经过滤波可以得到直流信号,改变占空比,输出不一样。 仿真原理图如下 单片机源程序如下: #define MAIN_C #include includes.h /***************************/ /*PWM*/ /*晶振为4MHz*/ /*利用Timer1的OC1A脚输出占空比可调的信号*/ /*通过按键控制OCR1A的值*/ /***************************/ #define PwmOut PD5 //A通道的PWM输出 #define
[单片机]
<font color='red'>ATMEGA16</font>单片机Timer1的OC1A脚输出占空比可调的PWM信号
AVR单片机—(五)、ATMEGA16的USART与PC机串行通信—02
五、ATMEGA16的USART与PC机串行通信 五—(02)、PC机发送字符给单片机,然后用液晶显示发送的字符~~~ 这章节也是相对挺简单的~~直接上图片吧~~ 基本上就这么点吧~~然后就是程序了,这里我只是粘贴一下重要的程序~~,有的程序在以前的文章中用过了,我就不粘贴了~~比如说是lcdinit这个.c和.h文件吧~~都是以前就贴出来的,这里我就不说了~ IAR5_2.c文件: //------------------------------------------------------------------------------ //这个实验进行多个字节的发送和接收 //单片机收到多个字节后既将其回传给PC
[单片机]
AVR单片机—(五)、<font color='red'>ATMEGA16</font>的USART与PC机串行通信—02
PIC16Fxxx的LCD驱动程序(适用于HD44780兼容的驱动器)
P IC 16Fxxx的 LCD 驱动程序(适用于HD44780兼容的驱动器) ;************************************************ ;* LCD.ASM * ;************************************************ ;* Contains subroutines to control an external * ;* lcd panel in 4-bit mode. These routines * ;* were designed specifically for the panel on * ;* t
[单片机]
PIC单片机驱动LCD12864液晶显示闪动字体程序
/********************************************************************** *** 功能:12864LCD显示 显示闪动字体,各位同学可以自己修改。 *** 实验内容:0x81 0x90 0x88 0x98 分别是LCD四行的行首地址,我们操作LCD现实的字符就是分别放在这里面的 *** 开发板连接方法: 接上有字库LCD12864 注意调节对比度,LCD12864工作电流较大,请用外接电源供电。 *************************************************************************************
[单片机]
LCD1602+DTH11+MQ-135空气污染检测 温湿度程序
1602的温湿度程序 #include LiquidCrystal.h LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int temp;//温度 int humi;//湿度 int tol;//校对码 int j; unsigned int loopCnt; int chr = {0};//创建数字数组,用来存放40个bit unsigned long time; #define pin 7 int Aout=A0 ;//MQ-135 AO 接 Arduino Uno A0 int temp1 = 0; //临时变量,存储A0读取的数据 void setup() { Seria
[单片机]
如何实现ATMEGA16单片机与PC机的通信
ATMEGA16与PC机的通信实验1//PC机发送一个字符给单片机,单片机收到后既在发光二极管进行显示,同时将其回传给PC//单片机的发送。 //------------------------------------------------------------------------------ //ATMEGA16与PC机的通信实验1 //PC机发送一个字符给单片机,单片机收到后既在发光二极管进行显示,同时将其回传给PC //单片机的发送和接收都采用查询方式 #include“ioavr.h” #include“intrinsics.h” #include“delayics.h” //--------------
[单片机]
如何实现<font color='red'>ATMEGA16</font>单片机与PC机的通信
ATmega16 基准电压使能信号和启动时间
ATmega16 具有片内能隙基准源,用于掉电检测,或者是作为模拟比较器或ADC的输入。ADC 的2.56V 基准电压由此片内能隙基准源产生。 电压基准的启动时间可能影响其工作方式。启动时间列于Table 16。为了降低功耗,可以控制基准源仅在如下情况打开: 1. BOD 使能 ( 熔丝位BODEN 被编程) 2. 能隙基准源连接到模拟比较器(ACSR 寄存器的ACBG 置位) 3. ADC 使能 因此,当BOD 被禁止时,置位ACBG 或使能ADC 后要启动基准源。为了降低掉电模式的功耗,用户可以禁止上述三种条件,并在进入掉电模式之前关闭基准源。
[单片机]
<font color='red'>ATmega16</font> 基准电压使能信号和启动时间
单片机定时器实现实时时钟程序-lcd1602显示
本程序所用的原理图下载: http://www.51hei.com/f/HL-1V6.5.pdf ,单片机芯片使用的stc89c52;找到1602液晶部分的原理图即可.这是一张单片机开发板的整体图. 下面是程序的源代码: /** *功能:在LCD1602上显示当前时间(Time)和日期(Date) * 自动计时,可计时年月日(包括平年和闰年) * 可用按键调整时间和日期 * L ***************************** * C * Time: 00 Date: * * D * 00:00 2013-06-05 * * ****************************** *作者:徐冉
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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