最近闲着没事,为手头上的1602写了个4根数据线访问的驱动。虽然用CVAVR可以很方便的生成含有1602的驱动的库文件,但自己单独尝试编写一个驱动,亦有一种莫名的快乐。呵呵。。。
#include <mega128.h>
#include <delay.h>
////////////////actrl_port 为控制口 共3位/////////////////
///////////////adata_port 为数据口 共8位/////////////////
//////////RS:寄存器选择位 1:选择数据寄存器 0:选择指令寄存器
//////////RW:读写选择位 1:读 0:写
//////////EN:使能位 1:LCM可读写 0:LCM禁止读写
#define aLCM_RS_1 (PORTB|=(1<<0))
#define aLCM_RS_0 (PORTB&=(~(1<<0)))
#define aLCM_RW_1 (PORTB|=(1<<1))
#define aLCM_RW_0 (PORTB&=(~(1<<1)))
#define aLCM_EN_1 (PORTB|=(1<<2))
#define aLCM_EN_0 (PORTB&=(~(1<<2)))
#define uchar unsigned char
void alcd_write_data(unsigned char dataw);
void alcd_write_command(unsigned char CMD);
void ainit_lcd(void);
void adisplay_one_char(unsigned char x,unsigned char y,unsigned char wdata);
void main()
{ unsigned char i;
delay_ms(100);
DDRB=0XFF;
ainit_lcd();
for(i=0;i<16;i++)adisplay_one_char(i,0,'A');
for(i=0;i<16;i++)adisplay_one_char(i,1,'A');
while(1);
}
void alocateXY(char posx,char posy)
{
unsigned char temp;
if(posy)temp=0xc0+posx;
temp|=0x80+posx;
alcd_write_command(temp);
}
//*******************显示指定座标的一个字符子函数*******************
void adisplay_one_char(uchar x,uchar y,uchar wdata)
{
alocateXY(x,y);
alcd_write_data(wdata);
delay_ms(10);
}
//*******************LCD初始化子函数*********************
void ainit_lcd(void)
{
char i;
for(i=0;i<3;i++)
{
alcd_write_command(0x28);
delay_us(140);
}
aLCM_EN_1;
delay_us(30);
aLCM_EN_0;
delay_us(140);
alcd_write_command(0x28);
alcd_write_command(0x0c);
alcd_write_command(0x01);
delay_ms(10);
}
//********************写命令到LCM子函数********************
void alcd_write_command(uchar CMD)
{
delay_ms(10);
aLCM_RS_0;aLCM_RW_0;
aLCM_EN_1;
delay_us(5);
PORTB&=0x0f;
PORTB|=((CMD)&0xf0);
delay_us(5);
aLCM_EN_0;
delay_us(5);
aLCM_EN_1;
delay_us(5);
PORTB&=0x0f;
PORTB|=((CMD<<4)&0xf0);
delay_us(5);
aLCM_EN_0;
}
//*******************写数据到LCM子函数********************
void alcd_write_data(uchar dataw)
{
delay_ms(10);
aLCM_RS_1;
aLCM_RW_0;
aLCM_EN_1;
delay_us(5);
PORTB&=0x0f;
PORTB|=((dataw)&0xf0);
delay_us(5);
aLCM_EN_0;
delay_us(5);
aLCM_EN_1;
delay_us(5);
PORTB&=0x0f;
PORTB|=((dataw<<4)&0xf0);
delay_us(5);
aLCM_EN_0;
}