配置:
ATMega16L @3.3V @7.3728MHz
1602B LCD @5.0V @6 lines
Compiler: WinAVR 20060125
#include <avr/io.h>
#define LCD_EN_PORT PORTC
#define LCD_RW_PORT PORTC
#define LCD_RS_PORT PORTC
#define LCD_DATA_PORT PORTA
#define LCD_DATA_DDR DDRA
#define LCD_DATA_PIN PINA
//LCD的 r/w 脚直接接 GND
#define LCD_EN 0x80 //portd7 out
#define LCD_RS 0x40 //portc6 out
#define LCD_DATA 0xF0 //porta 4/5/6/7 out
/*--------------------------------------------------------------------------------------------------
Public function prototypes
--------------------------------------------------------------------------------------------------*/
void LCD_init (void);
void LCD_en_write (void);
void LCD_write_char (unsigned command,unsigned data);
void LCD_set_xy (unsigned char x, unsigned char y);
void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);
void delay_nus (unsigned int n);
void delay_nms (unsigned int n);
void LCD_init(void) //液晶初始化
{
delay_nms(15);
DDRA |= LCD_DATA; // 数据为输出
DDRC |= LCD_RS | LCD_EN; //置位RS.EN
LCD_write_char(0x28,0); //4位显示
LCD_write_char(0x0c,0); //显示开
LCD_write_char(0x01,0); //清屏
delay_nms(60);
}
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y ); //写地址
while (*s) {
LCD_write_char( 0, *s );
s ++;
}
}
void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
{
unsigned char address;
if (y == 0)
address = 0x80 + x;
else
address = 0xc0 + x;
LCD_write_char(address, 0 );
}
void LCD_en_write(void) //液晶使能
{
LCD_EN_PORT |= LCD_EN;
delay_nus(1);
LCD_EN_PORT &= ~LCD_EN;
}
void LCD_write_char(unsigned command,unsigned data) // 写数据
{
unsigned command_temp,data_temp;
command_temp = command;
data_temp = data;
delay_nus(16);
if(command == 0) {
LCD_RS_PORT |= LCD_RS; //RS=1
LCD_DATA_PORT &= 0X0f;
LCD_DATA_PORT |= data_temp & 0xf0; //写高四位
LCD_en_write();
data_temp = data_temp << 4;
LCD_DATA_PORT &= 0X0f;
LCD_DATA_PORT |= data_temp & 0xF0; //写低四位
LCD_en_write();
}
else {
LCD_RS_PORT &= ~LCD_RS; //RS=0
LCD_DATA_PORT &= 0X0f;
LCD_DATA_PORT |= command_temp & 0xF0; //写高四位
LCD_en_write();
command_temp = command_temp << 4;
LCD_DATA_PORT &= 0x0F;
LCD_DATA_PORT |= command_temp & 0xF0; //写低四位
LCD_en_write();
}
}
int main(void)
{
LCD_init();
LCD_write_string(0,0,"Hello,AVR WORLD!!!");
LCD_write_string(0,1,"hitro@tom.com");
while(1);
}
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1356;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}