/*********************************
* 字符LCD1602应用例子 *
* 实验环境:阿发的M16学习板 *
* 接线方式:RS=PD.3,E=PD.6 *
* Db0-Db7=PB0-PB7 *
* 编 译 器:ICCAVR6.31A *
*********************************/
#include "iom16v.h"
//宏定义
#define RS1602 PD3 //RS接在PORTD.3上
#define E1602 PD6 //E接在PORTD.6上
#define LCD_DATA PORTB //8位数据联接在PORTB上
#define CLR_RS PORTD&=~(1<
#define uchar unsigned char
#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口为输出
}
//延时函数:入口i,单位mS,最大65536mS
void delay_ms(uint i)
{
uint a;
for(;i;i--)
{
for(a=150;a!=0;a--) //针对时钟频率为1M
{;}
}
}
//写数据到LCD的函数
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
}
//写指令到LCD的函数
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);
}
//LCD初始化函数
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;
port_init(); //端口初始化
delay_ms(500); //延时500ms
lcd_init(); //LCD初始化
delay_ms(50);
locate(1,5); //第一行显示位置
lcd("Velcome!"); //第一行显示内容
locate(2,2); //第二行显示位置
lcd("www.ycavr.cn"); //第二行显示内容
for(i=5;i;i--) //先右移5位
{
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);
}
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』