LCD1602驱动显示并左右移动的方法
扫描二维码
随时随地手机看文章
以下程序将在LCD1602上显示“Velcome”“www.ycavr.cn”并左右移动。
/*********************************
* 字符LCD1602应用例子 *
* 实验环境:阿发的M16学习板 *
* 接线方式:RS=PD.3,E=PD.6 *
* Db0-Db7=PB0-PB7 *
* 编 译 器:ICCAVR6.31A *
*********************************/
#include "iom16v.h"
//宏定义 #define uchar unsigned char //配置端口 //延时函数:入口i,单位mS,最大65536mS //写数据到LCD的函数 //写指令到LCD的函数 //显示字符串函数:入口:待显示的字符串 //定位指令函数 //LCD初始化函数 port_init(); //端口初始化 for(i=5;i;i--) //先右移5位
#define RS1602 PD3 //RS接在PORTD.3上
#define E1602 PD6 //E接在PORTD.6上
#define LCD_DATA PORTB //8位数据联接在PORTB上
#define CLR_RS PORTD&=~(1<
#define uint unsigned int
void port_init(void)
{
PORTA = 0xFF;
DDRA =0x00;
PORTB = 0xFF;
DDRB =0xFF;
PORTD =0x00;
DDRD =0xFF;
PORTC =0x00; //开背光:接在PC7
DDRC =0xFF; //定义C口为输出
}
void delay_ms(uint i)
{
uint a;
for(;i;i--)
{
for(a=150;a!=0;a--) //针对时钟频率为1M
{;}
}
}
void lcd_da(uchar data)
{
SET_RS; //RS置高,写数据
delay_ms(1);
SET_E;
LCD_DATA = data;
delay_ms(1);
CLR_E;
delay_ms(1);//延时5MS
}
void lcd_comm(uchar data)
{
CLR_RS; //RS清0,写指令
delay_ms(1);//延时5MS
SET_E;
LCD_DATA = data;
delay_ms(1);
CLR_E;
delay_ms(1);//延时5MS
}
void lcd(char *s)
{
while(*s)
{
lcd_da(*s);
s++;
}
}
//清屏指令函数
void cls(void)
{
lcd_comm(0x01);
delay_ms(5);
}
void locate(uchar a,uchar b)
{
uchar x;
if(a==1)
x=0x80+b-1;
if(a==2)
x=0xC0+b-1;
lcd_comm(x);
delay_ms(1);
}
void lcd_init(void)
{
lcd_comm(0x38); //写指令:8位数据、2行显示、5*8点阵
delay_ms(5);
lcd_comm(0x06); //写指令:自左向右显示
delay_ms(5);
lcd_comm(0x0C); //写指令:显示开
delay_ms(5);
lcd_comm(0x80); //写指令:第1行地址
delay_ms(5);
lcd_comm(0x01); //写指令:CLS
}
//主函数
void main(void)
{
uchar i;
delay_ms(500); //延时500ms
lcd_init(); //LCD初始化
delay_ms(50);
locate(1,5); //第一行显示位置
lcd("Velcome!"); //第一行显示内容
locate(2,2); //第二行显示位置
lcd("www.ycavr.cn"); //第二行显示内容
{
lcd_comm(0x1C);
delay_ms(100);
}
while (1)
{
for(i=10;i;i--) //左移10位
{
lcd_comm(0x18);
delay_ms(400);
}
for(i=10;i;i--) //右移10位
{
lcd_comm(0x1C);
delay_ms(400);
}
}
}