找回密码
 立即注册

QQ登录

只需一步,快速开始

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

Proteus仿真LM016L无法显示字符,P0脚电平悬空,重建工程之后电平不悬空,但依然无...

[复制链接]
跳转到指定楼层
楼主

1. 这是代码和运行结果
1.lcd.c

#include "lcd.h"
#include "lcd.h"
/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能                   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/


void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
            
}


/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能                   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************!
************/
void LcdWriteCom(uchar com)          //写入命令
{
        LCD1602_E = 0;     //使能
        LCD1602_RS = 0;           //选择发送命令
        LCD1602_RW = 0;           //选择写入
        
        LCD1602_DATAPINS = com;     //放入命令
        Lcd1602_Delay1ms(1);                //等待数据稳定


        LCD1602_E = 1;                  //写入时序
        Lcd1602_Delay1ms(5);          //保持时间
        LCD1602_E = 0;
}


/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能                   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/                              
void LcdWriteData(uchar dat)                        //写入数据
{
        LCD1602_E = 0;        //使能清零
```


```
        LCD1602_RS = 1;        //选择输入数据
        LCD1602_RW = 0;        //选择写入


        LCD1602_DATAPINS = dat; //写入数据
        Lcd1602_Delay1ms(1);


        LCD1602_E = 1;   //写入时序
        Lcd1602_Delay1ms(5);   //保持时间
        LCD1602_E = 0;
}


/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能                 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/                  
void LcdInit()                                                  //LCD初始化子程序
{
         
        LcdWriteCom(0x3f);  //开显示
        Lcd1602_Delay1ms(1);
        LcdWriteCom(0x0c);  //开显示不显示光标
        Lcd1602_Delay1ms(1);
        LcdWriteCom(0x06);  //写一个指针加1
        Lcd1602_Delay1ms(1);
        LcdWriteCom(0x01);  //清屏
        Lcd1602_Delay1ms(1);
        LcdWriteCom(0x80);  //设置数据指针起点
        Lcd1602_Delay1ms(1);
        


}


2.lcd.h


#ifndef __LCD_H_
#define __LCD_H_
/**********************************


**********************************/
//#define LCD1602_4PINS


/**********************************
包含头文件
**********************************/
#include <REG52.H>
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif


#ifndef uint
#define uint unsigned int
#endif


/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;


/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);   //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/        
void LcdWriteData(uchar dat)        ;
/*LCD1602初始化子程序*/               
void LcdInit();                                                  


#endif
3.main.c


/**************************************************************************************
*                              LCD1602液晶显示实验                                                                                                                                                                                                                                                                    
***************************************************************************************/
#include <REG52.H>
                 //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;


u8 Disp[12]="HELLO WORLD";
/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{
        u8 i;
        //P1=0X0f;
        LcdInit();
        LcdWriteCom(0x80);
        LcdWriteCom(0x80);
        for(i=0;i<11;i++)
        {
                LcdWriteData(Disp[ i]);
        }        
        while(1);
}
4.运行结果
5,换引脚之后的结果
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:267719 发表于 2020-6-5 09:06 | 只看该作者
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
如果数据口是P0 那么对应下面那张图。结果看是高阻。(因为EA接了高电平,执行片内程序EA应该为0)

对应上面那张图,那就应
#define LCD1602_DATAPINS P1
sbit LCD1602_E=P2^2;
sbit LCD1602_RW=P2^1;
sbit LCD1602_RS=P2^0;

硬件变更就该考虑是否软件代码需要变更。
回复

使用道具 举报

板凳
ID:769643 发表于 2020-6-5 15:25 | 只看该作者
carpcarey 发表于 2020-6-5 09:06
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;

软件一直是随着硬件变更的,但LCD都不显示
回复

使用道具 举报

地板
ID:769643 发表于 2020-6-5 15:36 | 只看该作者
/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P1
sbit LCD1602_E=P2^2;
sbit LCD1602_RW=P2^1;
sbit LCD1602_RS=P2^0;

51hei截图20200605153450.jpg (147.11 KB, 下载次数: 44)

51hei截图20200605153450.jpg
回复

使用道具 举报

5#
ID:769643 发表于 2020-6-5 15:38 | 只看该作者
程序运行结果如下

51hei截图20200605153803.jpg (136.15 KB, 下载次数: 45)

51hei截图20200605153803.jpg
回复

使用道具 举报

6#
ID:267719 发表于 2020-6-12 08:45 | 只看该作者

对应以上电路,把源码贴下。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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