IAR For AVR -- LCD1602

发布者:清新生活最新更新时间:2016-10-06 来源: eefocus关键字:IAR  AVR  LCD1602 手机看文章 扫描二维码
随时随地手机看文章
LCD1602的端口大多一样,这里不多说,可以找找 长沙太阳人的datasheet。

下面是程序,定义在程序里很明显,要注意的是背光是用三极管控制的,但是效果不是很好,反而不如直接接。

源代码包括三个文件:LCD1602.C    ,    main.c    ,delay.h

 

/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/

LCD1602.C

/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/

#include
#include "delay.h"

/*设置管脚*/
#define RS PORTD_Bit3              
#define RW PORTD_Bit4
#define E PORTD_Bit6

/*LCD1602控制指令*/
#define LCD_Set        0x38   // 显示初始化,16*2显示,5*7点阵,8位数据接口 ;
#define LCD_Clear      0x01   // 清屏LCD ;
#define LCD_Display1   0x0f   // 显示功能设置:开显示,显示光标,光标闪烁 ;
#define LCD_Display2   0x0c   // 显示功能设置:开显示,不显示光标,光标不闪烁 ;
#define LCD_Mode       0x06   // 设置光标状态默认0x06,为读一个字符光标加1 ;

#define LCD_FirstLineAddress_Left   0x80          //设置初始化数据指针,指向 左半屏第一行首位 ; 
#define LCD_SecondLineAddress_Left (0x80+0x40)    //设置初始化数据指针,指向 左半屏第二行首位 ;

#define LCD_FirstLineAddress_Right (0x80+0x10)          //设置初始化数据指针,指向 右半屏第一行首位 ; 
#define LCD_SecondLineAddress_Right (0x80+0x40+0x10)     //设置初始化数据指针,指向 右半屏第二行首位 ;

#define LCD_Move_Left   0x18 // 整屏左移
#define LCD_Move_Right 0x1c // 整屏右移

/*端口初始化*/
void Port_Init()
{
DDRD_Bit3 = 1;   //控制端 RS 定义为输出
DDRD_Bit4 = 1;   //控制端 RW 定义为输出
DDRD_Bit6 = 1;   //控制端 E 定义为输出

DDRB = 0xFF;     //数据端定义为输出

DDRC_Bit7 = 1;   //背光控制端
PORTC_Bit7 =0;   //由三级管控制,低电平导通; 始终打开背光
}

/*液晶1602 写控制指令函数*/
void Write_Command(unsigned char Command)
{
RS = 0 ;                       // 进行指令的操作
RW = 0 ;                       // 进行写操作
PORTB = Command ;              // 赋值指令
E = 1 ;                        // 使能端拉高
delay_ms(5);                   // 等待指令写完
E = 0 ;                        // 使能端拉低
}

/*液晶1602 写数据函数*/
void Write_Data(unsigned char Data)
{
RS = 1 ;                       // 进行数据的操作
RW = 0 ;                       // 进行写操作
PORTB = Data ;                 // 赋值数据
E = 1 ;                        // 使能端拉高
delay_ms(5);                   // 等待数据写完
E = 0 ;                        // 使能端拉低
}

/*液晶1602 使用初始化*/
void LCD1602_Init()
{
E = 0;
Write_Command(LCD_Set);
Write_Command(LCD_Clear);
Write_Command(LCD_Display2);
Write_Command(LCD_Mode);
}

/*液晶1602 清屏*/
void LCD1602_Clear(void)
{
Write_Command(LCD_Clear);
}

/*液晶1602 左半屏显示*/
void LCD1602_Left_Display(unsigned char *table1 , unsigned char *table2)
{
unsigned char i;

Write_Command(LCD_FirstLineAddress_Left);delay_ms(1);    //第一行显示16个字符
for(i=0;i<16;i++)
{
Write_Data(table1[i]);
delay_ms(50); 
}

Write_Command(LCD_SecondLineAddress_Left);delay_ms(1);    //第二行显示16个字符
for(i=0;i<16;i++)
{
Write_Data(table2[i]);
delay_ms(1);
}
}

/*液晶1602 右半屏显示*/
void LCD1602_Right_Display(unsigned char *table1 , unsigned char *table2)
{
unsigned char i;

Write_Command(LCD_FirstLineAddress_Right);   //第一行显示16个字符delay_ms(1); 
for(i=0;i<16;i++)
{
Write_Data(table1[i]);
delay_ms(50); 
}

Write_Command(LCD_SecondLineAddress_Right);   //第二行显示16个字符delay_ms(1); 
for(i=0;i<16;i++)
{
Write_Data(table2[i]);
delay_ms(1);
}
}

/*液晶1602 左移*/
void LCD1602_TurnLeft()
{
unsigned char i;                 
for(i=0;i<16;i++)
{
Write_Command(LCD_Move_Left);
delay_ms(100);
}
}

/*液晶1602 右移*/
void LCD1602_TurnRight()
{
unsigned char i;                 
for(i=0;i<16;i++)
{
Write_Command(LCD_Move_Right);
delay_ms(100);
}
}

/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/

main.c

/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/

#include
#include "delay.h"

unsigned char dou1[]=" I LIKE AVR !          ";
unsigned char dou2[]="Douzi&Douer AVR!";

unsigned char dou3[]=" AVR to ARM !       ";
unsigned char dou4[]=" I Will Win !            ";

/*调用函数声明*/
void Port_Init();
void LCD1602_Init();
void LCD1602_Clear(void);
void LCD1602_Left_Display(unsigned char *table1 , unsigned char *table2);
void LCD1602_Right_Display(unsigned char *table1 , unsigned char *table2);
void LCD1602_TurnLeft();
void LCD1602_TurnRight();

/*主函数*/

void main(void)
{
Port_Init();
LCD1602_Init();
while(1)
{
    LCD1602_Left_Display(dou1,dou2);
    LCD1602_Right_Display(dou3,dou4);
    LCD1602_TurnLeft();
    delay_s(2);
    LCD1602_TurnRight();
    delay_s(2);
}
}

/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/

delay.h

/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/

#ifndef __IAR_DELAY_H
#define __IAR_DELAY_H

#include

#define XTAL 7.3728 //可定义为你所用的晶振频率(单位Mhz)


#define delay_us(x) __delay_cycles ( (unsigned long)(x * XTAL) ) 
#define delay_ms(x) __delay_cycles ( (unsigned long)(x * XTAL*1000) )
#define delay_s(x) __delay_cycles ( (unsigned long)(x * XTAL*1000000) )

#endif

关键字:IAR  AVR  LCD1602 引用地址:IAR For AVR -- LCD1602

上一篇:利用AVR的输入捕捉进行红外解码
下一篇:IAR 下 AVR 的外部中断操作

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

[AVR]高压并行编程---基础知识
手一抖就锁了好几片Mega16,这可是几十块钱啊...有必要造一个高压并行编程器了 一、接线方式及端口定义 RDY/BSY 判忙标志位。(0:设备正忙 1:等待新的命令) OE 输出使能位 低电平有效 WR 写脉冲 低电平有效 BS 字节选择1(0:选择低位字节 1:选择高位字节) XA XTAL动作位 00加载Flash或者EEPROM地址 01加载数据 10加载命令 11保留 PAGEL 加载程序存储器和EEPROM数据页 DATA 双向数据/命令口 0x80 芯片擦除 0x40 写熔丝位 0x20 写锁定位 0x10 写FLASH 0x11 写EEPROM 0x08 读标示字节和校准字节 0x04 读熔丝位及锁定位 0x
[单片机]
51单片机加HC—SR04超声波测距仪用LCD1602显示
#include reg51.H #include intrins.h #define uchar unsigned char #define uint unsigned int sbit lcden=P1^2; sbit lcdrs=P1^0; sbit lcdrw=P1^1; sbit RX=P2^1; sbit TX=P2^0; uint time=0; unsigned long S=0; bit flag =0; uchar disdat ={ 0,0,0,0,}; void delay(uint z) //延时子程序 { uint x,y; for(x=z;x 0;x--) for(y=110;
[单片机]
avr单片机串口多机通讯及实例
在多机通信过程中,所有设备的 RS232接口是并在通信线上的,其中只能有一个设备为主机,其他为从机,通信由主机发起。数据帧一般采用1位起始位、9位数据位,其中第9位(RXB8)被用作为表征该帧是地址帧还是数据帧。当帧类型表征位为 1 时,表示该帧数据为一个地址帧;当帧类型表征位为 0 时,表示这个帧为一个数据帧。   在AVR中,通过设置从机的UCSRA寄存器中标志位MPCM,可以使能USART接收器对接收的数据帧进行过滤的功能。如果使能了过滤功能,从机接收器对接收到的那些不是地址信息帧的数据帧将进行过滤,不将其放入接收缓冲器中,这在多机通信中有效的方便了从机MCU处理数据帧程序的编写(同标准51 结构相比)。而发送器则不受MP
[单片机]
AVR单片机中左移位和右移位指令
计算机的指令系统是一套控制计算机操作的代码,称之为机器语言。计算机只能识别和执行机器语言的指令。为了便于人们理解、记忆和使用,通常用汇编语言指令来描述计算机的指令系统。汇编语言指令可通过汇编器翻译成计算机能识别的机器语言。 AVR单片机指令系统是RISC结构的精简指令集,是一种简明易掌握﹑效率高的指令系统。 SL-DIY02-3开发实验器使用AT90S8535单片机,有118条指令, 而我们所做的11个实验程序仅用了34条指令, 我们重点讲这34条指令, 其余指令就可自学了。 AVR器件(指令速查表) 118条指令器件 AT90S2313/2323/2343/2333 ,AT90S4414/4433/4434/85
[单片机]
<font color='red'>AVR</font>单片机中左移位和右移位指令
B001-Atmega16-中断(GCC-AVR)-(ques=3)
编译器 :AVR Studio 4.19 + avr-toolchain-installer-3.4.1.1195-win32.win32.x86 芯片型号:ATmega16 芯片主频:8MHz ------------------------------------------------------------------------------------------------------------------------------------- 待解决问题数量 = 3 --------------------------------------------------------------------
[单片机]
B001-Atmega16-中断(GCC-<font color='red'>AVR</font>)-(ques=3)
课程作业记录6:MSP430G2553+LCD1602字符滚动
首先,这次实验设计中我们实现的是在LCD1602上进行的字符滚动,用的单片机是MSP430G2553,跑的软件是CCS。是一个非常简单的程序设计,但是我C语言和单片机这部分都学得很差哈哈,放上来给大家参考参考,同时鼓舞一下大家的信心。 软件程序部分 该程序主要由主程序源程序main.c、子程序源程序LCD.c和子程序头文件LCD.h构成。采用这种程序结构,使程序更加清晰,一目了然,减少程序错误的机会,增强了程序的可移植性。在程序设计中MSP430G2553中P1口作为并行数据输出端,P2.0、P2.1、P2.2分别作为LCD1602液晶的RS、RW、E端。 1)主函数main.c #include msp430g2
[单片机]
课程作业记录6:MSP430G2553+<font color='red'>LCD1602</font>字符滚动
AVR单片机多路ADC转换程序
AVRAD转换使用注意: 绝对的应用经验! 1、注意采样保持时间要足够长 最少62us 2、注意AREF的稳定性 3、注意悬空的引脚无意义 4、注意切换通道后首次测量结果应该舍弃 AVR各种学习开发工具 搜索 SHOP AVRVI 给你一个tiny13写的多路AD采集的例子。 仅提供思路的主要部分,其余部分暂不方便提供,ICC编写。 程序自动采集并放入数组中,需要使用前调用GetAD将结果存到多维数组搜索的最后,四个数取平均。 volatile unsigned char time_count=0,AD_datai=0,channer=0; volatile unsigned char AD_d
[单片机]
基于AVR与DDS技术的超声波电源研制
   1引言   近年来, 随着压电材料、电力电子技术的飞速发展,超声在工业、农业、生物、医药卫生、环境保护等国民经济的各个部门以及国防工业中已得到广泛的应用。超声技术的两大核心要素包括换能器和超声电源。目前,超声技术向高频率、高稳定性发展,因此对超声电源的性能提出了更高的要求。在超声系统工作过程中,由于变幅杆系统刚度、载荷、工作面积等因素的变化,导致换能器系统固有频率发生漂移,要求超声电源具有精确的频率自动跟踪功能,以满足换能器稳定的超声输出。此外,目前对换能器多种工作频率的需求日愈增加,急需具有多种频率选择的超声电源与之配对。本文采用DDS与AVR,研制了一种新型超声波电源,能够提供500kHz、功率为3.2瓦范围内的电信
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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