[AVR单片机] 如何测试手里的1602是否可以显示

[复制链接]
4602|19
 楼主| feiyinglala 发表于 2013-11-18 00:44 | 显示全部楼层 |阅读模式
本帖最后由 feiyinglala 于 2013-11-18 13:40 编辑

前些天网购的一个1602液晶显示模块(购买链接是淘宝的店家)。但是不知道到底有没有坏掉。因为现在把它加上5V电源,然后调节对比度的Vo口通过一个10k电阻接到5v电源,没有任何显示。
现在程序没法从液晶模块里读出状态,我把程序写成了每判断一次忙后,如果检测到不忙的状态以后PD7口的输出电平翻转。但是现在PD7口没有任何反转的现象。
使用PD7口驱动一个LED来显示电平反转。PB口接1602的数据口,PA1-2-3接1602的RS-RW-EN三个操作口。

看到百度知道如是说:http://zhidao.baidu.com/link?url=oIj38wDfbHbDA5lVX2c10KM_h5dmbLljGrfnWL-jEEq8UUG1UKEqnSYnP2k75XPIPPQy3BboGVVkvF92uosr_a
把1602完全拔下来,5V正常供电,我用10k的电位器,把电位器拧了个遍,还是没有任何显示。

  1. //ICC-AVR application builder : 2013/11/13 21:45:08
  2. // Target : M16
  3. // Crystal: 7.3728Mhz
  4. #include <iom16v.h>
  5. #include <macros.h>   //??何用

  6. #define uint unsigned int
  7. #define uchar unsigned char

  8. #define lcdrs0 PORTA &= ~(1 << 1)//命令
  9. #define lcdrs1 PORTA |= (1 << 1)//数据
  10. #define lcdrw0 PORTA &= (1 << 2)//读
  11. #define lcdrw1 PORTA |= (1 << 2)//写
  12. #define lcden0 PORTA &= ~(1 << 3)//使不能
  13. #define lcden1 PORTA |= (1 << 3)//使能

  14. uchar table[]="I CAN DO IT!^o^";//
  15. uint num;

  16. void busy(void);
  17. void write_date(uchar);
  18. void write_com(uchar);
  19. void init_1602(void);

  20. void port_init(void)
  21. {
  22. PORTA = 0x00;
  23. DDRA  = 0x0E;  //
  24. PORTB = 0x00;
  25. DDRB  = 0xff;  //程序原本预计初始化为输出
  26. PORTC = 0x00; //m103 output only
  27. DDRC  = 0x00;
  28. PORTD = 0x00;
  29. DDRD  = 0xa7; //本该是0x27
  30. }

  31. void delay(uint z)  
  32. {
  33. uint x,y;
  34.   for(x=z;x>0;x--)
  35.    for(y=110;y>0;y--);  
  36. }

  37. //有问题
  38. void busy()
  39. {
  40.   uchar mang;
  41. //lcden0;
  42. lcdrs0;
  43. lcdrw1;  //
  44. //PORTB = 0xff;  //http://www.amobbs.com/thread-4414649-1-1.html 参考其7楼说法
  45. DDRB=0x00;
  46. delay(10);
  47. lcden1;
  48. delay(10);
  49. mang = 0x80;
  50. delay(10);
  51. while(mang & 0x80)
  52. {
  53.   mang = PINB;//忙时为1,禁止读写操作
  54.   mang = PINB;//忙时为1,禁止读写操作
  55.   mang = PINB;//忙时为1,禁止读写操作
  56.   mang = PINB;//忙时为1,禁止读写操作
  57.   delay(10);
  58. }   
  59. DDRB=0xFF;
  60. delay(10);
  61. lcdrw0;
  62. delay(10);
  63. PORTD ^= 0x80;
  64.   delay(300);
  65. }

  66. void write_date(uchar dat)//写数据函数
  67. {
  68. busy();
  69. lcden0;
  70. lcdrs1;
  71. lcdrw0;
  72. PORTB=dat;
  73. delay(10);
  74. lcden1;
  75. delay(10);
  76. lcden0;
  77. }

  78. void write_com(uchar com)//写命令函数
  79. {
  80. busy();
  81. lcden0;
  82. lcdrs0;
  83. lcdrw0;
  84. PORTB = com;
  85. delay(10);
  86. lcden1;
  87. delay(20);
  88. lcden0;
  89. delay(100);

  90. }

  91. void init_1602()//1602液晶初始化函数
  92. {
  93. write_com(0x38);//设置1602显示模式为5*7点阵
  94. write_com(0x01);//清屏
  95. write_com(0x0f);//开显示
  96. write_com(0x06);//设置当读或写一个字符后,地址指针加一,且光标加一
  97. write_com(0x80);//设置写数据起始地址
  98. delay(300);
  99. }

  100. void main()
  101. {
  102. port_init();
  103. delay(1000);
  104. init_1602();
  105. for(num=0;num<16;num++)
  106.      write_date(table[num]);

  107. while(1);
  108. }
airwill 发表于 2013-11-18 13:15 | 显示全部楼层
第一步, 让屏亮起来, 的确是个比较难弄的调试过程.
经常是验证时序, 再有就是参考别人的代码.

评分

参与人数 1威望 +3 收起 理由
feiyinglala + 3

查看全部评分

huangxz 发表于 2013-11-18 13:32 | 显示全部楼层
复位以后对比度大点的时候,应该是可以看到点阵的
调电位器直到刚好看不见点阵就好了,

评分

参与人数 1威望 +3 收起 理由
feiyinglala + 3

查看全部评分

 楼主| feiyinglala 发表于 2013-11-18 13:34 | 显示全部楼层
airwill 发表于 2013-11-18 13:15
第一步, 让屏亮起来, 的确是个比较难弄的调试过程.
经常是验证时序, 再有就是参考别人的代码. ...

我之前在51上边驱动1602没出这么多问题。现在我想直接用万用表测试一下1602的驱动芯片的输出电平,版主对这了解不?1602的拆解后的是这样 ,下图中两个黑坨引出的密密麻麻的引脚像是直接驱动液晶屏的电平了,我想看看这些电平的情况。
 楼主| feiyinglala 发表于 2013-11-18 13:35 | 显示全部楼层
huangxz 发表于 2013-11-18 13:32
复位以后对比度大点的时候,应该是可以看到点阵的
调电位器直到刚好看不见点阵就好了, ...

是指像百度知道里边说的那样测试吗?
ayb_ice 发表于 2013-11-18 15:30 | 显示全部楼层
关键是测试驱动要正确
qin552011373 发表于 2013-11-18 18:24 | 显示全部楼层
直接上电时是亮的还是灭的?

评分

参与人数 1威望 +3 收起 理由
feiyinglala + 3

查看全部评分

 楼主| feiyinglala 发表于 2013-11-18 19:23 | 显示全部楼层
qin552011373 发表于 2013-11-18 18:24
直接上电时是亮的还是灭的?

灭的,屏幕亮度无任何变化
 楼主| feiyinglala 发表于 2013-11-18 19:28 | 显示全部楼层
ayb_ice 发表于 2013-11-18 15:30
关键是测试驱动要正确

嗯,我现在想先确定这个到底能不能用。液晶模块加电没有任何亮度变化,这个能说明它坏掉了吗?对比度我从0V到5V用10k欧的电位器整整调了一遍,还是一样没任何显示内容,屏幕也一直不亮
qin552011373 发表于 2013-11-19 08:53 | 显示全部楼层
feiyinglala 发表于 2013-11-18 19:23
灭的,屏幕亮度无任何变化

如果直接上电都没有任何变化,屏幕一点也不亮,那就不要再做其他的无用功了,直接找店主换一个,估计是坏掉的,不是单片机或者程序的问题的

评分

参与人数 1威望 +3 收起 理由
feiyinglala + 3

查看全部评分

 楼主| feiyinglala 发表于 2013-11-19 13:32 | 显示全部楼层
qin552011373 发表于 2013-11-19 08:53
如果直接上电都没有任何变化,屏幕一点也不亮,那就不要再做其他的无用功了,直接找店主换一个,估计是坏 ...

嗯,前两天一直在做无用功。我得给店家好好协调一下
qin552011373 发表于 2013-11-19 17:26 | 显示全部楼层
feiyinglala 发表于 2013-11-19 13:32
嗯,前两天一直在做无用功。我得给店家好好协调一下

ok,以后碰到这样的事情,就先看有没有显示,上电都不亮的话,肯定是坏掉的,一般上电就会亮,只是显示什么的问题
 楼主| feiyinglala 发表于 2013-11-19 23:08 | 显示全部楼层
qin552011373 发表于 2013-11-19 17:26
ok,以后碰到这样的事情,就先看有没有显示,上电都不亮的话,肯定是坏掉的,一般上电就会亮,只是显示什 ...

小生记住了。
qin552011373 发表于 2013-11-20 11:48 | 显示全部楼层
feiyinglala 发表于 2013-11-19 23:08
小生记住了。

客气了,我也很小的
bombju 发表于 2013-11-21 15:11 | 显示全部楼层
BL1 是背光+
BL2 是背光-
3脚 VO 直接接地,不显示先量3脚电压是否为零
 楼主| feiyinglala 发表于 2013-11-27 18:04 | 显示全部楼层
bombju 发表于 2013-11-21 15:11
BL1 是背光+
BL2 是背光-
3脚 VO 直接接地,不显示先量3脚电压是否为零

3脚电压为0说明什么,不为0说明什么?能否说明一下它的内部构造
bombju 发表于 2013-11-28 13:25 | 显示全部楼层
3脚电压为0说明对比度调到最大
不为0说明对比度较小
 楼主| feiyinglala 发表于 2013-11-28 15:00 | 显示全部楼层
bombju 发表于 2013-11-28 13:25
3脚电压为0说明对比度调到最大
不为0说明对比度较小

哦,那是怎么通过这个电压来调对比度的?
bombju 发表于 2013-11-28 15:18 | 显示全部楼层
1602采用标准的16脚接口,其中:

第1脚:VSS为电源地

第2脚:VCC接5V电源正极

第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。

第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。

第7~14脚:D0~D7为8位双向数据端。

第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
戈卫东 发表于 2013-11-29 12:07 | 显示全部楼层
买的太便宜了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

224

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部