搜索
bottom↓
回复: 5

proteus 仿真 LCD的问题 (LM016L)

[复制链接]

出0入0汤圆

发表于 2009-5-14 21:59:27 | 显示全部楼层 |阅读模式
我用实物已经做出来了,现在尝试一下仿真的效果,之前也不大清楚LM016L是否和LCD1602一样的工作,参考了一下大家以前的帖子,就是说只有检测忙状态是不一样的是吗?但是我把这个改了结果还是一样,如果别的地方都一样的话程序应该没问题,因为实物都做出来了。但不知道结果为什么都是这样。显示都是D

(原文件名:G3ZFHW}EYXXTC1%E`4NFF$L.jpg)

希望各位大侠指点指点!

还有附上我的LCD初始化部分

#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
/*******************************************************************/
void delay1(int ms)
{
unsigned char y ;
  while(ms--)
{
  for(y = 0 ; y<250 ; y++)
  {
   _nop_() ;
   _nop_() ;
   _nop_() ;
   _nop_() ;
   _nop_() ;
   _nop_() ;
   _nop_() ;
   _nop_() ;
  }
}
delayNOP() ;
}


/******************************************************************/
/*检查LCD忙状态                                                   */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。   */
/******************************************************************/
void lcd_busy()
{                          
    //bit result ;
    LCD_RS = 0 ;   _nop_() ;         //22.1184M  执行一条指令是11.0592的一般时间
    LCD_RW = 1 ;   _nop_() ;
    LCD_EN = 1 ;   _nop_() ;
    delayNOP() ;   _nop_() ;
    //result = (bit)(P1&0x80) ;   _nop_() ;
    LCD_EN = 0 ;   _nop_() ;
    //return(result) ;
}

/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。          */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{ delayNOP() ;
    lcd_busy() ;                       
   //while(lcd_busy()) ;
    LCD_RS = 0 ;   _nop_() ;
    LCD_RW = 0 ;   _nop_() ;
    LCD_EN = 0 ;   _nop_() ;
    _nop_() ;
    _nop_() ;
    _nop_() ;
    _nop_() ;
    P1 = cmd ;     delayNOP() ;
    delayNOP() ;   _nop_() ;
    LCD_EN = 1 ;   _nop_() ;
    delayNOP() ;   _nop_() ;
    LCD_EN = 0 ;   _nop_() ;
}

/*******************************************************************/
/*写显示数据到LCD                            */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。       */
/*******************************************************************/
void lcd_wdat(uchar dat)
{  delayNOP() ;
    lcd_busy() ;                     
   //while(lcd_busy()) ; _nop_() ;
    LCD_RS = 1 ;   _nop_() ;
    LCD_RW = 0 ;   _nop_() ;
    LCD_EN = 0 ;   _nop_() ;
    P1 = dat ;     _nop_() ;  _nop_() ;   _nop_() ;    //晶振不同时,注意这里的延时时间
    delayNOP() ;   _nop_() ;
    LCD_EN = 1 ;   _nop_() ;
    delayNOP() ;   _nop_() ;
    LCD_EN = 0 ;    _nop_() ;
}


/*  LCD初始化设定                                                  */
/*******************************************************************/
void lcd_init()
{
    delay1(15) ;   
    lcd_wcmd(0x01) ;      _nop_() ;//清除LCD的显示内容            
    lcd_wcmd(0x38) ;      _nop_() ;//16*2显示,5*7点阵,8位数据
    delay1(5) ;           _nop_() ;
    lcd_wcmd(0x38) ;      _nop_() ;   
    delay1(5) ;           _nop_() ;
    lcd_wcmd(0x38) ;      _nop_() ;   
    delay1(5) ;           _nop_() ;

    lcd_wcmd(0x0c) ;      _nop_() ;//显示开,关光标
    delay1(5) ;           _nop_() ;
    lcd_wcmd(0x06) ;      _nop_() ;//移动光标
    delay1(5) ;           _nop_() ;
    lcd_wcmd(0x01) ;      _nop_() ;//清除LCD的显示内容
    delay1(5) ;           _nop_() ;
}

/*  设定显示位置                                    */
/*******************************************************************/
void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos | 0x80) ;   _nop_() ; _nop_() ;//数据指针=80+地址变量
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-5-14 22:02:00 | 显示全部楼层
补充一下:仿真的89C52晶振频率也是22M的

出0入0汤圆

发表于 2009-6-2 11:15:34 | 显示全部楼层
你是否有这液晶的操作资料发一份给我

出0入0汤圆

发表于 2009-6-7 15:21:49 | 显示全部楼层

(原文件名:未命名.jpg)

这是我仿真的效果!这是我用Proteus仿真的lcd液晶显示,挺不错的,越来越觉得单片机这东东挺好玩的!欢迎大家批评指教,希望能和大家一起进步!

http://lizetao666666.blog.163.com

出0入0汤圆

 楼主| 发表于 2009-6-28 18:42:16 | 显示全部楼层
很久之前就解决了,各位不好意思了,原来在和PROTEUS仿真中,一个全局变量不知道如何被改变了,导致发送的字符一直是第一个,所以显示的都是"D",而在实物中可以运行,估计是编译后STC和AT公司的单片机执行的有点差别吧,感谢三楼的朋友!

出0入0汤圆

发表于 2010-11-4 20:31:18 | 显示全部楼层
我是用ATmega16在Proteus 7.4SP3仿真的,同时也下载到力天电子的学习板上运行,有两个问题值得跟大家说明下:

第一,忙标志的问题,仿真中LM016L的那一位为0是忙,实际中YJD1602A那一位为1是忙,与楼主遇到问题一样,仿真中也很好处理:
while(LCD_Data_Pin&0x80) //asm("nop");
return(LCD_Data_Pin);

第二,使能EN的问题,仿真中LM016L是下降沿使能,实际中YJD1602A是上升沿使能,仿真中忽悠着这样处理一下:
#define EN_1    LCD_Select_Port &= ~(1 << LCD_EN)
#define EN_0    LCD_Select_Port |= (1 << LCD_EN)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-17 09:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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