以下程序?qū)⒃贚CD1602上顯示“Velcome”“www.ycavr.cn”并左右移動。
/*********************************
* 字符LCD1602應(yīng)用例子 *
* 實驗環(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ù):入口i,單位mS,最大65536mS //寫數(shù)據(jù)到LCD的函數(shù) //寫指令到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; //開背光:接在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置高,寫數(shù)據(jù)
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++;
}
}
//清屏指令函數(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); //寫指令:8位數(shù)據(jù)、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
}
//主函數(shù)
void main(void)
{
uchar i;
delay_ms(500); //延時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);
}
}
}