|
发表于 2010-4-30 08:59:27
|
显示全部楼层
#include <mega16.h>
#include <string.h>
#include <delay.h>
#define LCD_RS PORTB.0
#define LCD_RW PORTB.1
#define LCD_EN PORTB.2
#define LCD_D4 PORTA.4
#define LCD_D5 PORTA.5
#define LCD_D6 PORTA.6
#define LCD_D7 PORTA.7
void LCD_init(void);
void LCD_write_EN(void);
void LCD_write_byte(unsigned char);
void LCD_set_xy(unsigned char,unsigned char);
void LCD_write_char(unsigned char,unsigned char);
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
/*
LCD_init();
LCD_write_string(0,0,str);
for(i=0;i<strlen(str);i++) //一次写一个字符
{
LCD_set_xy(i,1);
LCD_write_char(0,str);
delay_ms(100);
}
*/
//LCD初始化
void LCD_init(void)
{
delay_ms(50);
LCD_write_char(0x30,0);
delay_ms(6);
LCD_write_char(0x30,0);
delay_ms(1);
LCD_write_char(0x30,0); //上电正常显示,无需复位
delay_ms(1);
LCD_write_char(0x02,0);
delay_ms(1);
LCD_write_char(0x28,0); //四位总线模式显示设置,不检测忙信号
delay_ms(1);
LCD_write_char(0x01,0); //显示清屏
delay_ms(1);
LCD_write_char(0x06,0); //显示光标移动设置
delay_ms(1);
LCD_write_char(0x0C,0); //显示开及设置
delay_ms(10);
}
//写数据或命令
void LCD_write_char(unsigned char cd,unsigned char ab)
{
delay_us(20);
if(cd == 0)
{
LCD_RS = 1; //RS=1,写显示内容
LCD_write_byte(ab);
}
else
{
LCD_RS = 0; //RS=0,写命令
LCD_write_byte(cd);
}
}
void LCD_write_byte(unsigned char Wdata)
{
delay_us(50);
PORTA &= 0x0F; //清高四位
PORTA |= (Wdata & 0xF0); //写高四位
LCD_write_EN(); //写数据
delay_us(50);
Wdata <<= 4; //把低四位移到高四位
PORTA &= 0x0F; //清高四位
PORTA |= (Wdata & 0xF0); //写高四位
LCD_write_EN(); //写数据
}
//LCD使能
void LCD_write_EN(void)
{
#asm("nop")
LCD_EN = 1;
#asm("nop")
LCD_EN = 0;
}
//写显示字符
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++;
}
}
//设置LCD地址
void LCD_set_xy(unsigned char X,unsigned char Y)
{
unsigned char address = 0;
if(Y == 0)
{
address = 0x80 + X;
}
else
{
address = 0xC0 + X;
}
LCD_write_char(address,0);
} |
|