找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2829|回复: 9
打印 上一主题 下一主题
收起左侧

求助89C2051驱动不了1602液晶

  [复制链接]
跳转到指定楼层
楼主
ID:219916 发表于 2017-7-15 17:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网上下载的用2051制作电容表,线路连接反复过了,1602始终都是全部显示黑色方块。不知程序有无问题,有俩个程序,一个是ASM文件,另一个是HEX,现在想把求助各位大神:怎么把ASM文件转换成HEX写入单片机?

评分

参与人数 1黑币 +5 收起 理由
cxzycmj + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:196174 发表于 2017-7-15 18:26 | 只看该作者
RS,RW,E这三个接对了吗?
回复

使用道具 举报

板凳
ID:213173 发表于 2017-7-15 18:35 | 只看该作者
液晶屏能显示一排黑块基本证明没有问题,给你一个经过验证的测试程序,根据实际电路重新定义单片机驱动液晶屏I/O口
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS=P3^5;                                        //液晶屏RS口  写指令低,写数据高
sbit LCD_EN=P3^4;                                        //液晶屏EN口  高脉冲使能写指令/数据,低跳变执行
//sbit LCD_W=P3^3;                                        //液晶屏RW口  固定接地,只写不读。
uchar table[] ="0123456789ABCDEF";        //第一行
uchar table1[]="GIJKLMNOPQRSTUVW";        //第二行
/*******100us延时程序********/
void delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=10;b>0;b--);
}
/*******1602液晶屏写指令程序********/
void write_com(uchar com)
{
//        LCD_W=0;        //读/写选择写入
        LCD_EN=0;        //初始设置LCD_EN低电平
        LCD_RS=0;        //允许写指令
        P0=com;                //传递指令
        delay(10);        //延时1ms
        LCD_EN=1;        //使能写入
        delay(10);        //延时1ms
        LCD_EN=0;        //低跳变执行
       
}
/*******1602液晶屏写数据程序********/
void write_date(uchar date)
{
//        LCD_W=0;        //读/写选择写入
        LCD_EN=0;        //初始设置LCD_EN低电平
        LCD_RS=1;        //允许写数据
        P0 =date;        //传递数据
        delay(10);        //延时1ms
        LCD_EN=1;        //使能写入
        delay(10);        //延时1ms
        LCD_EN=0;        //低跳变执行
       
}
/*******1602液晶屏初始化程序********/
void init()                //设置显示模式、
{
        write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
        write_com(0x01);//显示清零,数据指针清零
//        write_com(0x0f);//设置开显示,显示光标,光标闪烁
//        write_com(0x0e);//设置开显示,显示光标,光标不闪
        write_com(0x0c);//设置开显示,不显光标
        write_com(0x06);//设置写一个字符后地址指针加1
//        write_com(0x07);//设置写一个字符后整屏左移
        write_com(0x80);//数据指针初始化,设置显示初始位置
}
/**********************主程序*************************/
void main()
{
        uchar a;                                        //定义循环变量
        init();                                                //初始化程序
/******用for循环按字节逐个写入********/
        write_com(0x80);                        //数据指针第一行起始0x80位置
        for(a=0;a<16;a++)                        //每循环一次写一个字节数据
        {
                write_date(table[a]);        //写一个字节数据               
        }
        write_com(0xc0);                        //数据指针第二行起始位置0x80+0x40=0xc0
        for(a=0;a<16;a++)                        //每循环一次写一个字节数据
        {
                write_date(table1[a]);        //写一个字节数据               
        }
        while(1);
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:82765 发表于 2017-7-15 19:03 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

5#
ID:34643 发表于 2017-7-15 20:39 | 只看该作者
要把把ASM文件转换成HEX文件,你需要下载一个KEIL软件安装有你的电脑中,打开后对ASM程序进行编译,就可以生成HEX文件了。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:151348 发表于 2017-7-15 20:42 | 只看该作者
上图、上程序
回复

使用道具 举报

7#
ID:130231 发表于 2017-7-15 22:03 | 只看该作者
复制ASM文本进编译器就可。编译一下看一看有没有错,再编译成HEX,过程不是很难。不过你上面不是说有HEX文件了吗

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:103441 发表于 2017-7-16 09:48 | 只看该作者
时序有没有问题?
回复

使用道具 举报

9#
ID:200650 发表于 2017-7-16 12:44 | 只看该作者
调试时多数情况是程序问题
回复

使用道具 举报

10#
ID:199329 发表于 2017-7-17 09:23 | 只看该作者
  1. //简单的1602测试程序
  2. //rs,rw,en根据自己的实际情况进行修改
  3. #include<reg52.h>
  4. typedef  unsigned char uchar;
  5. typedef        unsigned int uint;

  6. sbit         RS = P3^5;//数据/命令选择端
  7. sbit        RW = P3^6;//读/写数据端
  8. sbit        EN = P3^4;//使能端

  9. //检测液晶是否繁忙
  10. void Read_Busy()
  11. {
  12.         uchar busy;
  13.         P0 = 0XFF;
  14.         RS = 0;
  15.         RW = 1;
  16.         do
  17.         {
  18.                 EN = 1;
  19.                 busy = P0;
  20.                 EN=0;
  21.         }while(busy & 0X80);
  22. }

  23. //写指令
  24. void Write_Cmd(uchar cmd)
  25. {
  26.         Read_Busy();
  27.         RS = 0;
  28.         RW = 0;
  29.         P0 = cmd;
  30.         EN = 1;
  31.         EN = 0;
  32. }

  33. //写入数据
  34. void Write_Dat(uchar dat)
  35. {
  36.         Read_Busy();
  37.         RS = 1;
  38.         RW = 0;
  39.         P0=dat;
  40.         EN=1;
  41.         EN=0;
  42. }

  43. //主函数
  44. void main()
  45. {
  46.         uchar *p;
  47.         uchar a[] = {"Hello Worldi"};

  48.        
  49.         Write_Cmd(0X38);//显示设置
  50.         Write_Cmd(0x0f);//开显示
  51.         Write_Cmd(0X01);//清屏
  52.        
  53.         Write_Cmd(0x06);
  54.         Write_Cmd(0x80 | 0x00);
  55.         p=a;
  56.         while(*p != '\0')
  57.         {
  58.                 Write_Dat( *p++);
  59.         }       
  60.        
  61.         while(1);
  62. }
复制代码










回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表