LCD1602驅(qū)動(dòng)顯示并左右移動(dòng)的方法
掃描二維碼
隨時(shí)隨地手機(jī)看文章
以下程序?qū)⒃贚CD1602上顯示“Velcome”“www.ycavr.cn”并左右移動(dòng)。
/*********************************
* 字符LCD1602應(yīng)用例子 *
* 實(shí)驗(yàn)環(huán)境:阿發(fā)的M16學(xué)習(xí)板 *
* 接線方式:RS=PD.3,E=PD.6 *
* Db0-Db7=PB0-PB7 *
* 編 譯 器:ICCAVR6.31A *
*********************************/
#include "iom16v.h"
//宏定義 #define uchar unsigned char //配置端口 //延時(shí)函數(shù):入口i,單位mS,最大65536mS //寫(xiě)數(shù)據(jù)到LCD的函數(shù) //寫(xiě)指令到LCD的函數(shù) //顯示字符串函數(shù):入口:待顯示的字符串 //定位指令函數(shù) //LCD初始化函數(shù) 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位數(shù)據(jù)聯(lián)接在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; //開(kāi)背光:接在PC7
DDRC =0xFF; //定義C口為輸出
}
void delay_ms(uint i)
{
uint a;
for(;i;i--)
{
for(a=150;a!=0;a--) //針對(duì)時(shí)鐘頻率為1M
{;}
}
}
void lcd_da(uchar data)
{
SET_RS; //RS置高,寫(xiě)數(shù)據(jù)
delay_ms(1);
SET_E;
LCD_DATA = data;
delay_ms(1);
CLR_E;
delay_ms(1);//延時(shí)5MS
}
void lcd_comm(uchar data)
{
CLR_RS; //RS清0,寫(xiě)指令
delay_ms(1);//延時(shí)5MS
SET_E;
LCD_DATA = data;
delay_ms(1);
CLR_E;
delay_ms(1);//延時(shí)5MS
}
void lcd(char *s)
{
while(*s)
{
lcd_da(*s);
s++;
}
}
//清屏指令函數(shù)
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); //寫(xiě)指令:8位數(shù)據(jù)、2行顯示、5*8點(diǎn)陣
delay_ms(5);
lcd_comm(0x06); //寫(xiě)指令:自左向右顯示
delay_ms(5);
lcd_comm(0x0C); //寫(xiě)指令:顯示開(kāi)
delay_ms(5);
lcd_comm(0x80); //寫(xiě)指令:第1行地址
delay_ms(5);
lcd_comm(0x01); //寫(xiě)指令:CLS
}
//主函數(shù)
void main(void)
{
uchar i;
delay_ms(500); //延時(shí)500ms
lcd_init(); //LCD初始化
delay_ms(50);
locate(1,5); //第一行顯示位置
lcd("Velcome!"); //第一行顯示內(nèi)容
locate(2,2); //第二行顯示位置
lcd("www.ycavr.cn"); //第二行顯示內(nèi)容
{
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);
}
}
}