找回密码
 立即注册

QQ登录

只需一步,快速开始

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

各位大神可以帮我看看吗为什么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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:836944 发表于 2020-12-21 11:25 | 只看该作者
可以去看看以前的贴子,搜1602 白就有
回复

使用道具 举报

板凳
ID:824490 发表于 2020-12-21 11:36 | 只看该作者
你的MAIN中,没有LCD的初始化,如何能显示?
LCD1602初始化没成功,显示出来就是象你这样的图形。
回复

使用道具 举报

地板
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);

}
回复

使用道具 举报

5#
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

回复

使用道具 举报

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

我已经初始化了呀?还是显示不出来而且仿真是没有问题的
回复

使用道具 举报

7#
ID:226055 发表于 2020-12-22 09:08 | 只看该作者
还要考虑是不是硬件问题,比如你的LCD1602屏坏了
回复

使用道具 举报

8#
ID:748788 发表于 2020-12-22 11:04 | 只看该作者
1602的数据口没有定义吧,楼下帮你定义了P0
回复

使用道具 举报

9#
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');
}
回复

使用道具 举报

10#
ID:864507 发表于 2021-1-4 09:22 | 只看该作者
wwh2382 发表于 2020-12-22 11:04
1602的数据口没有定义吧,楼下帮你定义了P0

可以帮我看看问题出在哪吗?
回复

使用道具 举报

11#
ID:390416 发表于 2021-1-4 10:11 | 只看该作者
看这个贴子   单片机+LCD1602显示℃ 这种自定义符号 www.51hei.com/bbs/dpj-200685-1.html
你把595 改成P0口 就行了   
回复

使用道具 举报

12#
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 ;

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

使用道具 举报

13#
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);
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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