1602的四线访问

     最近闲着没事,为手头上的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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值