找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

各位大神可以帮我看看吗为什么1602显示屏显示不出数值呀

查看数: 3371 | 评论数: 12 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-12-21 10:56

正文摘要:

程序在这里 #include<reg51.h> #include "intrins.h" #define uchar unsigned char #define uint unsigned int typedef unsigned char  U8;       /* defined for un ...

回复

ID:517466 发表于 2021-1-4 11:04
附上我已经测试过的代码,使用STC89C52,11.0592晶振.
# include <reg52.h>
# include <intrins.h>


typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long ulong;
typedef bit BOOL;

#define PDATA P2
sbit rs=P0^7;
sbit rw=P0^6;
sbit ep=P0^5;

// 延时
void delay (ulong m) {
        while(m--);
}

// 判断1602是否处于忙状态
BOOL lcd_bz() {
        BOOL result;
        rs=0;           // 读忙信号
        rw=1;
        ep=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        result = (BOOL)(PDATA&0x80);
        ep=0;
        result ;
}

// 向1602写指令
void lcd_wcmd (BYTE cmd) {
        while (lcd_bz());
        rs=0;
        rw=0;
        ep=0;
        _nop_();
        _nop_();
        PDATA=cmd ;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep=0;
}
// 设置显示位置:80H+ 地址码( 0-27H ,40H-67H)
void lcd_pos (BYTE pos) {
          lcd_wcmd (pos|0x80);
}

// 向1602写数据
void lcd_wdat (BYTE dat) {
        while (lcd_bz());
        rs=1;
        rw=0;
        ep=0;
        _nop_();
        _nop_();
        PDATA=dat ;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep=0;
}

// 液晶的初始化处理
void lcd_init () {
        lcd_wcmd (0x38);
        delay(1200);
        lcd_wcmd (0x0c);
        delay(1200);
        lcd_wcmd (0x06);
        delay(1200);
        lcd_wcmd (0x01);
        delay(1200);
}
ID:517466 发表于 2021-1-4 10:59
本帖最后由 suncat0504 于 2021-1-4 11:08 编辑

楼主啊,你使用的开发板,明明是使用P2口作为数据线提供给液晶,P0.7,P0.6,P0.5作为控制线。而你的程序你确实用P2.7,P2.6,P2.5作为控制线,P0做数据口,又怎么可能会成功呢?
你修改这部分代码:
sbit  rs=P2^5;                ==》sbit rs=P0^7;                                             
sbit  rw=P2^6 ;              ==》sbit rw=P0^6;                              
sbit  e=P2^7;                 ==》sbit e=P0^5;

你使用YL-39开发板,一定要牢记这个开发板的口线分配,在编程时一定要和程序严格匹配,否则肯定会出错的。
另外再修改数据传递语句:
P0 = zhilin ;   ==> P2=zhilin;
P0 = suzi ;    ==>  P2 = suzi ;

另外使用过程中,注意各个跳线的设置。有些功能需要通过短路/断开跳线才能正常执行。
ID:390416 发表于 2021-1-4 10:11
看这个贴子   单片机+LCD1602显示℃ 这种自定义符号 www.51hei.com/bbs/dpj-200685-1.html
你把595 改成P0口 就行了   
ID:864507 发表于 2021-1-4 09:22
wwh2382 发表于 2020-12-22 11:04
1602的数据口没有定义吧,楼下帮你定义了P0

可以帮我看看问题出在哪吗?
ID:864507 发表于 2021-1-4 09:22
wwh2382 发表于 2020-12-22 11:04
1602的数据口没有定义吧,楼下帮你定义了P0

#include<reg51.h>
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int
typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           */
typedef unsigned int   U16;


sbit  rs=P2^5;                                             
sbit  rw=P2^6 ;                                             
sbit  e=P2^7;
sbit ADCS =P3^5;  //ADC0832 chip seclect
sbit ADDI =P3^7;  //ADC0832 k in
sbit ADDO =P3^7;  //ADC0832 k out
sbit ADCLK =P3^6;  //ADC0832 clock signal

unsigned int temp;
unsigned char dispbuf[4];
uchar getdata;


void Delay(U16 j)
{      
U8 i;
for(;j>0;j--)
{        
for(i=0;i<27;i++);
}
}
//1602D′Ö¸áîoˉêy
void xiezhilin(uchar zhilin)
{      
        rs = 0 ;
          rw = 0 ;
          e = 0 ;
          P0 = zhilin ;
        Delay(100);
          e = 1 ;
        Delay(100);
          e = 0 ;
}
//1602D′êy¾Yoˉêy
void xiesu(uchar suzi)
{      
         rs = 1 ;
          rw = 0 ;
          e = 0 ;
          P0 = suzi ;
    Delay(100);
          e = 1 ;
          Delay(100);
          e = 0 ;
}
//1602¿ØÖÆÏÔê¾oˉêy
void xianshi(uchar dizhi, uchar suzi)
{
   xiezhilin(dizhi);
   xiesu(suzi);
}
//×a»»3é¿éòÔÔú1602ÏÔê¾μÄêyÖμ
void LCDdisplay(void)
{
          xianshi(0x80+0,'V');
          xianshi(0x80+1,'a');
                xianshi(0x80+2,'l');
                xianshi(0x80+3,'u');
          xianshi(0x80+4,'e');
          xianshi(0x80+5,':');
          xianshi(0x80+6,0x30+dispbuf[2]);
          xianshi(0x80+7,0x30+dispbuf[1]);
          xianshi(0x80+8,0x30+dispbuf[0]);
          xianshi(0x80+9,'G');
          xianshi(0x80+10,'E');
          xianshi(0x80+11,'\0');
}
ID:748788 发表于 2020-12-22 11:04
1602的数据口没有定义吧,楼下帮你定义了P0
ID:226055 发表于 2020-12-22 09:08
还要考虑是不是硬件问题,比如你的LCD1602屏坏了
ID:864507 发表于 2020-12-21 15:56
名字不是重点 发表于 2020-12-21 11:36
你的MAIN中,没有LCD的初始化,如何能显示?
LCD1602初始化没成功,显示出来就是象你这样的图形。

我已经初始化了呀?还是显示不出来而且仿真是没有问题的
ID:226055 发表于 2020-12-21 13:58
    1、你使用的应该是开发板吧,开发板提供的肯定有LCD1602的例程。
    2、下载提供的例程看下能不能显示,这主要是为了判断你的硬件是不是好的。
    1)例程指软件,开发板配套的例程肯定都是被很多人验证过的,理论上是没有问题的。
    2)你手头的板子是硬件,出厂有无检验不知道,即使检验了,路上运输可能造成不良。
    3、LCD1602屏对供电有要求,一般是5V供电的。看你单片机是早期的STC89C52系列的吧,所以供电不存在选择其他电压,因为这个单片机就是5V供电的。
    4、LCD1602屏显示还需要调节对比度的,一般都是针对屏VO引脚,外接可调电阻实现。但初步看你的现象,应该是调节了的,因为有阴影出现,只是没有确切的内容。
    5、这个开发板的单片机是可插拔的,一定注意下你单片机方向别插错了。
    6、当然也不排除软件问题,下面给出下自已手头的有一款艾克姆的STC8的驱动程序,写得不错,比你截图的设计思路要清晰。




LCD1602液晶屏显示实验.7z

14.67 KB, 下载次数: 4

ID:824490 发表于 2020-12-21 11:39
LCD1602测试代码
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>


unsigned int hour,minute,second,count;

sbit RS = P2^4;//Pin4
sbit RW = P2^5; //Pin5
sbit E  = P2^6;//Pin6

#define Data  P0    //数据端口

char data TimeNum[]="                ";
char data Test1[]="                  ";
/******************************************************************/
/*                    函数声明                                    */
/******************************************************************//***************************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
   {
     DelayUs(250);
     DelayUs(250);
     DelayUs(250);
     DelayUs(250);
   }
}
void WriteCommand(unsigned char c)
{
DelayMs(5);//short delay before operation
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/****************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5);   //short delay before operation
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/*********************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
    p=pos+0xb0; //是第二行则命令代码高4位为0xc
else
    p=pos+0x80; //是第二行则命令代码高4位为0x8
WriteCommand (p);//write command
WriteData (c);   //write data
}
/*************************************************************************/
void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
  ShowChar (l++,*(ptr+i));//循环显示16个字符
}
/*********************************************************************/
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //显示光标移动位置
WriteCommand(0x0c); //显示开及光标设置
WriteCommand(0x01); //显示清屏

}


/////////////////////////////////////////////////////////////////
void main(void)

{
InitLcd();//
DelayMs(15);

sprintf(Test1," xxxxxxxx  ");//the first line
ShowString(0,Test1);

sprintf(TimeNum,"LCM1602 Test ok!");//the first line
ShowString(1,TimeNum);

while(1);

}
ID:824490 发表于 2020-12-21 11:36
你的MAIN中,没有LCD的初始化,如何能显示?
LCD1602初始化没成功,显示出来就是象你这样的图形。
ID:836944 发表于 2020-12-21 11:25
可以去看看以前的贴子,搜1602 白就有

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

Powered by 单片机教程网

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