LCD1602显示编程(刚调试成功)
#include <avr/io.h>
#define RS_H PORTC |= (1 << 0) //RS置1,写数据
#define RS_L PORTC &= ~(1 << 0) //RS置0,写命令
#define E_H PORTC |= (1 << 1) //使能信号
#define E_L PORTC &= ~(1 << 1) //不使能信号
void delay_ms(int x) //延时x毫秒
{
unsigned int i,j;
for(i = 0;i < x;i ++)
{
for(j = 0;j < 1000;j++);
}
}
void delay_us(int n)
{
if (n == 0)
{
return ;
}
while (--n);
}
void w_data (char x) //写数据函数
{
RS_H;
PORTA = x;
delay_us(5);
E_H;
delay_us(5);
E_L;
}
void w_comm (char x) //写命令函数
{
RS_L;
PORTA = x;
delay_us(5);
E_H;
delay_us(5);
E_L;
}
void setxy (char x,char y) //指定显示座标位置,y为行,X为列
{
if (y == 0)
{
w_comm(0x80 + x);
}
else
{
w_comm(0xc0 + x);
}
}
/*void LCD_clear(void) //清屏
{
w_comm(0x01);
delay_ms(5);
}
void w_char(char x,char y,char c) //写入单个字符
{
setxy(x,y);
w_data(c);
}*/
void w_string (int x,int y,char *s) //写入字符串
{
setxy(x,y);
while(*s)
{
w_data(*s);
delay_ms(500);
s++;
}
}
void init(void) //初始化端口
{
DDRA = 0XFF;
DDRC |= (1 << 0)|(1 << 1);
delay_ms(15);
w_comm(0x38);
delay_ms(5);
w_comm(0x38);
delay_ms(5);
w_comm(0x38);
delay_ms(5);
w_comm(0x01);
delay_ms(5);
w_comm(0x07);
delay_ms(5);
w_comm(0x0c);
delay_ms(5);
}
int main(void) //主函数
{
init();
while(1)
{
w_string(16,0,"I Love You!");
w_comm(0x01);
delay_ms(1000);
}
}