极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14533|回复: 5

ATMEGA8L 驱动1602屏的问题

[复制链接]
发表于 2012-3-3 02:43:40 | 显示全部楼层 |阅读模式
本帖最后由 文少 于 2014-2-18 11:40 编辑

原来用的ATMEGA168,1602接的4线方式,工作良好,百分百能够初始化成功。因为要做一些别的东西,用M168成本太高,于是用M8L,外部晶振8M,Bootloader也没有问题。但用同样的1602代码却没有办法成功初始化,开机基本是乱码,有时按多几次按键(有刷新屏显的内容人)却又显示正常;有时乱按正常了,再按复位又是初始化正常的,很奇怪。

曾分析如下:

1. M8L的复位电路和M168的一样,上拉10K,104到地,换过102,103都一样。
2. 1602的EN使能延时原是3微秒,延时改来改去,再没有效果。
3. 修改驱动的指令延时,没有效果。
4. 开机时增加几百MS的延时再作初始化,没有效果。
5. 晶振,晶振电容都换了,不行。
6. 在原硬件基础上,装上M168和16M晶振,工作非常好,郁闷!
7. 人快疯了。。。求助!



原用的4线1602驱动代码如下:

  1. void setup() {
  2.   for (i=8; i <= 13; i++){         //Pin8~13端口为LCD驱动输出
  3.     pinMode(i,OUTPUT);
  4.   }
  5.   lcd_init();                //LCD初始化
  6. }

  7. void loop(){

  8. }

  9. //-----------------------LCD 初始化----------------------------
  10. void lcd_init(){
  11.   for (i=1;i <=51; i++){      //4线 2行 5x7
  12.     LCD_C_W(0x28);
  13.     delay(5);
  14.   }  
  15.   LCD_C_W(0x06);     //设定输入方式,增量不移位
  16.   delay(5);
  17.   LCD_C_W(0x0c);   
  18.   delay(5);
  19.   LCD_C_W(0x80);   
  20.   delay(5);
  21.   LCD_C_W(0x01);   //清屏
  22.   delay(5);
  23. }



  24. //-------------------  LCD命令写入 ------------------------
  25. void LCD_C_W(int command){
  26.   int i,temp;
  27.   digitalWrite( lcd_RS,0);
  28.   digitalWrite( lcd_EN,0);

  29.   temp=command & 0xf0;
  30.   for (i=DB[0]; i <= 11; i++){
  31.     digitalWrite(i,temp & 0x80);
  32.     temp <<= 1;
  33.   }
  34.   en_down();           //EN下降沿

  35.   temp=(command & 0x0f)<<4;
  36.   for (i=DB[0]; i <= 12; i++){
  37.     digitalWrite(i,temp & 0x80);
  38.     temp <<= 1;
  39.   }

  40.   en_down();           //EN下降沿
  41. }

  42. //--------------------LCD数据写入-----------------------
  43. void LCD_D_W(int dat)      
  44. {
  45.   int i,temp;
  46.   digitalWrite( lcd_RS,1);
  47.   digitalWrite( lcd_EN,0);
  48.   temp=dat & 0xf0;
  49.   for (i=DB[0]; i <= 11; i++)
  50.   {
  51.     digitalWrite(i,temp & 0x80);
  52.     temp <<= 1;
  53.   }
  54.   en_down();         //EN下降沿

  55.   temp=(dat & 0x0f)<<4;
  56.   for (i=DB[0]; i <= 12; i++)
  57.   {
  58.     digitalWrite(i,temp & 0x80);
  59.     temp <<= 1;
  60.   }
  61.   en_down();        //EN下降沿
  62. }

  63. //--------------------LCD X,Y轴------------------------
  64. void LCD_xy( int x, int y )     
  65. {
  66.   int address;
  67.   if (y ==0)    address = 0x80 + x;
  68.   else          address = 0xC0 + x;
  69.   LCD_C_W(address);
  70. }

  71. //---------------------LCD字符写入------------------------
  72. void LCD_W_C( int x,int y,int dat)   
  73. {
  74.   LCD_xy( x, y );
  75.   LCD_D_W(dat);
  76. }

  77. //----------------------LCD字符串写入---------------------
  78. void LCD_W_S(int X,int Y,char *s)  
  79. {
  80.   LCD_xy( X, Y );    //设置地址
  81.   while (*s)             //写字符串
  82.   {
  83.     LCD_D_W(*s);   
  84.     s ++;
  85.   }
  86. }

  87. //---------------------- LCD的EN下降沿 --------------------
  88. void en_down(){
  89.   digitalWrite( lcd_EN,1);
  90.   delayMicroseconds(3);
  91.   digitalWrite( lcd_EN,0);
  92. }
复制代码



回复

使用道具 举报

发表于 2012-5-16 13:50:54 | 显示全部楼层
按道理说应该是没什么问题的,你换一个芯片试试,这点程序才几K,用51都很轻松的控制它的。
回复 支持 反对

使用道具 举报

发表于 2014-2-14 22:51:23 | 显示全部楼层
本帖最后由 小小弧 于 2014-2-14 22:52 编辑

大哥。我和你一样的问题,上电后LCD不显示任何东西,按下reset。全部正常,再按下reset后LCD又恢复不显示,我总不能每次上电后再按reset吧,另外你按串口监视,和按reset可以起到相同的效果。郁闷。

补充一下,我也用的4线LCD。用mini板子或者nano板子,毛病都一样的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-16 17:58:36 | 显示全部楼层
小小弧 发表于 2014-2-14 22:51
大哥。我和你一样的问题,上电后LCD不显示任何东西,按下reset。全部正常,再按下reset后LCD又恢复不显示, ...

你也用MEGA8L吗? 和你的情况不完全一样,这个问题一直没搞定~
回复 支持 反对

使用道具 举报

发表于 2014-2-16 18:39:54 | 显示全部楼层
程序沒有定義接腳及一些設定,重要的 void loop 也漏了(),這程序理論上了無法過得編譯器的,為何可運行?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-18 11:37:54 | 显示全部楼层
本帖最后由 文少 于 2014-2-18 11:39 编辑
eddiewwm 发表于 2014-2-16 18:39
程序沒有定義接腳及一些設定,重要的 void loop 也漏了(),這程序理論上了無法過得編譯器的,為何可運行?


贴代码时把LOOP的内容delete了,删多了...我去补上.
贴中的问题不是这个原因~~
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-2 11:32 , Processed in 0.041184 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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