不知是初始化还是字符编码的问题#include <avr/io.h>
#include <util/delay.h>
void delay_ms(void) //1ms延时函数
{
_delay_loop_2(92); // 16-bit count,4 cycles/loop
}
/*-------------------------------------*/
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_ms();
}
//=======================================================
//微秒级延时程序
void delay_us()
{
_delay_loop_1(1); //3个时钟周期
}
//读取lcd是否内部操作(忙碌)状态
int Lcd_Busy()
{ int r;
DDRC=0X00; //端口设为输入方式
DDRB|=(1<<0)|(1<<1)|(1<<2);
PORTB&=~(1<<0);//e=0;
PORTB&=~(1<<2);//rs=0
PORTB|=(1<<1); //rw=1
delay_us();
PORTB|=(1<<0);//e=1;
delay_us();
r = PINC & 0x08; //读取lcd_data第八位
PORTB&=~(1<<0);// e=0;
DDRC=0xff; //端口设为输出方式
return r; //读取结果返回
}
//=======================================================
//向Lcd发送命令程序
void Lcd_Command(unsigned char Command)
{
//while(Lcd_Busy()); //判断lcd是否内部操作状态
DDRB|=(1<<0)|(1<<1)|(1<<2);
DDRC=0xff;
//PORTB&=~(1<<0);//e=0;
PORTB&=~(1<<2);//rs=0;
PORTB&=~(1<<1);//rw=0;
delay_us();
PORTC&=0xf0;
delay_us();
PORTB|=(1<<0);//e=1;
PORTC=(Command>>4)&0x0f; //写数据高
delay_us();
PORTB|=(1<<0);//e=1;
delay_nms(5);
PORTB&=~(1<<0);//e=0;
PORTC&=0xf0;
delay_us();
//PORTB&=~(1<<0);//e=0;
PORTC=Command&0x0f; //写数据低位
delay_us();
PORTB|=(1<<0);//e=1;
delay_nms(5);
PORTB&=~(1<<0);//e=0;
}
//=======================================================
//向lcd写入一个字符程序
void Lcd_Write(unsigned char Data)
{
while(Lcd_Busy()); //判断lcd是否内部操作状态
DDRB|=(1<<0)|(1<<1)|(1<<2);
DDRC=0xff;
//PORTB&=~(1<<0);//e=0;
PORTB|=(1<<2);//rs=1;
PORTB&=~(1<<1);//rw=0;
delay_us(); //液晶延时子程序
PORTC&=0xf0;
delay_us();
PORTC=(Data>>4)&0x0f; //写数据高
delay_us();
PORTB|=(1<<0);//e=1;
delay_nms(5);
PORTB&=~(1<<0);//e=0;
PORTC&=0xf0;
delay_us();
PORTC=Data&0x0f; //写数据低位
delay_us();
PORTB|=(1<<0);//e=1;
delay_nms(5); //液晶延时子程序
PORTB&=~(1<<0);//e=0;
}
/*=======================================================
LCD第1行显示地址1~20(0x80~0x93)
LCD第2行显示地址1~20(0xc0~0xd3)
LCD第3行显示地址1~20(0x94~0xa7)
LCD第4行显示地址1~20(0xd4~0xe7)
=======================================================*/
//初始化LCD_8位接口,4行x20字符的工作方式 */
void Lcd_Init(void)
{
DDRD|=(1<<4);
PORTD|=(1<<4); //bl=1
DDRB|=(1<<0);
PORTB&=~(1<<0);//e=0;
Lcd_Command(0x01); //清除显示器
delay_ms();
//Lcd_Command(0x02); //归位
delay_ms();
Lcd_Command(0x28); // 四线 双行
delay_ms();
DDRB|=(1<<0);
PORTB|=(1<<0);//e=1;
delay_ms();
PORTB&=~(1<<0);//e=0;
Lcd_Command(0x06); //令LCD每接收到1Byte数据后,AC自动加1
delay_ms();
Lcd_Command(0x0c); //开显示
delay_ms();
// Lcd_Command(0x80);
}
/*void asc_tran(int *asc)
{ delay_nms(100);
while((*asc) != 0) //判断字是否结束
{ delay_nms(100);
Lcd_Write(*asc); //向lcd写入字符串
asc++; //移下一个字符
}
} */
//=======================================================
//测试主LCD主程序
int main(void)
{ int i;
while(1)
{ Lcd_Init(); //初始化LCD
for(i=0;i<20;i++)
{
Lcd_Command(0x80);
Lcd_Write(0x31);
} //连续显示20个1
delay_nms(1000); //延迟1秒
Lcd_Command(0x01); //清除显示器
}
} |