找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2777|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

編寫(xiě)了一段關(guān)于lcd1602的單片機(jī)代碼 修改了一些引腳 但顯示屏還是沒(méi)有顯示?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
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__

//用戶(hù)調(diào)用函數(shù):
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

//函數(shù)定義:
/**
  * @brief  LCD1602延時(shí)函數(shù),12MHz調(diào)用可延時(shí)1ms
  * @param  無(wú)
  * @retval 無(wú)
  */
void LCD_Delay()
{
        unsigned char i, j;

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

/**
  * @brief  LCD1602寫(xiě)命令
  * @param  Command 要寫(xiě)入的命令
  * @retval 無(wú)
  */
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寫(xiě)數(shù)據(jù)
  * @param  Data 要寫(xiě)入的數(shù)據(jù)
  * @retval 無(wú)
  */
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設(shè)置光標(biāo)位置
  * @param  Line 行位置,范圍:1~2
  * @param  Column 列位置,范圍:1~16
  * @retval 無(wú)
  */
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初始化函數(shù)
  * @param  無(wú)
  * @retval 無(wú)
  */
void LCD_Init()
{
        LCD_WriteCommand(0x38);//八位數(shù)據(jù)接口,兩行顯示,5*7點(diǎn)陣
        LCD_WriteCommand(0x0c);//顯示開(kāi),光標(biāo)關(guān),閃爍關(guān)
        LCD_WriteCommand(0x06);//數(shù)據(jù)讀寫(xiě)操作后,光標(biāo)自動(dòng)加一,畫(huà)面不動(dòng)
        LCD_WriteCommand(0x01);//光標(biāo)復(fù)位,清屏
}

/**
  * @brief  在LCD1602指定位置上顯示一個(gè)字符
  * @param  Line 行位置,范圍:1~2
  * @param  Column 列位置,范圍:1~16
  * @param  Char 要顯示的字符
  * @retval 無(wú)
  */
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
        LCD_SetCursor(Line,Column);
        LCD_WriteData(Char);
}

/**
  * @brief  在LCD1602指定位置開(kāi)始顯示所給字符串
  * @param  Line 起始行位置,范圍:1~2
  * @param  Column 起始列位置,范圍:1~16
  * @param  String 要顯示的字符串
  * @retval 無(wú)
  */
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指定位置開(kāi)始顯示所給數(shù)字
  * @param  Line 起始行位置,范圍:1~2
  * @param  Column 起始列位置,范圍:1~16
  * @param  Number 要顯示的數(shù)字,范圍:0~65535
  * @param  Length 要顯示數(shù)字的長(zhǎng)度,范圍:1~5
  * @retval 無(wú)
  */
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指定位置開(kāi)始以有符號(hào)十進(jìn)制顯示所給數(shù)字
  * @param  Line 起始行位置,范圍:1~2
  * @param  Column 起始列位置,范圍:1~16
  * @param  Number 要顯示的數(shù)字,范圍:-32768~32767
  * @param  Length 要顯示數(shù)字的長(zhǎng)度,范圍:1~5
  * @retval 無(wú)
  */
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指定位置開(kāi)始以十六進(jìn)制顯示所給數(shù)字
  * @param  Line 起始行位置,范圍:1~2
  * @param  Column 起始列位置,范圍:1~16
  * @param  Number 要顯示的數(shù)字,范圍:0~0xFFFF
  * @param  Length 要顯示數(shù)字的長(zhǎng)度,范圍:1~4
  * @retval 無(wú)
  */
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指定位置開(kāi)始以二進(jìn)制顯示所給數(shù)字
  * @param  Line 起始行位置,范圍:1~2
  * @param  Column 起始列位置,范圍:1~16
  * @param  Number 要顯示的數(shù)字,范圍:0~1111 1111 1111 1111
  * @param  Length 要顯示數(shù)字的長(zhǎng)度,范圍:1~16
  * @retval 無(wú)
  */
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單片機(jī)的原理圖 哪里還需要修改 顯示屏無(wú)法顯示數(shù)字

51黑論壇_archivetemp51 avr最小系統(tǒng).pdf

656.92 KB, 下載次數(shù): 11

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:584814 發(fā)表于 2022-4-27 17:27 | 只看該作者
本壇內(nèi)大把可用的先抄后研究,然后自己動(dòng)手寫(xiě)。
原則:先搞出顯示,再深入研究(自己寫(xiě)、修改等),否則硬件是好是壞都不知道。
回復(fù)

使用道具 舉報(bào)

板凳
ID:984843 發(fā)表于 2022-4-27 17:30 | 只看該作者
man1234567 發(fā)表于 2022-4-27 17:27
本壇內(nèi)大把可用的先抄后研究,然后自己動(dòng)手寫(xiě)。
原則:先搞出顯示,再深入研究(自己寫(xiě)、修改等),否則硬 ...

這個(gè)代碼已經(jīng)研究過(guò)了  而且硬件是好的  
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2022-4-27 17:33 | 只看該作者
最小系統(tǒng)板的電路是固定的,修改了一些引腳?軟件與硬件配套?
回復(fù)

使用道具 舉報(bào)

5#
ID:984843 發(fā)表于 2022-4-27 17:38 | 只看該作者
wulin 發(fā)表于 2022-4-27 17:33
最小系統(tǒng)板的電路是固定的,修改了一些引腳?軟件與硬件配套?

也不是引腳,就是網(wǎng)上單片機(jī)教程的時(shí)的代碼編寫(xiě)時(shí)他的單片機(jī)和我的單片機(jī)有些區(qū)別,所以代碼就有要修改的好像主要是第三部分lcd1602.h部分。我對(duì)著我的我的單片機(jī)原理圖嘗試改了一下但是顯示屏依舊沒(méi)有顯示,所以不清楚還有哪里有問(wèn)題
回復(fù)

使用道具 舉報(bào)

6#
ID:97554 發(fā)表于 2022-4-27 19:49 | 只看該作者
linjianxiaoxiao 發(fā)表于 2022-4-27 17:30
這個(gè)代碼已經(jīng)研究過(guò)了  而且硬件是好的

硬件是好的,代碼沒(méi)有問(wèn)題,引腳與程序?qū)?yīng)了的,那剩下只有兩種情況,一、對(duì)比度電阻的問(wèn)題,二、液晶主控使用了偏門(mén)。第一種情況很多人掉坑里,第二種情況沒(méi)見(jiàn)多少人,但是我掉坑了,一般的1602的主控都是44780,但是十年前我買(mǎi)了一塊普中開(kāi)發(fā)板,自帶程序與配套的液晶可以點(diǎn)亮,換液晶就無(wú)法點(diǎn)亮,該液晶換到常見(jiàn)的程序上也不亮。市面上90%以上的1602和2004都用的44780,所以通用程序基本稍加修改就可以隨便用,唯有普中這塊,于是,對(duì)開(kāi)發(fā)板深?lèi)和唇^,腦殘?jiān)O(shè)計(jì)不知道為何。
回復(fù)

使用道具 舉報(bào)

7#
ID:213173 發(fā)表于 2022-4-27 21:45 | 只看該作者
linjianxiaoxiao 發(fā)表于 2022-4-27 17:38
也不是引腳,就是網(wǎng)上單片機(jī)教程的時(shí)的代碼編寫(xiě)時(shí)他的單片機(jī)和我的單片機(jī)有些區(qū)別,所以代碼就有要修改的 ...

你用這個(gè)程序試試
  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調(diào)用可延時(shí)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寫(xiě)命令
  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寫(xiě)數(shù)據(jù)
  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);//八位數(shù)據(jù)接口,兩行顯示,5*7點(diǎn)陣
  41.         LCD_WriteCommand(0x0c);//顯示開(kāi),光標(biāo)關(guān),閃爍關(guān)
  42.         LCD_WriteCommand(0x06);//數(shù)據(jù)讀寫(xiě)操作后,光標(biāo)自動(dòng)加一,畫(huà)面不動(dòng)
  43.         LCD_WriteCommand(0x01);//光標(biāo)復(fù)位,清屏
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

8#
ID:984843 發(fā)表于 2022-4-27 22:27 | 只看該作者
wulin 發(fā)表于 2022-4-27 21:45
你用這個(gè)程序試試

亮的 但依舊無(wú)法顯示出想要的字母
回復(fù)

使用道具 舉報(bào)

9#
ID:1022263 發(fā)表于 2022-4-27 22:30 | 只看該作者
是不是硬件壞了
回復(fù)

使用道具 舉報(bào)

10#
ID:732794 發(fā)表于 2022-4-27 22:39 | 只看該作者
別用P0,換P1或者P2口試試
回復(fù)

使用道具 舉報(bào)

11#
ID:213173 發(fā)表于 2022-4-28 06:37 | 只看該作者
linjianxiaoxiao 發(fā)表于 2022-4-27 22:27
亮的 但依舊無(wú)法顯示出想要的字母

這段代碼是按你的最小系統(tǒng)板電路改寫(xiě)的,仿真沒(méi)有問(wèn)題,要仔細(xì)檢查L(zhǎng)CD連接是否正確。


回復(fù)

使用道具 舉報(bào)

12#
ID:984843 發(fā)表于 2022-4-28 12:51 | 只看該作者
wulin 發(fā)表于 2022-4-28 06:37
這段代碼是按你的最小系統(tǒng)板電路改寫(xiě)的,仿真沒(méi)有問(wèn)題,要仔細(xì)檢查L(zhǎng)CD連接是否正確。

只有這樣的顯示
是不是我顯示器的位置插錯(cuò)了
是插在第一排那樣裝嗎
還是要用到線(xiàn)
回復(fù)

使用道具 舉報(bào)

13#
ID:984843 發(fā)表于 2022-4-28 12:53 | 只看該作者
wulin 發(fā)表于 2022-4-28 06:37
這段代碼是按你的最小系統(tǒng)板電路改寫(xiě)的,仿真沒(méi)有問(wèn)題,要仔細(xì)檢查L(zhǎng)CD連接是否正確。

就只有這樣的顯示  是不是我安裝錯(cuò)誤  這個(gè)單片機(jī)的顯示屏是安裝在第一排嗎

9855BD7D77000A47F61C740B804A01BE.jpg (270 KB, 下載次數(shù): 57)

9855BD7D77000A47F61C740B804A01BE.jpg

CEA2C16F0FBDBB25521B1402D7AC4867.jpg (235.64 KB, 下載次數(shù): 34)

CEA2C16F0FBDBB25521B1402D7AC4867.jpg
回復(fù)

使用道具 舉報(bào)

14#
ID:684084 發(fā)表于 2022-4-28 14:31 | 只看該作者
用萬(wàn)用表先量出引腳定義,P0高低位有沒(méi)有調(diào)轉(zhuǎn)了?
回復(fù)

使用道具 舉報(bào)

15#
ID:213173 發(fā)表于 2022-4-28 17:22 | 只看該作者
linjianxiaoxiao 發(fā)表于 2022-4-28 12:53
就只有這樣的顯示  是不是我安裝錯(cuò)誤  這個(gè)單片機(jī)的顯示屏是安裝在第一排嗎

LCD一排方塊是典型的初始化失敗的現(xiàn)象,確認(rèn)一下MCU是否與圖紙AT89S51一致。MCU型號(hào)不同使用方法有差異。
回復(fù)

使用道具 舉報(bào)

16#
ID:149451 發(fā)表于 2022-4-30 09:18 | 只看該作者
LZ把1602的方向插反了吧??LCD1602屏的PIN腳,通常邊上的是pin1,,,,,,,,,,,,,,pin16,而且插上屏后,不應(yīng)蓋在MCU上(這是開(kāi)發(fā)板設(shè)計(jì)的基本原則)
回復(fù)

使用道具 舉報(bào)

17#
ID:149451 發(fā)表于 2022-4-30 09:21 | 只看該作者
本帖最后由 w1179benp 于 2022-4-30 09:22 編輯

要安裝在16pin排座上,注意方向(排座下有pin的標(biāo)識(shí))
回復(fù)

使用道具 舉報(bào)

18#
ID:824490 發(fā)表于 2022-4-30 10:04 | 只看該作者
w1179benp 發(fā)表于 2022-4-30 09:18
LZ把1602的方向插反了吧??LCD1602屏的PIN腳,通常邊上的是pin1,,,,,,,,,,,,,,pin16,而且插上屏后,不應(yīng)蓋 ...

插反了連背光都不會(huì)亮了。。
回復(fù)

使用道具 舉報(bào)

19#
ID:149451 發(fā)表于 2022-4-30 17:00 | 只看該作者
名字不是重點(diǎn) 發(fā)表于 2022-4-30 10:04
插反了連背光都不會(huì)亮了。。

亮不亮看pin說(shuō)明(常規(guī)的):1(電源地)對(duì)應(yīng)16(背光負(fù)極);2(電源正極)對(duì)應(yīng)15(背光正極)。怎會(huì)不亮?


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表