找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD1602问题,数据位用不同的IO口,屏幕不显示

[复制链接]
跳转到指定楼层
楼主
ID:188935 发表于 2017-9-8 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5黑币
一、下面是LCD1602在单片机上的IO口位置定义
#define   LCDEN      FP13   //使能位
#define   LCDRW     FP12
#define   LCDRS      FP54
#define   LCDDAT0   FP20  //数据位0 在io口P20上
#define   LCDDAT1   FP21  //数据位1 在io口P21上
#define   LCDDAT2   FP22  //数据位2 在io口P22上
#define   LCDDAT3   FP23  //数据位3 在io口P23上
#define   LCDDAT4   FP24  //数据位4 在io口P24上
#define   LCDDAT5   FP25  //数据位5 在io口P25上
#define   LCDDAT6   FP00  //数据位6 在io口P00上
#define   LCDDAT7   FP10  //数据位7 在io口P10上

二、下面是我的程序
void Read_state(void)
{       
        P2 = 0x3f;
        P0 = 0x01;
        P1 = 0x02;
        LCDRS = 0;
        LCDRW = 1;
        do
        {
                LCDEN = 1;
                LCDEN = 0;
        }
        while(LCDDAT7);
}
void Writer_Cmd(uchar cmd)
{
        Read_state();
        LCDRS = 0;
        LCDRW = 0;
        P2 = cmd & 0x3f;
        P0 = (cmd & 0x40) >> 6;
        P1 = (cmd & 0x80) >> 7;
        LCDEN = 1;
        LCDEN = 0;
}
void Writer_Dat(uchar dat)
{
        Read_state();
        LCDRS = 1;
        LCDRW = 0;
        P2 = dat & 0x3f;
        P0 = (dat & 0x40) >> 6;
        P1 = (dat & 0x80) >> 7;
        LCDEN = 1;
        LCDEN = 0;
}
void LCD_Init(void)
{
        Writer_Cmd(0x38);  
        Writer_Cmd(0x0f);  
        Writer_Cmd(0x01);  
        Writer_Cmd(0x06);  
        Writer_Cmd(0x80|0x06);  
}
void main(void)
{
        LCD_Init();
        Writer_Dat('a');
        while(1);
}


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

使用道具 举报

沙发
ID:213173 发表于 2017-9-8 15:42 | 只看该作者
本帖最后由 wulin 于 2017-9-8 16:04 编辑

这是我在4*4矩阵键盘上用的异组端口组成的8位数据读/写程序,同样适合驱动数码管、液晶屏。你试试。另外你写的读/写程序中要按照时序要求加入适当的延时,否则时序不符合要求也不能正常显示。
sbit code0=P2^0;                //端口定义
sbit code1=P2^1;
sbit code2=P2^2;
sbit code3=P2^3;
sbit code4=P2^4;
sbit code5=P2^5;
sbit code6=P0^0;
sbit code7=P1^0;

void PX(unsigned char i)        //写8位数据
{   
    code0=i&0x01;i>>=1;        
    code1=i&0x01;i>>=1;
    code2=i&0x01;i>>=1;
    code3=i&0x01;i>>=1;
    code4=i&0x01;i>>=1;
    code5=i&0x01;i>>=1;
    code6=i&0x01;i>>=1;
    code7=i&0x01;
}
unsigned char PD()                                //读8位数据
{
        uchar i;
        i=code7;
        i=(i<<1)|code6;
        i=(i<<1)|code5;
        i=(i<<1)|code4;
        i=(i<<1)|code3;
        i=(i<<1)|code2;
        i=(i<<1)|code1;
        i=(i<<1)|code0;
        return i;
}

评分

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

查看全部评分

回复

使用道具 举报

板凳
ID:229073 发表于 2017-9-9 11:36 | 只看该作者
每一个IO口置高,再置低,一步一步测试,确定IO口没有错。然后再按照规格书,对一对指令。
回复

使用道具 举报

地板
ID:188935 发表于 2017-9-14 08:46 | 只看该作者
无名无姓 发表于 2017-9-9 11:36
每一个IO口置高,再置低,一步一步测试,确定IO口没有错。然后再按照规格书,对一对指令。

指令没有错啊,只是单片机不一样,会不会是单片机指令周期和晶振频率不一样引起来的?
回复

使用道具 举报

5#
ID:188935 发表于 2017-9-14 08:49 | 只看该作者
wulin 发表于 2017-9-8 15:42
这是我在4*4矩阵键盘上用的异组端口组成的8位数据读/写程序,同样适合驱动数码管、液晶屏。你试试。另外你 ...

那可能是时序问题,我当时用的51单片机可以,现在用的松翰的,然后移植过来,只是数据线不在同一IO口上,就不显示
回复

使用道具 举报

6#
ID:233083 发表于 2017-9-14 13:12 | 只看该作者
这种一般看下时序可以解决,还有就是注意IO口有没有复用功能。
回复

使用道具 举报

7#
ID:89515 发表于 2017-9-14 16:51 | 只看该作者
        P2 = dat & 0x3f;
         P0 = (dat & 0x40) >> 6;
         P1 = (dat & 0x80) >> 7;
这个是在干什么?这款单片机支持位操作吗?如果你是为了把其他口独立出来
       P2 |= dat & 0x3f;
         P0| = (dat & 0x40) >> 6;
         P1 |= (dat & 0x80) >> 7;
不然其他口在这里被清零
回复

使用道具 举报

8#
ID:89515 发表于 2017-9-14 16:55 | 只看该作者
还有把忙检测改成延时试试
回复

使用道具 举报

9#
ID:188935 发表于 2017-9-18 16:27 | 只看该作者
mengzhixinheng 发表于 2017-9-14 16:51
P2 = dat & 0x3f;
         P0 = (dat & 0x40) >> 6;
         P1 = (dat & 0x80) >> 7;

这些IO口都用上了
回复

使用道具 举报

10#
ID:188935 发表于 2017-9-18 16:28 | 只看该作者
mengzhixinheng 发表于 2017-9-14 16:55
还有把忙检测改成延时试试

其他写指令等等也要延时吧?
回复

使用道具 举报

11#
ID:38658 发表于 2024-1-16 15:44 | 只看该作者
P1=0X01,第一个串口,而不是0X02。
回复

使用道具 举报

12#
ID:1080331 发表于 2024-1-20 11:06 | 只看该作者
如果你的LCD1602屏幕没有显示任何内容,可能有以下几个可能的原因:  引脚连接错误:请确保LCD1602的各个引脚正确连接到单片机的IO口上,确认每个数据位和控制引脚连接的IO口是否与你提供的定义一致。  电源问题:确保LCD1602正常供电。检查电源线是否正确连接并提供适当的电压。  初始化过程错误:请再次确认你的初始化代码是否正确。在 LCD_Init() 函数中发送了一系列的初始化命令,确保这些命令按照正确的顺序和参数发送给LCD1602。如果初始化过程有误,LCD1602可能无法正常工作。  忙状态检测错误:在 Read_state() 函数中,你使用了忙状态检测来等待LCD1602完成之前的操作。请确保你的忙状态检测代码正确,并且等待足够的时间让LCD1602完成操作。  数据写入错误:请检查你使用的 Writer_Dat() 函数,确保它正确设置了数据位以及控制引脚的状态,并且在写入数据之前等待LCD1602完成之前的操作。  如果你检查了以上问题仍然无法解决,可以尝试调试代码或使用示波器等工具来观察信号线上的波形,以确定是否正确发送了数据和命令。  希望这些提示能够帮助你解决问题。如果你需要进一步的帮助,请提供更多细节或代码片段,我将尽力协助你。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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