找回密码
 立即注册

QQ登录

只需一步,快速开始

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

新人求助!!!51单片机1602液晶问题

[复制链接]
跳转到指定楼层
楼主
新人求助!!!各位大侠看看,自定义字符,出问题了。。小弟水平有限,帮帮看看~

#include <reg52.h>                   //自定义字符,出问题了
#define uchar unsigned char
#define uint  unsigned  int

sbit RS=P1^0;
sbit RW=P1^1;
sbit  E=P1^2;
sbit BF=P0^7;

uchar _0C[8]={0X10,0X06,0X09,0X08,0X08,0X09,0X06,0X00};
void delay(uint t)
{
        while (--t);
}

void S_busy()
{
        E=1;
        RS=0;
        RW=1;
        BF=1;
        while(BF);
}

void write_com(uchar com)        //        写指令
{
        E=0;
        RS=0;
        RW=0;
        P0=com;
        delay(100);
        E=1;
        delay(100);
        E=0;

}
void write_cn(uchar cn)                //        写数据
{
        E=0;
        RS=1;
        RW=0;
        P0=cn;
        delay(100);
        E=1;
        delay(100);
        E=0;

}
//void (*Phshu[2])(uchar strin)={write_com,write_cn};
void init ()
{
/*        E=0;
        RS=0;
        RW=0; */
        write_com(0X01);                  //清零
        write_com(0X38);            //设置功能,双行显示,5*7点阵 8位数据接口
        write_com(0X0F);                //显示器开关,显示光标,闪烁光标
//        write_com(0X02);                //光标移动左上角
//        write_com(0X06);                //写完一个数据后,地址光标右移一格整屏不移动
        write_com(0X80);   //设置显示地址
}
void U_define_char (uchar add,uchar *Pc)//地址,内容
{
        uchar i;
        add=0X40+(add<<3);                //地址输入为0~8,实际加上0X40
        for(i=0;i<8;i++)
        {
                write_com(add++);        //地址加1
                write_cn (*Pc++);        //写数据+1
        }
}
void LCD_Dispaly()
{
        

        U_define_char (0,_0C);                //define char
        
        write_cn (0);

}
void main()
{        
       uchar i;
        init();

        E=0;
        for(i=0;i<8;i++)
        {
                write_com(0X40+i);        //地址加1
                delay(100);
                write_cn (_0C);        //写数据+1
                delay(100);
        }
        delay(100);
        write_cn (0X00);
        while(1);
}

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

使用道具 举报

沙发
ID:143967 发表于 2016-10-22 20:30 | 只看该作者
小弟写着写着差点晕了,这是给哪个寄存器写的指令还是数据。。。现在还有两个问题没搞懂,一个是判忙,另一个是使能端EN,查了好多资料和时序图、程序,关于EN的拉高和拉低有不同的说法,郁闷的是还都能运行,大侠指点指点读写时EN的变化。。。
回复

使用道具 举报

板凳
ID:113415 发表于 2016-10-23 07:45 | 只看该作者
你的初始化里面,0x38应当多写几次,只写一次初始化往往不成功。1602运行很慢,单片机则很快,如果随照单片机速度,1602根本来不及反应。操作前,先问问1602忙不忙?答复不忙,再发送,这就是查忙的作用,也可以用延时取代查忙。
     E是使能端,单片机与1602控制器之间的数据交换,都是在E端电平“变化”之中完成的。必须是先高后低、或者先低后高这个转换。至于究竟用哪一个,可以参考1602手册上的介绍。
回复

使用道具 举报

地板
ID:143967 发表于 2016-10-23 10:50 | 只看该作者
baofu 发表于 2016-10-23 07:45
你的初始化里面,0x38应当多写几次,只写一次初始化往往不成功。1602运行很慢,单片机则很快,如果随照单片 ...

嗯,谢谢,谢谢,我现在碰到的问题是,初始化可以,但是执行自定义字符程序的时候,写的指令和数据本该写到那个CGRAM还是CGROM里的,却变成了显示到LCD上面的指令了,现在一个头两个大,查了两天资料程序还是没看懂......帮忙看下我发的指令有问题吗?别人说指令是01xxxccc(x 三位是8个自定义的选择,
c 三个是选择哪一行),然后再发每一行的数据,不知道为什么就是执行完后会变成显示的指令,显示的指令不应该是0X80第一行或0X80+0X40第二行的吗,直接发0X40应该不互相打扰啊?我脑袋思路都不清晰了。。。
回复

使用道具 举报

5#
ID:143967 发表于 2016-10-23 10:55 | 只看该作者
baofu 发表于 2016-10-23 07:45
你的初始化里面,0x38应当多写几次,只写一次初始化往往不成功。1602运行很慢,单片机则很快,如果随照单片 ...

刚回复的不知道去哪了。。。
现在执行完后,全变成了显示的指令,而且是在第二行显示的。。。
回复

使用道具 举报

6#
ID:60379 发表于 2016-10-23 11:01 | 只看该作者
建议看看《51单片机轻松入门-基于STC15W4K系列》书或配套视频,有1602液晶自定义字符与汉字显示的实验演示与程序代码。
回复

使用道具 举报

7#
ID:111634 发表于 2016-10-23 19:10 | 只看该作者
本帖最后由 zl2168 于 2016-10-23 19:19 编辑

实例61  LCD1602显示屏显示
LCD1602显示屏简介
⑴ 引脚功能    …
内部寄存器
1) 数据显示存储器DDRAM。    …
2)既有字符存储器CGROM。   …
3)自定义字符存储器CGRAM。   …
4)地址计数器AC。    …
5)忙标志BF。    …
⑶ 控制指令    …
⑷ 操作时序    …
⒉ 电路设计   
程序设计   
⒋ Keil调试   
Proteus仿真
先Proteus仿真一下,确认有效。
实例61 LCD1602显示屏显示.rar (49.26 KB, 下载次数: 8)

以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。






















































































回复

使用道具 举报

8#
ID:143967 发表于 2016-10-25 22:07 | 只看该作者
zl2168 发表于 2016-10-23 19:10
实例61  LCD1602显示屏显示
⒈ LCD1602显示屏简介
⑴ 引脚功能    …

谢谢,六个字、、、
回复

使用道具 举报

9#
ID:144709 发表于 2016-10-27 10:10 | 只看该作者
你的初始化里面,0x38应当多写几次,只写一次初始化往往不成功。1602运行很慢,单片机则很快,如果随照单片机速度,1602根本来不及反应。操作前,先问问1602忙不忙?答复不忙,再发送,这就是查忙的作用,也可以用延时取代查忙。
     E是使能端,单片机与1602控制器之间的数据交换,都是在E端电平“变化”之中完成的。必须是先高后低、或者先低后高这个转换。至于究竟用哪一个,可以参考1602手册上的介绍。
回复

使用道具 举报

10#
ID:143967 发表于 2016-12-12 23:03 | 只看该作者
囖囖来 发表于 2016-10-27 10:10
你的初始化里面,0x38应当多写几次,只写一次初始化往往不成功。1602运行很慢,单片机则很快,如果随照单片 ...

谢谢呢
回复

使用道具 举报

11#
ID:154568 发表于 2016-12-15 12:50 | 只看该作者
单片机与1602控制器之间的数据交换,都是在E端电平“变化”之中完成的。必须是先高后低、或者先低后高这个转换。至于究竟用哪一个,可以参考1602手册上的介绍。
回复

使用道具 举报

12#
ID:154924 发表于 2016-12-15 12:56 | 只看该作者
好难哦
回复

使用道具 举报

13#
ID:154977 发表于 2016-12-15 13:31 | 只看该作者
先仿真看看
回复

使用道具 举报

14#
ID:153199 发表于 2016-12-16 16:50 | 只看该作者
使能端电平控制不好
回复

使用道具 举报

15#
ID:143967 发表于 2016-12-19 17:45 | 只看该作者
liuzhaoxin1020 发表于 2016-12-16 16:50
使能端电平控制不好

那该怎么优化呢?
回复

使用道具 举报

16#
ID:153199 发表于 2016-12-21 13:33 | 只看该作者
你的初始化里面,0x38应当多写几次,只写一次初始化往往不成功。1602运行MAN
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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