#include <avr/io.h>
#include <avr/delay.h>
//控制端口
#define LCD_CTRL_DDR DDRB
#define LCD_CTRL_PORT PORTB
#define LCD_CTRL_PIN PINB
#define LCD_RS 0X01
#define LCD_RW 0X02
#define LCD_EN 0X04
//读取类型
#define read_comm 0
#define read_data 1
//数据端口
#define LCD_DATA_DDR DDRA
#define LCD_DATA_PORT PORTA
#define LCD_DATA_PIN PINA
void lcd_init(void); //LCD初始化
void lcd_write_comm(unsigned char comm); //写命令
void lcd_write_data(unsigned char data); //写数据
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *p); //写字符串
unsigned char lcd_read_char(unsigned char read_type); //读取
void lcd_posion(unsigned char x,unsigned char y); //位置设定
void lcd_busy_chek(void);
void lcd_en_signal(void);
void lcd_init(void)
{
LCD_CTRL_PORT=0x00;
LCD_CTRL_DDR= 0xff;
LCD_DATA_PORT=0X00;
LCD_DATA_DDR=0XFF;
lcd_write_comm(0x3f); //功能设置,8位数据,两行显示,5X10
lcd_write_comm(0x06); //输入方式设置
lcd_write_comm(0x0f); //显示开关设置
lcd_write_comm(0x01); //清屏
}
void lcd_write_comm(unsigned char comm)
{
lcd_busy_chek();
LCD_CTRL_PORT&=~LCD_RW; //WRITE
LCD_CTRL_PORT&=~LCD_RS; //RS=0
LCD_DATA_PORT=comm;
lcd_en_signal();
LCD_CTRL_PORT^=LCD_RS; //CONVERSE RS
LCD_CTRL_PORT^=LCD_RW; //WRITE
}
void lcd_posion(unsigned char x,unsigned char y)
{
unsigned char address;
if(y == 0)
address = 0x80 + x;
else
address = 0xc0 + x;
lcd_write_comm(address);
}
void lcd_write_data(unsigned char data)
{
lcd_busy_chek();
LCD_CTRL_PORT&=~LCD_RW; //WRITE
LCD_CTRL_PORT|=LCD_RS; //RS=0
LCD_DATA_PORT = data;
lcd_en_signal();
LCD_CTRL_PORT^=LCD_RS; //CONVERSE RS
LCD_CTRL_PORT^=LCD_RW; //WRITE
}
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *p) //写数据
{
lcd_posion(x,y);
while(*p)
{
lcd_write_data(*p);
p++;
}
}
unsigned char lcd_read_char(unsigned char read_type)
{
unsigned char temp;
lcd_busy_chek();
if(read_type==read_comm) //read comm
{
LCD_CTRL_PORT&=~LCD_RS;
}
else //read data
{
LCD_CTRL_PORT|=LCD_RS;
}
LCD_CTRL_PORT|=LCD_RW; //read
lcd_en_signal();
temp=LCD_DATA_PIN;
LCD_CTRL_PORT^=LCD_RW; //CONVERSE RW
LCD_CTRL_PORT^=LCD_RS; //CONVERSE RS
return temp;
}
void lcd_busy_chek(void)
{
LCD_DATA_DDR = 0X00;
LCD_DATA_PORT = 0XFF;
LCD_CTRL_PORT&=~LCD_RS;
LCD_CTRL_PORT|=LCD_RW; //read
//为什么这里换成函数lcd_en_signal()却不行???
LCD_CTRL_PORT&=~LCD_EN;
_delay_us(1);
LCD_CTRL_PORT|=LCD_EN;
_delay_us(1);
LCD_CTRL_PORT&=~LCD_EN;
while( LCD_DATA_PIN&0X80 )
{
LCD_CTRL_PORT&=~LCD_EN;
_delay_us(1);
LCD_CTRL_PORT|=LCD_EN;
_delay_us(1);
LCD_CTRL_PORT&=~LCD_EN;
}
/*
lcd_en_signal();
while( LCD_DATA_PIN&0X80 )
{
lcd_en_signal();
}
*/
//为什么这里换成函数lcd_en_signal()却不行???
LCD_CTRL_PORT^=LCD_RW; //CONVERSE RW
LCD_CTRL_PORT^=LCD_RS; //CONVERSE RS
LCD_DATA_PORT = 0X00;
LCD_DATA_DDR = 0XFF;
}
void lcd_en_signal(void)
{
LCD_CTRL_PORT&=~LCD_EN;
_delay_us(1);
LCD_CTRL_PORT|=LCD_EN;
_delay_us(1);
LCD_CTRL_PORT&=~LCD_EN;
}
main()
{
PORTD=0X00;
DDRD=0XFF;
unsigned count=0;
lcd_init();
while(1)
{
lcd_write_comm(0x01); //清屏
lcd_write_str(0,0,"dfgfhfgj");
lcd_write_str(0,1,"shfghjhgkgk");
PORTD=1<<(count++%8);
for(unsigned char i=0;i<200;i++)
_delay_ms(88);
lcd_write_comm(0x01); //清屏
lcd_write_str(0,0,"remember mydream");
lcd_write_str(0,1,"I will be winner");
PORTD=1<<(count++%8);
for(unsigned char j=0;j<200;j++)
_delay_ms(88);
}
}
|