打印
[AVR单片机]

lcd2004一行只显示了16个字符,不知问题在哪

[复制链接]
1862|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangwo|  楼主 | 2010-2-23 20:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不知是初始化还是字符编码的问题#include <avr/io.h>
#include <util/delay.h>

void delay_ms(void)     //1ms延时函数
{   
  _delay_loop_2(92); // 16-bit count,4 cycles/loop

  }                       

/*-------------------------------------*/
  
void delay_nms(unsigned int n)     //N ms延时函数
  {
    unsigned int i=0;
    for (i=0;i<n;i++)
    delay_ms();
  }
//=======================================================
//微秒级延时程序
void delay_us()
{
  _delay_loop_1(1);   //3个时钟周期
}

//读取lcd是否内部操作(忙碌)状态
int Lcd_Busy()
{   int r;
   DDRC=0X00;     //端口设为输入方式
  DDRB|=(1<<0)|(1<<1)|(1<<2);
   PORTB&=~(1<<0);//e=0;
  PORTB&=~(1<<2);//rs=0
  PORTB|=(1<<1); //rw=1
  
  delay_us();     
  PORTB|=(1<<0);//e=1;
  delay_us();     
  r = PINC & 0x08;   //读取lcd_data第八位
  PORTB&=~(1<<0);// e=0;
  DDRC=0xff;       //端口设为输出方式
  return r;       //读取结果返回
}

//=======================================================
//向Lcd发送命令程序
void Lcd_Command(unsigned char Command)
{   
  
  
  //while(Lcd_Busy()); //判断lcd是否内部操作状态
  DDRB|=(1<<0)|(1<<1)|(1<<2);
   DDRC=0xff;
   //PORTB&=~(1<<0);//e=0;
   PORTB&=~(1<<2);//rs=0;
  PORTB&=~(1<<1);//rw=0;
  delay_us();     
  
  PORTC&=0xf0;
   delay_us();
   PORTB|=(1<<0);//e=1;
  PORTC=(Command>>4)&0x0f; //写数据高
   delay_us();
   PORTB|=(1<<0);//e=1;
  
  delay_nms(5);
  PORTB&=~(1<<0);//e=0;
  
   PORTC&=0xf0;
   delay_us();
   //PORTB&=~(1<<0);//e=0;
  PORTC=Command&0x0f; //写数据低位
  delay_us();
  
   PORTB|=(1<<0);//e=1;
   delay_nms(5);     
  PORTB&=~(1<<0);//e=0;
}

//=======================================================
//向lcd写入一个字符程序
void Lcd_Write(unsigned char Data)
{   
  while(Lcd_Busy()); //判断lcd是否内部操作状态
  DDRB|=(1<<0)|(1<<1)|(1<<2);
   DDRC=0xff;
   //PORTB&=~(1<<0);//e=0;
   PORTB|=(1<<2);//rs=1;
  PORTB&=~(1<<1);//rw=0;
  delay_us();     //液晶延时子程序
  
  PORTC&=0xf0;
   delay_us();
   
  PORTC=(Data>>4)&0x0f; //写数据高
   delay_us();
   PORTB|=(1<<0);//e=1;
  delay_nms(5);
   PORTB&=~(1<<0);//e=0;
  
  
   PORTC&=0xf0;
   delay_us();
   
  PORTC=Data&0x0f; //写数据低位
  delay_us();
   PORTB|=(1<<0);//e=1;
   delay_nms(5);     //液晶延时子程序
  PORTB&=~(1<<0);//e=0;
   
}



/*=======================================================
LCD第1行显示地址1~20(0x80~0x93)
LCD第2行显示地址1~20(0xc0~0xd3)
LCD第3行显示地址1~20(0x94~0xa7)
LCD第4行显示地址1~20(0xd4~0xe7)
=======================================================*/
//初始化LCD_8位接口,4行x20字符的工作方式 */
void Lcd_Init(void)
{   
  
  DDRD|=(1<<4);
  PORTD|=(1<<4); //bl=1   
   DDRB|=(1<<0);
   PORTB&=~(1<<0);//e=0;   
  
   Lcd_Command(0x01); //清除显示器   
  delay_ms();
   //Lcd_Command(0x02); //归位
  delay_ms();
   
   Lcd_Command(0x28); // 四线 双行
   delay_ms();
   
   DDRB|=(1<<0);
   PORTB|=(1<<0);//e=1;
   delay_ms();
   PORTB&=~(1<<0);//e=0;
   Lcd_Command(0x06); //令LCD每接收到1Byte数据后,AC自动加1
  delay_ms();
   Lcd_Command(0x0c); //开显示
   
  
   delay_ms();
  // Lcd_Command(0x80);
   
   
}
/*void asc_tran(int *asc)
{   delay_nms(100);
  while((*asc) != 0)   //判断字是否结束
  { delay_nms(100);
    Lcd_Write(*asc); //向lcd写入字符串
    asc++;       //移下一个字符
  }
} */

//=======================================================
//测试主LCD主程序
int main(void)
{ int i;
while(1)
{ Lcd_Init(); //初始化LCD
  
  for(i=0;i<20;i++)
  {
    Lcd_Command(0x80);
  Lcd_Write(0x31);
   
  }               //连续显示20个1
      
  delay_nms(1000);             //延迟1秒
  Lcd_Command(0x01);           //清除显示器
  }

   
  
}

相关帖子

沙发
wangwo|  楼主 | 2010-3-1 22:55 | 只看该作者
老早就问了,还是没人说话。看来大家都不会看这种贴

使用特权

评论回复
板凳
lenceliu| | 2020-3-17 09:44 | 只看该作者
wangwo 发表于 2010-3-1 22:55
老早就问了,还是没人说话。看来大家都不会看这种贴

你好歹把问题描述清楚一点,或者贴个图,也好让别人结合代码帮你找问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

806

帖子

2

粉丝