矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: pdshyh

STC89C52驱动LCD1602问题请教

[复制链接]
     
 楼主| 发表于 2021-1-29 12:21:51 | 显示全部楼层
washu 发表于 2021-1-28 12:48
如你担心 1602 本身损坏,除了电源和对比度其他都不接,上电,对比度正确,1602 应该是这样:

今天拍的位置不一样
微信图片_20210129113725.jpg
回复 支持 反对

使用道具 举报

     
发表于 2021-1-29 17:02:38 | 显示全部楼层
pdshyh 发表于 2021-1-29 12:11
谢谢,晶振11.0592M,连接是否和程序定义的接口对应和编程延时多加几个 NOP 空操作到周末我在核对调整编 ...

检查你的杜邦线是不铁的 如果是铁的可能不行。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-29 17:06:07 来自手机 | 显示全部楼层
cwf2011 发表于 2021-1-29 17:02
检查你的杜邦线是不铁的 如果是铁的可能不行。

谢谢指教,回家吸铁石看看。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-30 10:59:49 | 显示全部楼层
看了杜邦线不是铁的,简单加延时不行,关闭电源开关1602有背光亮是土豪金数据线提供的供电。准备吧初始化部分分段测试看看什么情况。
回复 支持 反对

使用道具 举报

     
发表于 2021-1-30 18:37:38 | 显示全部楼层
pdshyh 发表于 2021-1-29 12:21
今天拍的位置不一样

那么至少 1602 内部没坏,现在你可以检查一下 IO 有没有被烧坏,不需要接到单片机,用个面包板啥都行,

1、接好电源
2、RS、RW 接地,固定为指令输入、写模式
3、对比度调整至合适,上电后呈上面一排黑下面一排白
4、D0~D3 悬空,D4~D7 接到电阻和发光管上,可以观察 IO 状态
5、用一个按钮和俩电阻一个电容给 EN 做一个触发(按下为低电平恢复为高电平或者反过来均可,1602 写发生在 EN 下降沿)

然后重新上电,1602 呈现上面一排黑下面一排白状态(图一),说明 IO 是好的

将 D7~D4 用条线设置为 0011,按按钮一次,此时 1602 会变成全白(图二)

然后按按钮依次输入 0011、0011、0010、0010、1000、0000、1111,此时 1602 就会有所显示(显示内容不确定但至少有一个闪烁光标且位置不确定)

如图三,这是很长时间没上电过内部没有信息的 1602,所以是第一位显示一个闪烁光标

注释:
前三个 0011 将 1602 总线置为 8 位模式(不管上电时 1602 处于何种模式)
第四个 0010 将 1602 总线置为 4 位模式,合起来就是 H33、H32

第五第六个合并起来就是 00101000(H28)将 1602 设置为 2 行、5x7 点阵
第七第八个合并起来就是 00001111(H0F)开显示(Bit3),显示光标(Bit2),光标闪烁(Bit0)

所以不用单片机都能很简单判断 1602 好坏,然后确定你的 1602 好之后,再检查你的单片机连接和程序即可。

cr1602.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-30 20:02:02 | 显示全部楼层
本帖最后由 pdshyh 于 2021-1-30 20:28 编辑
washu 发表于 2021-1-30 18:37
那么至少 1602 内部没坏,现在你可以检查一下 IO 有没有被烧坏,不需要接到单片机,用个面包板啥都行,
...


谢谢washu老师指教,还可以这样测试1602 没想到,我刚刚用示波器测量1602一个写命令        rs=0;   /        wr=0;            leden=0;  /P1=0X38;   //将要写的命令送到数据总线上        leden=1;           delay(7);          leden=0;        while(1);结果rs和wr随leden变化,用指针表测量结果相同,我把rs和wr接地应该可以了。试了不行,在临时搭个板子按您的方法试试。测量rs和wr和leden口之间电阻40k。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-31 16:45:16 | 显示全部楼层
本帖最后由 pdshyh 于 2021-1-31 16:49 编辑
washu 发表于 2021-1-30 18:37
那么至少 1602 内部没坏,现在你可以检查一下 IO 有没有被烧坏,不需要接到单片机,用个面包板啥都行,
...


看来坏了一片1602怎么弄都没反应,都是一溜黑的。
微信图片_20210131114346.jpg 微信图片_20210131114324.jpg

另一片也焊接测试有反应。
微信图片_20210131163913.jpg
c52,P3^4控制0/1/0,另两个口P3^5/P3^6是0测量也是0/1/0跟着走,电路问题还是单片机问题,还是做得少,没有把握住,一不注意,稀奇古怪的事情都碰到了。
回复 支持 反对

使用道具 举报

     
发表于 2021-1-31 19:38:33 | 显示全部楼层
你还是用替换法,找个能正常工作的单片机+LCD1602,把你的1602换上,或者把确保正常的1602换到你的机器上,一试就知道了。还有,我有一次也遇到类似的问题,最后发现是所买的杜邦线不行,有几根中间的铜丝是断开的。
回复 支持 反对

使用道具 举报

     
发表于 2021-1-31 19:52:56 | 显示全部楼层
1602屏还有一块,还没用
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-31 20:24:03 | 显示全部楼层
baofu 发表于 2021-1-31 19:38
你还是用替换法,找个能正常工作的单片机+LCD1602,把你的1602换上,或者把确保正常的1602换到你的机器上, ...

谢谢指教,看视频1602直接挂到排针上的,所以也直接插上接触不良,后来才看清楚视频1602焊的有母头帽 烧了一个1602.
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-1-31 20:25:57 | 显示全部楼层
本帖最后由 pdshyh 于 2021-1-31 20:27 编辑
iffi123 发表于 2021-1-31 19:52
1602屏还有一块,还没用


当时买了两块,还有一块12864,1602新的也插排针对比试了不行就放一边了。幸亏没烧还有的用。
回复 支持 反对

使用道具 举报

     
发表于 2021-2-1 16:56:19 | 显示全部楼层
pdshyh 发表于 2021-1-31 16:45
看来坏了一片1602怎么弄都没反应,都是一溜黑的。

既然另一个有正确反应(出现闪烁光标),那就好。我记得你还有 AVR,你接到 AVR 上测试看看


  1. /*
  2. * HD44780.c
  3. *
  4. * Created: 2019/2/8 16:31:01
  5. * Author : washu
  6. */
  7. #define F_CPU 1000000
  8. #include <avr/io.h>
  9. #include <avr/iom8.h>
  10. #include <util/delay.h>
  11. #include <stdio.h>

  12. void InitMCU(void);
  13. void StrobeHD44780(void);
  14. void WriteInstruction(unsigned char bDat);
  15. void WriteDatums(unsigned char bDat);
  16. void InitHD44780(int ShowCursor, int BlinkCursor);
  17. void ShowString(int dX, int dLine, char *strLine);

  18. #define LCD_StB PB4
  19. #define LCD_DoI PB5
  20. #define LCD_Dat PORTB
  21. #define LCD_Control PORTB

  22. #define LCD_STATE_Instruction() LCD_Control = LCD_Control & ~(1 << LCD_DoI)
  23. #define LCD_STATE_Datums() LCD_Control = LCD_Control | (1 << LCD_DoI)
  24. #define LCD_STATE_ENABLE() LCD_Control = LCD_Control | (1 << LCD_StB)
  25. #define LCD_STATE_DISABLE() LCD_Control = LCD_Control & ~(1 << LCD_StB)

  26. #define LED_Test PC2
  27. #define LED_Control PORTC
  28. #define LED_ON() LED_Control = LED_Control | (1 << LED_Test)
  29. #define LED_OFF() LED_Control = LED_Control & ~(1 << LED_Test)

  30. int main(void)
  31. {   
  32.         unsigned char i = 0;
  33.         char sbuff[32];
  34.         InitMCU();
  35.     InitHD44780(0, 1);
  36.         ShowString(2, 0, "HD44780 Test");
  37.         ShowString(1, 1, "abcdefg");
  38.         ShowString(3, 1, "  ");
  39.     while (1)
  40.     {
  41.                 LED_ON();
  42.                 _delay_ms(500);
  43.                 LED_OFF();
  44.                 _delay_ms(500);
  45.                 i = i + 1;
  46.                
  47.                 sprintf (sbuff, "%02X", i);
  48.                 ShowString(12, 1, sbuff);       
  49.     }
  50. }

  51. void InitMCU(void)
  52. {
  53.                 DDRB = 0xff;
  54.                 DDRC = 0xff;
  55.                 DDRD = 0xff;
  56.                 PORTB = 0;
  57.                 PORTC = 0b00000111;
  58.                 PORTD = 0;
  59. }

  60. void StrobeHD44780(void)
  61. {
  62.         _delay_us(1);
  63.         LCD_STATE_ENABLE();
  64.         _delay_us(35);        //具体值看手册
  65.         LCD_STATE_DISABLE();
  66.         _delay_us(1);       
  67. }

  68. void WriteInstruction(unsigned char bDat)
  69. {
  70.         LCD_STATE_Instruction();
  71.         LCD_Dat = (LCD_Dat & 0b11110000) | (bDat & 0b11110000) >> 4;
  72.         StrobeHD44780();
  73.         LCD_Dat = (LCD_Dat & 0b11110000) | (bDat & 0b00001111);
  74.         StrobeHD44780();
  75. }

  76. void WriteDatums(unsigned char bDat)
  77. {
  78.         LCD_STATE_Datums();
  79.         LCD_Dat = (LCD_Dat & 0b11110000) | (bDat & 0b11110000) >> 4;
  80.         StrobeHD44780();
  81.         LCD_Dat = (LCD_Dat & 0b11110000) | (bDat & 0b00001111);
  82.         StrobeHD44780();
  83. }

  84. void InitHD44780(int ShowCursor, int BlinkCursor)
  85. {
  86.         WriteInstruction(0x33);
  87.         LCD_Dat = (LCD_Dat & 0b11110000) | 0x03;
  88.         StrobeHD44780();
  89.         LCD_Dat = (LCD_Dat & 0b11110000) | 0x02;
  90.         StrobeHD44780();
  91.         WriteInstruction(0x28);
  92.         WriteInstruction(0b00001100 | (ShowCursor & 0b00000001) << 1 | (BlinkCursor & 0b00000001));
  93.         WriteInstruction(0x01);
  94.         _delay_ms(2);        //该指令需要一定时间执行,看手册留足够时间
  95. }

  96. void ShowString(int dX, int dLine, char *strLine)
  97. {
  98.         WriteInstruction(0b10000000 | (dLine & 0b00000001) << 6 | (dX & 0b00111111));
  99.         while (*strLine)
  100.         {
  101.                 WriteDatums(*strLine);
  102.                 strLine++;
  103.         }
  104. }
复制代码
回复 支持 反对

使用道具 举报

     
发表于 2021-2-1 22:34:21 | 显示全部楼层
pdshyh 发表于 2021-1-31 20:25
当时买了两块,还有一块12864,1602新的也插排针对比试了不行就放一边了。幸亏没烧还有的用。

我都不想玩1602这种早期的字符屏,受限太大,和点阵屏比价格也没什么优势
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-2-2 20:08:25 | 显示全部楼层
washu 发表于 2021-2-1 16:56
既然另一个有正确反应(出现闪烁光标),那就好。我记得你还有 AVR,你接到 AVR 上测试看看

washu老师好,您还记着 AVR板子,是前年测量温度弄得您提供的程序捣鼓着下载运行,用的就是烧坏的1602串口通信显示测量温度,现在测量温度直接连接上位机就不用1602了,我以为 atmega328p avr开发板就是STM32开发板又买了一块, 1602驱动比I2C简单些,我怀疑C52P3脚坏还是对单片机不熟悉,测量的一段程序P3脚停在低电平复位P3脚初始高电平运行都进入低电平然后leden=1一个高电平脉冲,所以我看到了三脚一个同步向上脉冲信号以为C52坏了,1602已经连接C52单片机下载程序试验通过了,谢谢指教。
微信图片_20210202200640.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-2-2 20:11:44 | 显示全部楼层
iffi123 发表于 2021-2-1 22:34
我都不想玩1602这种早期的字符屏,受限太大,和点阵屏比价格也没什么优势

谢谢点阵屏还没用过,有需要在玩谢谢支持 1602驱动已经通过,还是经验和理论都欠缺老是出状况。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-7 11:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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