找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 2811|回复: 18
打印 上一主题 下一主题
收起左侧

编写了一段关于lcd1602的单片机代码 修改了一些引脚 但显示屏还是没有显示?

[复制链接]
跳转到指定楼层
楼主
main.c 部分

#include <REGX52.H>
#include "LCD1602.h"


void main()
{
        LCD_Init();
        LCD_ShowChar(1,1,'n');
        while(1)
        {
        
        }
}

LCD1602.H 部分

#ifndef __LCD1602_H__
#define __LCD1602_H__

//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

#endif

LCD1602.c部分

#include <REGX52.H>

//引脚配置:
sbit LCD_RS=P3^4;
sbit LCD_RW=P3^5;
sbit LCD_EN=P3^6;
#define LCD_DataPort P0

//函数定义:
/**
  * @brief  LCD1602延时函数,12MHz调用可延时1ms
  * @param  无
  * @retval 无
  */
void LCD_Delay()
{
        unsigned char i, j;

        i = 2;
        j = 239;
        do
        {
                while (--j);
        } while (--i);
}

/**
  * @brief  LCD1602写命令
  * @param  Command 要写入的命令
  * @retval 无
  */
void LCD_WriteCommand(unsigned char Command)
{
        LCD_RS=0;
        LCD_RW=0;
        LCD_DataPort=Command;
        LCD_EN=1;
        LCD_Delay();
        LCD_EN=0;
        LCD_Delay();
}

/**
  * @brief  LCD1602写数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void LCD_WriteData(unsigned char Data)
{
        LCD_RS=1;
        LCD_RW=0;
        LCD_DataPort=Data;
        LCD_EN=1;
        LCD_Delay();
        LCD_EN=0;
        LCD_Delay();
}

/**
  * @brief  LCD1602设置光标位置
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @retval 无
  */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
        if(Line==1)
        {
                LCD_WriteCommand(0x80|(Column-1));
        }
        else if(Line==2)
        {
                LCD_WriteCommand(0x80|(Column-1+0x40));
        }
}

/**
  * @brief  LCD1602初始化函数
  * @param  无
  * @retval 无
  */
void LCD_Init()
{
        LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
        LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
        LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
        LCD_WriteCommand(0x01);//光标复位,清屏
}

/**
  * @brief  在LCD1602指定位置上显示一个字符
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @param  Char 要显示的字符
  * @retval 无
  */
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
        LCD_SetCursor(Line,Column);
        LCD_WriteData(Char);
}

/**
  * @brief  在LCD1602指定位置开始显示所给字符串
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  String 要显示的字符串
  * @retval 无
  */
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{
        unsigned char i;
        LCD_SetCursor(Line,Column);
        for(i=0;String[ i]!='\0';i++)
        {
                LCD_WriteData(String[ i]);
        }
}

/**
  * @brief  返回值=X的Y次方
  */
int LCD_Pow(int X,int Y)
{
        unsigned char i;
        int Result=1;
        for(i=0;i<Y;i++)
        {
                Result*=X;
        }
        return Result;
}

/**
  * @brief  在LCD1602指定位置开始显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~65535
  * @param  Length 要显示数字的长度,范围:1~5
  * @retval 无
  */
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
        unsigned char i;
        LCD_SetCursor(Line,Column);
        for(i=Length;i>0;i--)
        {
                LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
        }
}

/**
  * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:-32768~32767
  * @param  Length 要显示数字的长度,范围:1~5
  * @retval 无
  */
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
        unsigned char i;
        unsigned int Number1;
        LCD_SetCursor(Line,Column);
        if(Number>=0)
        {
                LCD_WriteData('+');
                Number1=Number;
        }
        else
        {
                LCD_WriteData('-');
                Number1=-Number;
        }
        for(i=Length;i>0;i--)
        {
                LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
        }
}

/**
  * @brief  在LCD1602指定位置开始以十六进制显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~0xFFFF
  * @param  Length 要显示数字的长度,范围:1~4
  * @retval 无
  */
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
        unsigned char i,SingleNumber;
        LCD_SetCursor(Line,Column);
        for(i=Length;i>0;i--)
        {
                SingleNumber=Number/LCD_Pow(16,i-1)%16;
                if(SingleNumber<10)
                {
                        LCD_WriteData(SingleNumber+'0');
                }
                else
                {
                        LCD_WriteData(SingleNumber-10+'A');
                }
        }
}

/**
  * @brief  在LCD1602指定位置开始以二进制显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
  * @param  Length 要显示数字的长度,范围:1~16
  * @retval 无
  */
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
        unsigned char i;
        LCD_SetCursor(Line,Column);
        for(i=Length;i>0;i--)
        {
                LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
        }
}


还附带的51单片机的原理图 哪里还需要修改 显示屏无法显示数字

51黑论坛_archivetemp51 avr最小系统.pdf

656.92 KB, 下载次数: 11

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

举报

沙发
ID:584814 发表于 2022-4-27 17:27 | 只看该作者
本坛内大把可用的先抄后研究,然后自己动手写。
原则:先搞出显示,再深入研究(自己写、修改等),否则硬件是好是坏都不知道。
回复

举报

板凳
ID:984843 发表于 2022-4-27 17:30 | 只看该作者
man1234567 发表于 2022-4-27 17:27
本坛内大把可用的先抄后研究,然后自己动手写。
原则:先搞出显示,再深入研究(自己写、修改等),否则硬 ...

这个代码已经研究过了  而且硬件是好的  
回复

举报

地板
ID:213173 发表于 2022-4-27 17:33 | 只看该作者
最小系统板的电路是固定的,修改了一些引脚?软件与硬件配套?
回复

举报

5#
ID:984843 发表于 2022-4-27 17:38 | 只看该作者
wulin 发表于 2022-4-27 17:33
最小系统板的电路是固定的,修改了一些引脚?软件与硬件配套?

也不是引脚,就是网上单片机教程的时的代码编写时他的单片机和我的单片机有些区别,所以代码就有要修改的好像主要是第三部分lcd1602.h部分。我对着我的我的单片机原理图尝试改了一下但是显示屏依旧没有显示,所以不清楚还有哪里有问题
回复

举报

6#
ID:97554 发表于 2022-4-27 19:49 | 只看该作者
linjianxiaoxiao 发表于 2022-4-27 17:30
这个代码已经研究过了  而且硬件是好的

硬件是好的,代码没有问题,引脚与程序对应了的,那剩下只有两种情况,一、对比度电阻的问题,二、液晶主控使用了偏门。第一种情况很多人掉坑里,第二种情况没见多少人,但是我掉坑了,一般的1602的主控都是44780,但是十年前我买了一块普中开发板,自带程序与配套的液晶可以点亮,换液晶就无法点亮,该液晶换到常见的程序上也不亮。市面上90%以上的1602和2004都用的44780,所以通用程序基本稍加修改就可以随便用,唯有普中这块,于是,对开发板深恶痛绝,脑残设计不知道为何。
回复

举报

7#
ID:213173 发表于 2022-4-27 21:45 | 只看该作者
linjianxiaoxiao 发表于 2022-4-27 17:38
也不是引脚,就是网上单片机教程的时的代码编写时他的单片机和我的单片机有些区别,所以代码就有要修改的 ...

你用这个程序试试
  1. #include <REG51.H>
  2. sbit LCD_RS=P0^7;
  3. sbit LCD_RW=P0^6;
  4. sbit LCD_EN=P0^5;
  5. #define LCD_DataPort P2
  6. unsigned char table[] ="0123456789ABCDEF";        //第一行
  7. unsigned char table1[]="GIJKLMNOPQRSTUVW";        //第二行
  8. unsigned char i;

  9. void LCD_Delay()//12MHz调用可延时1ms
  10. {
  11.         unsigned char i, j;
  12.        
  13.         i = 2;
  14.         j = 239;
  15.         do
  16.         {
  17.                 while (--j);
  18.         } while (--i);
  19. }

  20. void LCD_WriteCommand(unsigned char Command)// LCD1602写命令
  21. {
  22.         LCD_RS=0;
  23.         LCD_RW=0;
  24.         LCD_DataPort=Command;
  25.         LCD_EN=1;
  26.         LCD_Delay();
  27.         LCD_EN=0;
  28. }

  29. void LCD_WriteData(unsigned char Data)//LCD1602写数据
  30. {
  31.         LCD_RS=1;
  32.         LCD_RW=0;
  33.         LCD_DataPort=Data;
  34.         LCD_EN=1;
  35.         LCD_Delay();
  36.         LCD_EN=0;
  37. }

  38. void LCD_Init()
  39. {
  40.         LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
  41.         LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
  42.         LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
  43.         LCD_WriteCommand(0x01);//光标复位,清屏
  44. }

  45. void main()
  46. {
  47.         LCD_Init();
  48.         LCD_WriteCommand(0x80);
  49.         for(i=0;i<16;i++)
  50.                 LCD_WriteData(table[i]);
  51.         LCD_WriteCommand(0x80+0x40);
  52.         for(i=0;i<16;i++)
  53.                 LCD_WriteData(table1[i]);
  54.         while(1);
  55. }
复制代码
回复

举报

8#
ID:984843 发表于 2022-4-27 22:27 | 只看该作者
wulin 发表于 2022-4-27 21:45
你用这个程序试试

亮的 但依旧无法显示出想要的字母
回复

举报

9#
ID:1022263 发表于 2022-4-27 22:30 | 只看该作者
是不是硬件坏了
回复

举报

10#
ID:732794 发表于 2022-4-27 22:39 | 只看该作者
别用P0,换P1或者P2口试试
回复

举报

11#
ID:213173 发表于 2022-4-28 06:37 | 只看该作者
linjianxiaoxiao 发表于 2022-4-27 22:27
亮的 但依旧无法显示出想要的字母

这段代码是按你的最小系统板电路改写的,仿真没有问题,要仔细检查LCD连接是否正确。


回复

举报

12#
ID:984843 发表于 2022-4-28 12:51 | 只看该作者
wulin 发表于 2022-4-28 06:37
这段代码是按你的最小系统板电路改写的,仿真没有问题,要仔细检查LCD连接是否正确。

只有这样的显示
是不是我显示器的位置插错了
是插在第一排那样装吗
还是要用到线
回复

举报

13#
ID:984843 发表于 2022-4-28 12:53 | 只看该作者
wulin 发表于 2022-4-28 06:37
这段代码是按你的最小系统板电路改写的,仿真没有问题,要仔细检查LCD连接是否正确。

就只有这样的显示  是不是我安装错误  这个单片机的显示屏是安装在第一排吗

9855BD7D77000A47F61C740B804A01BE.jpg (270 KB, 下载次数: 57)

9855BD7D77000A47F61C740B804A01BE.jpg

CEA2C16F0FBDBB25521B1402D7AC4867.jpg (235.64 KB, 下载次数: 34)

CEA2C16F0FBDBB25521B1402D7AC4867.jpg
回复

举报

14#
ID:684084 发表于 2022-4-28 14:31 | 只看该作者
用万用表先量出引脚定义,P0高低位有没有调转了?
回复

举报

15#
ID:213173 发表于 2022-4-28 17:22 | 只看该作者
linjianxiaoxiao 发表于 2022-4-28 12:53
就只有这样的显示  是不是我安装错误  这个单片机的显示屏是安装在第一排吗

LCD一排方块是典型的初始化失败的现象,确认一下MCU是否与图纸AT89S51一致。MCU型号不同使用方法有差异。
回复

举报

16#
ID:149451 发表于 2022-4-30 09:18 | 只看该作者
LZ把1602的方向插反了吧??LCD1602屏的PIN脚,通常边上的是pin1,,,,,,,,,,,,,,pin16,而且插上屏后,不应盖在MCU上(这是开发板设计的基本原则)
回复

举报

17#
ID:149451 发表于 2022-4-30 09:21 | 只看该作者
本帖最后由 w1179benp 于 2022-4-30 09:22 编辑

要安装在16pin排座上,注意方向(排座下有pin的标识)
回复

举报

18#
ID:824490 发表于 2022-4-30 10:04 | 只看该作者
w1179benp 发表于 2022-4-30 09:18
LZ把1602的方向插反了吧??LCD1602屏的PIN脚,通常边上的是pin1,,,,,,,,,,,,,,pin16,而且插上屏后,不应盖 ...

插反了连背光都不会亮了。。
回复

举报

19#
ID:149451 发表于 2022-4-30 17:00 | 只看该作者
名字不是重点 发表于 2022-4-30 10:04
插反了连背光都不会亮了。。

亮不亮看pin说明(常规的):1(电源地)对应16(背光负极);2(电源正极)对应15(背光正极)。怎会不亮?


回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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