2476|6

16

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于1602液晶显示 [复制链接]


关于1602液晶显示,第一行的最后个字符显示不出来,第二行第一个字符为杂符,代码,图片如下
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar string[]={"I am pengfa"};
uchar string1[]={"good men"};
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit BF=P0^7;
/*1ms延时函数*/
void delay1ms(void)
{
  uchar i,j;
  for(i=100;i>0;i--)
   for(j=7;j>0;j--);
}
/* 1ms延时函数的调用*/
void delay(uchar i)
{

FFC0CDA2982A9C324BCAE633ECF52A3F.jpg (47.63 KB, 下载次数: 0)

FFC0CDA2982A9C324BCAE633ECF52A3F.jpg
此帖出自单片机论坛

最新回复

有两点建议 一。   while(string!='\0')   //改用 while(string!='\0') 更合理,string1 同样 二。              sendaddress(0x01);//清屏  清屏指令的执行需要一段时间,建议后面跟一条 20ms左右的延时        ps. 既然第一行显示之后你都清屏了,为何还能做到两行都显示?!     这段代码不算长,但是看着有点累,建议命名、格式再调整下  详情 回复 发表于 2015-4-6 23:22
点赞 关注
 

回复
举报

1972

帖子

1

TA的资源

五彩晶圆(初级)

沙发
 
能显示说明液晶初始化没有什么错误,但是显示异常的话,你要看看显示字符串的函数调用是否正确
此帖出自单片机论坛
 
 

回复

315

帖子

8

TA的资源

一粒金砂(中级)

板凳
 
程序也没给全,怎么帮你看~。可以确定是,肯定程序有错误~
此帖出自单片机论坛

点评

#include #include #define uint unsigned int #define uchar unsigned char uchar string[]={"I am pengfa"}; uchar string1[]={"good men"}; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; /  详情 回复 发表于 2015-4-6 20:44
 
个人签名给生活一个梦想,给奋斗一个方向!---淘宝搜索逸嵌电子工作室
 
 

回复

405

帖子

1

TA的资源

一粒金砂(高级)

4
 
呃,能贴个完整程序吗,可能是显示地址的问题吧
此帖出自单片机论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

5
 
flashtt 发表于 2015-4-6 20:36
呃,能贴个完整程序吗,可能是显示地址的问题吧

#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar string[]={"I am pengfa"};
uchar string1[]={"good men"};
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit BF=P0^7;
/*1ms延时函数*/
void delay1ms(void)
{
  uchar i,j;
  for(i=100;i>0;i--)
   for(j=7;j>0;j--);
}
/* 1ms延时函数的调用*/
void delay(uchar i)
{
        for(i;i>0;i--)
        {
                delay1ms();
        }
}
/*判断忙信号*/
uchar zero(void)
{  

        RS=0;         //读取忙信号
        RW=1;
        E=1;
         _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();
        return BF;
}
/*写命令函数*/
void sendaddress(uchar i)
{

  while(zero()==1);
  RS=0;
  RW=0;
  E=0;
  P0=i;
   _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();
  E=1;
   _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();
  E=0;

}
/*写数据函数*/
void senddate(uchar i)
{

  while(zero()==1) ;
  RS=1;
  RW=0;
  E=0;
  P0=i;
  _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();
  E=1;
   _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();
  E=0;


}
/*写地址函数*/
void writeaddress(uchar i)
{
  sendaddress(i|0x80) ;        //设定DDRAM地址,字符显示地址
}
/*1602液晶初始状态设置*/
void setup1602(void)
{
  delay(20);
  sendaddress(0x38);//8位数据总线 显示两行 5*7点阵DB7~DB0 0011 1000
  delay(3);
   sendaddress(0x38);
   delay(3);
  sendaddress(0x0f);//光标右移一格 AC加一 0000 1000
  delay(3);
  sendaddress(0x06);//写入数据后光标右移
     delay(3);
  sendaddress(0x01);//清屏
  delay(3);       
}

void main()
{
   uchar i;
   setup1602();

        sendaddress(0x01); //先清屏
        writeaddress(0x00);//从00H开始显示
   i=0;
   while(string!='\0')
   {
      senddate(string);
                            i++;
                        delay(500);
          }
        writeaddress(0x40);//从40H处开始显示
        sendaddress(0x01);//清屏
        i=0;
        while(string1!='\0')
        {                                                       
          senddate(string1);
          i++;
          delay(500);
        }
while(5000);
}

谢谢了

此帖出自单片机论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

6
 
奋斗吧小鱼儿 发表于 2015-4-6 18:41
程序也没给全,怎么帮你看~。可以确定是,肯定程序有错误~

#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar string[]={"I am pengfa"};
uchar string1[]={"good men"};
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit BF=P0^7;
/*1ms延时函数*/
void delay1ms(void)
{
  uchar i,j;
  for(i=100;i>0;i--)
   for(j=7;j>0;j--);
}
/* 1ms延时函数的调用*/
void delay(uchar i)
{
        for(i;i>0;i--)
        {
                delay1ms();
        }
}
/*判断忙信号*/
uchar zero(void)
{  

        RS=0;         //读取忙信号
        RW=1;
        E=1;
         _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();
        return BF;
}
/*写命令函数*/
void sendaddress(uchar i)
{

  while(zero()==1);
  RS=0;
  RW=0;
  E=0;
  P0=i;
   _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();
  E=1;
   _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();
  E=0;

}
/*写数据函数*/
void senddate(uchar i)
{

  while(zero()==1) ;
  RS=1;
  RW=0;
  E=0;
  P0=i;
  _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();
  E=1;
   _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();
  E=0;


}
/*写地址函数*/
void writeaddress(uchar i)
{
  sendaddress(i|0x80) ;        //设定DDRAM地址,字符显示地址
}
/*1602液晶初始状态设置*/
void setup1602(void)
{
  delay(20);
  sendaddress(0x38);//8位数据总线 显示两行 5*7点阵DB7~DB0 0011 1000
  delay(3);
   sendaddress(0x38);
   delay(3);
  sendaddress(0x0f);//光标右移一格 AC加一 0000 1000
  delay(3);
  sendaddress(0x06);//写入数据后光标右移
     delay(3);
  sendaddress(0x01);//清屏
  delay(3);       
}

void main()
{
   uchar i;
   setup1602();

        sendaddress(0x01); //先清屏
        writeaddress(0x00);//从00H开始显示
   i=0;
   while(string!='\0')
   {
      senddate(string);
                            i++;
                        delay(500);
          }
        writeaddress(0x40);//从40H处开始显示
        sendaddress(0x01);//清屏
        i=0;
        while(string1!='\0')
        {                                                       
          senddate(string1);
          i++;
          delay(500);
        }
while(5000);
}

谢谢了

此帖出自单片机论坛
 
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

7
 
有两点建议

一。   while(string!='\0')   //改用 while(string[i]!='\0') 更合理,string1 同样

二。     
        sendaddress(0x01);//清屏  清屏指令的执行需要一段时间,建议后面跟一条 20ms左右的延时
      
ps. 既然第一行显示之后你都清屏了,为何还能做到两行都显示?!
    这段代码不算长,但是看着有点累,建议命名、格式再调整下
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表