标题: 各位大神可以帮我看看吗为什么1602显示屏显示不出数值呀 [打印本页]

作者: Y002    时间: 2020-12-21 10:56
标题: 各位大神可以帮我看看吗为什么1602显示屏显示不出数值呀
程序在这里
#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');
}
//AD0832¶áè¡êy¾Yoˉêy
unsigned int Adc0832(unsigned char channel)
{
    uchar i=0;
    uchar j;
    uint dat=0;
    uchar ndat=0;

    if(channel==0)channel=2;
    if(channel==1)channel=3;
    ADDI=1;
    _nop_();
    _nop_();
    ADCS=0;
    _nop_();
    _nop_();
    ADCLK=1;
    _nop_();
    _nop_();
    ADCLK=0;
    _nop_();
    _nop_();
    ADCLK=1;
    ADDI=channel&0x1;
    _nop_();
    _nop_();
    ADCLK=0;
    _nop_();
    _nop_();
    ADCLK=1;
    ADDI=(channel>>1)&0x1;
    _nop_();
    _nop_();
    ADCLK=0;
    ADDI=1;
    _nop_();
    _nop_();
    dat=0;
    for(i=0;i<8;i++)
    {
        dat|=ADDO;
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;
        _nop_();
        _nop_();
        dat<<=1;
        if(i==7)dat|=ADDO;
    }  
    for(i=0;i<8;i++)
    {
        j=0;
        j=j|ADDO;
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;
        _nop_();
        _nop_();
        j=j<<7;
        ndat=ndat|j;
        if(i<7)ndat>>=1;
    }
    ADCS=1;
    ADCLK=0;
    ADDO=1;
    dat<<=8;
    dat|=ndat;
    return(dat);
}
void main()
{
        xiezhilin(0x01);
        xiezhilin(0x38);
  xiezhilin(0x0c);
        
        while(1)
        {                  
          getdata=Adc0832(0);  
          if(0<=getdata<=255)
                 {                           
                  int vary=getdata*100;
                        temp=(int)(vary/51);
                        dispbuf[2]=(temp/100)%10;
                        dispbuf[1]=(temp/10)%10;
                        dispbuf[0]=temp%10;   
          }
         LCDdisplay();
        }        
}


D951BD09845C7144C3559456FD38A61B.png (160.79 KB, 下载次数: 78)

D951BD09845C7144C3559456FD38A61B.png

作者: minileo5    时间: 2020-12-21 11:25
可以去看看以前的贴子,搜1602 白就有
作者: 名字不是重点    时间: 2020-12-21 11:36
你的MAIN中,没有LCD的初始化,如何能显示?
LCD1602初始化没成功,显示出来就是象你这样的图形。
作者: 名字不是重点    时间: 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);

}

作者: cocolala    时间: 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


作者: Y002    时间: 2020-12-21 15:56
名字不是重点 发表于 2020-12-21 11:36
你的MAIN中,没有LCD的初始化,如何能显示?
LCD1602初始化没成功,显示出来就是象你这样的图形。

我已经初始化了呀?还是显示不出来而且仿真是没有问题的
作者: cocolala    时间: 2020-12-22 09:08
还要考虑是不是硬件问题,比如你的LCD1602屏坏了
作者: wwh2382    时间: 2020-12-22 11:04
1602的数据口没有定义吧,楼下帮你定义了P0
作者: Y002    时间: 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');
}
作者: Y002    时间: 2021-1-4 09:22
wwh2382 发表于 2020-12-22 11:04
1602的数据口没有定义吧,楼下帮你定义了P0

可以帮我看看问题出在哪吗?
作者: 人人学会单片机    时间: 2021-1-4 10:11
看这个贴子   单片机+LCD1602显示℃ 这种自定义符号 www.51hei.com/bbs/dpj-200685-1.html
你把595 改成P0口 就行了   
作者: suncat0504    时间: 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 ;

另外使用过程中,注意各个跳线的设置。有些功能需要通过短路/断开跳线才能正常执行。

作者: suncat0504    时间: 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);
}





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1