|
发表于 2005-8-5 20:51:56
|
显示全部楼层
非原创,摘自《AVR单片机与CPLD/FPGA综合应用入门》,可以使用!
希望对你有帮助!
LCD.h:
#define LCDPORT PORTB//数据总线接在PB口
#define LCDDDR DDRB
#define LCDPIN PINB
#define En_H sbi(PORTD,5)//En接PD5
#define En_L cbi(PORTD,5)
#define RW_R sbi(PORTD,4)//R/W接PD4
#define RW_W cbi(PORTD,4)
#define RS_H sbi(PORTD,3)//RS接PD3
#define RS_L cbi(PORTD,3)
#define DelaytE delay(10)
#define Clear_Screen Write_Command(0x01)
void delay(uint16_t time)
{
while(time>0)
{time--;}
}
void En_Toggle(void)//产生一个使能脉冲
{
En_H;
DelaytE;
En_L;
DelaytE;
}
/*不断检测LCD的忙标志BF,直到其为0,表示可以执行下一条指令*/
void Wait_Until_Ready(void)
{
RW_R;//读状态
RS_L;//读状态位
LCDDDR=0x00;//输入
LCDPORT=0x00;
En_H;
DelaytE;
loop_until_bit_is_clear(LCDPIN,7);//不断循环,直至BF=0
En_L;
}
void Write_Command(uint8_t Command)//向LCD写入命令字
{
RW_W;//写状态
RS_L;//写入命令字
LCDDDR=0xFF;//输出
LCDPORT=Command;
En_Toggle();
Wait_Until_Ready();
}
void Write_Data(uint8_t Data)//写入数据
{
RW_W;
RS_H;//写入数据
LCDDDR=0xFF;
LCDPORT=Data;
En_Toggle();
Wait_Until_Ready();
}
void Write_Position(uint8_t row,uint8_t colum)//设字符位置
{
uint8_t p;
if(row==1)
{p=0x80+colum-1;
Write_Command(p);
}
else
{p=0xC0+colum-1;
Write_Command(p);
}
}
void Write_String(uint8_t *s)//写入字符串
{
for(;*s!='\0';s++) Write_Data(*s);
}
void Initialize_LCD(void)//LCD初始化
{
DDRD=0xFF;//PD口,输出,控制信号
Write_Command(0x38);
Write_Command(0x06);
Write_Command(0x0C);
Clear_Screen;
} |
|