📄 1602.c
字号:
//说明:此程序在LCD1602上显示“Velcome! ”“www.iccavr.com”同时实现左右移动。
/*********************************
* 字符LCD1602应用例子 *
* 实验环境:本站的M16学习板 *
* 接线方式:RS=PD.3,E=PC.6 *
* Db0-Db7=PB0-PB7 *
* 作 者:tonghe *
* 日 期:2007年03月06日 *
* 版 本:V1.2 *
* 修改日期:2007年08月11日 *
* 编 译 器:ICCAVR6.31A *
*********************************/
#include "iom8v.h"
//宏定义
#define RS1602 PD3 //RS接在PORTD.3上
#define E1602 PC6 //E接在PORTC.6上
#define LCD_DATA PORTB //8位数据联接在PORTB上
#define CLR_RS PORTD&=~(1<<RS1602)//RS清0
#define SET_RS PORTD|=1<<RS1602 //RS置1
#define CLR_E PORTC&=~(1<<E1602) //E清0
#define SET_E PORTC|=1<<E1602 //E置1
#define uchar unsigned char
#define uint unsigned int
//配置端口
void port_init(void)
{
// PORTA = 0xFF;
//DDRA = 0x00;
DDRB = 0xFF;
PORTB = 0xFF;
DDRD = 0xFF;
PORTD = 0x00;
DDRC = 0xFF; //定义C口为输出
PORTC = 0x00; //开背光:接在PC7
}
//延时函数:入口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(50); //延时500ms
lcd_init(); //LCD初始化
delay_ms(50);
locate(1,5); //第一行显示位置
lcd("Velcome!"); //第一行显示内容
locate(2,2); //第二行显示位置
lcd("www.iccavr.com"); //第二行显示内容
for(i=5;i;i--) //先右移5位
{
lcd_comm(0x1C);
delay_ms(100);
}
while (1)
{
for(i=10;i;i--) //左移10位
{
lcd_comm(0x18);
if(i==6)delay_ms(2000); //移到中间暂停2秒
delay_ms(400);
}
for(i=10;i;i--) //右移10位
{
lcd_comm(0x1C);
if(i==6)delay_ms(2000);
delay_ms(400);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -