datasheet

ATmega128(lcd1602)

2016-09-29来源: eefocus关键字:ATmega128  lcd1602
//Atmega128的1602型LCD显示驱动程序

//编译环境 AVR Studio 4.17/AVR GCC
//系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms

//***********************************************************************
//   包含文件
//***********************************************************************

#include
#include
#define  F_CPU 7372800  /* 单片机主频为7.3728MHz,用于延时子程序 */
#include
#include
#include
//***********************************************************************
// 定义变量区
//***********************************************************************
#define uchar unsigned char
#define uint  unsigned int

#define delay_us(x)     _delay_us(x)        //AVR GCC延时函数 x(us)
#define delay_ms(x)     _delay_ms(x)        //AVR GCC延时函数 x(ms)

#define RS_CLR PORTF &= ~(1 << PF1)                 //RS置低
#define RS_SET PORTF |= (1 << PF1)                  //RS置高

#define RW_CLR PORTF &= ~(1 << PF2)                 //RW置低
#define RW_SET PORTF |= (1 << PF2)                  //RW置高

#define EN_CLR PORTF &= ~(1 << PF3)                 //E置低
#define EN_SET PORTF |= (1 << PF3)                  //E置高

#define Data_IO         PORTA                //液晶数据口
#define Data_DDR        DDRA                 //数据口方向寄存器
#define D_LE0         PORTD &= ~(1 << PD4) //数码管段控制位为0,锁存端口数据
#define D_LE1           PORTD |= (1 << PD4)  //数码管段控制位为1,锁存器输出与端口一致
#define W_LE0         PORTD &= ~(1 << PD5) //数码管位控制位为0
#define W_LE1           PORTD |= (1 << PD5)  //数码管位控制位为1

//*************************************************************************
//   初始化子程序
//*************************************************************************
void system_init()
{

 Data_IO = 0xFF;            //电平设置
 Data_DDR = 0xFF;            //方向输出
 PORTF = 0xFF;                       //电平设置
 DDRF = 0xFF;                        //方向输出
    PORTD=0xFF;
 DDRD=0xFF;
 D_LE1;                             //关掉数码管,以免显示乱码                   
    W_LE1;                     
    Data_IO=0xFF;                      //关数码管            
    W_LE0; 
}

//***********************************************************************
// 显示屏命令写入函数
//***********************************************************************


void LCD_write_com(unsigned char com) 

 RS_CLR;
 RW_CLR;
 EN_SET;
 Data_IO = com;
 delay_ms(5);
 EN_CLR;
}
//***********************************************************************
// 显示屏数据写入函数
//***********************************************************************

void LCD_write_data(unsigned char data) 
{
 RS_SET;
 RW_CLR;
 EN_SET;
 Data_IO = data;
 delay_ms(5);
 EN_CLR;
}
//***********************************************************************
// 显示屏清空显示
//***********************************************************************

void LCD_clear(void) 
{
 LCD_write_com(0x01);
 delay_ms(5);
}
//***********************************************************************
// 显示屏字符串写入函数
//***********************************************************************

void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) 
{
 
    if (y == 0) 
    {
     LCD_write_com(0x80 + x);
    }
    else 
    {
     LCD_write_com(0xC0 + x);
    }
    
    while (*s) 
    {
     LCD_write_data( *s);
     s ++;
    }
}
//***********************************************************************
// 显示屏单字符写入函数
//***********************************************************************

void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) 
{
 
    if (y == 0) 
    {
     LCD_write_com(0x80 + x);
    }
    else 
    {
     LCD_write_com(0xC0 + x);
    }
    
    LCD_write_data( data);  
}
//***********************************************************************
// 显示屏初始化函数
//***********************************************************************

void LCD_init(void) 
{
 DDRA = 0xFF;            //I/O口方向设置
 DDRA |= (1 << PA5) | (1 << PA6) | (1 << PA7);
 LCD_write_com(0x38);    //显示模式设置
 delay_ms(5);
 LCD_write_com(0x08);    //显示关闭
 delay_ms(5);
    LCD_write_com(0x01);    //显示清屏
 delay_ms(5);
    LCD_write_com(0x06);    //显示光标移动设置
 delay_ms(5);
 LCD_write_com(0x0C);    //显示开及光标设置
    delay_ms(5);
}

//*************************************************************************
//   主程序
//*************************************************************************
void main(void) 
{

 unsigned char i;
 unsigned char *p;
    system_init();                                //系统初始化,设置IO口属性
 delay_ms(100);                                //延时100ms
 LCD_init();                                   //液晶参数初始化设置

 while (1) 
   {
  i = 1;
  p = "www.hcit.edu.com";                    //字符串输出显示
  LCD_clear();
  LCD_write_str(0,0,"Welcome");
  delay_ms(250);
  
  while (*p) {
   LCD_write_char(i,1,*p);          //单个字符输出显示
   i ++;
   p ++;
   delay_ms(250);                   //延时250ms
   }
  delay_ms(250);
  }
}

关键字:ATmega128  lcd1602

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/article_2016092929956.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇: ATmega128(PWM—time 0)
下一篇:ATmega128(DS18B20)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Atmega48-88-168熔丝位设置方法

         本文以Atmega168PA+PROGISP为例说明Atmega48-88-168熔丝位的设置方法,参考设计电路图如下图所示,外接7.3728M无源晶振。     1、启动PROGISP软件,正确连接下载器和目标板,选择Atmega168PA,点击“RD”按钮,一切正常的话,应在提示栏中看到正确提示。        2、 点击“...”按钮,打开“Fuse&Lock”对话框,选择“向导方式”。       3、勾选如下
发表于 2019-07-13
Atmega48-88-168熔丝位设置方法

Atmega168 外部10M晶振熔丝位设置方法

    本日志介绍 Atmega168外部10M晶振熔丝位设置方法。    图1:Boot Flash 1024;使能串行下载;看门狗使能          图2:电压低于2.7V复位           图3:外部晶振8M以上,启动速度最慢;没有Flash加密;没有Boot Loader 
发表于 2019-07-13
Atmega168 外部10M晶振熔丝位设置方法

Atmega168 延时函数晶振频率的设置方法

    本文介绍,在Atmel Studio环境中,更改延时函数(宏)的晶振频率的方法。    在Atmel Studio中,可以使用_delay_us(x)宏和_delay_ms(x)进行精准延时,但是在使用这2个宏之前必须设置当前的晶振频率,本日志介绍其设置方法。    1、在项目上点击右键,选择属性     2、在属性栏中,选择工具链,然后选择“Symbols”,然后将F_CPU宏,更改为相应的晶振频率即可。     
发表于 2019-07-13
Atmega168 延时函数晶振频率的设置方法

ATmega16定时器1的时间设定

在Atmel Studio 7环境下编写程序感觉比较舒服。目的:根据设定的时间触发中断,触发一次,变量累加一次;用到中断,所以一开始需要#include变量:unsigned char  time = 0;定时器1配置:void ConfigTimer1(unsigned int set){TCCR1B |= (1<<2);//256分频      比如12M ,就是12000000/256  tmp = 65536-set;//set=( 晶振频率/分频) * 定时时间)TCNT1H = (unsigned char)(tmp>>
发表于 2018-10-07

Atmega16中使用modbus协议

调试工具:Modbus Poll编程软件:Atmel Studio 7理解:PC中的Modbus Poll是主机,而AVR芯片作为从机此处有两种串行传输模式:RTU和ASCII此处使用了RTU模式,这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII 模式有更高的吞吐率。每个报文必须以连续的字符流传送。//以下是必要的函数void usart_init(uint baud)//波特率{UCSRA = 0X00;UCSRB = 0X00;                
发表于 2018-10-07

Atmega8a的采样(查询法)

];//存温度#define get while(!(ADCSRA & (1 << ADIF)))//若转化完成,ADIF=1========================================atmega8和16不同,16的采样可以由定时器触发
发表于 2018-10-07
Atmega8a的采样(查询法)

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved