哪位有耐心的朋友请进来帮我看下我写的LCD 1602 的驱动程序,怎么不能显示字符。
大家帮我看一下下面这个程序,哪里有问题。我用的 LCD1602液晶屏。我想让它显示一个A。为什么不能显示。我实在想不出来。发个贴请教下大家。哪位高用能帮我分析一下。小弟感激不尽。
//定义引脚。
#define LCD_DATA P0
#define LCD_EN P2_3
#define LCD_RS P2_1
#define LCD_RW P2_2
typedef unsigned charuint8;
typedef unsigned int uint16;
#include <REGX51.H>
//主函数。
void main ( void )
{
delay_ms ( 400 );
LCD_intal ( );
delay_ms( 2 );
writer_addr( 0, 5,'A' );
delay_ms( 2 );
}
//写数据时序。
voidwriter_date_timing ( uint8date)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = date;
delay_us ( 3 );
LCD_EN = 0;
LCD_EN = 1;
delay_ms ( 1 );
LCD_EN = 0;
}
//写命时序。
voidwriter_Command( uint8 order )
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = order;
delay_us ( 3 );
LCD_EN = 0;
LCD_EN = 1;
delay_ms ( 1 );
LCD_EN = 0;
}
//初始化LCD1602
voidLCD_intal ( void )
{
uint8 n = 3;
LCD_DATA = 0;
while ( n-- ) //设三次模式。
{
writer_Command ( 0x38 );
delay_ms ( 5 );
}
Lcd_WaitBusy ( ); //检测是否为忙时。
writer_Command ( 0x38 );
Lcd_WaitBusy ( );
writer_Command ( 0x01 ); //清屏。
Lcd_WaitBusy ( );
writer_Command ( 0x06 ); //功能设置画面不动。
Lcd_WaitBusy ( );
writer_Command ( 0x0c ); //开显示开关。
;
}
//检测是否为忙时。
uint8 Lcd_WaitBusy ( void )
{
uint8 Busy = 0x80;
LCD_DATA = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 0;
LCD_EN = 1;
delay_ms ( 1 );
LCD_EN = 1;
while ( LCD_DATA & Busy ); //检测忙信号
LCD_EN = 0;
return(LCD_DATA); //若不处于忙状态显示字符
}
//设置显示位置。
void writer_addr( uint8 x, uint8 y, uint8 addr )
{
y &= 0x1;
x &= 0xF;
LCD_RS = 0;
LCD_RW = 0;
x |= 0x80; // 算出指令码
if ( x )
LCD_DATA= x;
delay_us ( 5 );
LCD_EN = 0;
LCD_EN = 1;
delay_us ( 1 );
LCD_EN = 0;
writer_date_timing ( addr );写入字符。
}
//延时MS
voiddelay_ms ( uint16 ms )
{
uint16 i,n;
for ( i = 0; i < ms; i++ )
for ( n = 0; n < 1000; n++ );
}
//延时US。
voiddelay_us ( uint16 us )
{
while ( us-- );
} 1602的代码网上一大堆,看看你的第3脚接的电位器,调一下对比度试试。不要以为看不了就不行。 调 VO 脚是控制每个引脚上的电压。我也调过就是不行。 上拉电阻接了吗? 我用到的脚每个都接了上拉电阻。引脚的电压可达到5V。 给你个代码参考一下吧 点击此处下载 ourdev_501840.rar(文件大小:1K) (原文件名:1602.c.rar) http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_502295.jpg
(原文件名:未命名.jpg)
真的快受不了了。我是按这个步骤来写的,也参考过网上很多的例子,就是不行,说LCD 是坏的吗。我仿真也不行。我调延时调长一点也不行,短一点也不行。LCD有这么难吗。 楼主一开始就把程序搞得那么复杂,说有什么问题,我们也找不出来,你自己也不知道。建议把多余的东西都去掉。 是不是延时少了。 把多余的东西都去掉。那我怎么知道有没有点亮屏了呢。最起码要显示个字符才知道屏跑了没有。 还是把实际接的电路拍一下发上来让大家帮你吧 http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_502383.jpg
(原文件名:1.jpg)
我是参照这个图连接的。希望大家帮一下忙。 自已顶一下。 端口设置软件和硬件 怎么不一样?
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_502667.jpg
(原文件名:1.jpg) http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_502667.jpg
(原文件名:1.jpg) 我今天把上面的程序改了下把光标设为闪动的时。在仿真时可以看到光标闪动。写字符进去就是不能显示字符。这我实在不明白,我看了很多网上这方面的东西,方法一样的。为什么就不行呢。有谁知道吗。 顶一下 写数据写命令时三根控制线和数据线配合要严谨,,时序也要对,,没有命令和数据传送的时候要保证数据线为0x00,,再研究一下时序吧,,可能有收获,, //写数据时序。
voidwriter_date_timing ( uint8date)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = date;
delay_ms ( 1 );
LCD_EN = 0;
}
//写命时序。
voidwriter_Command( uint8 order )
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = order;
delay_ms ( 1 );
LCD_EN = 0;
}
这样就应可以了 用的是5V逻辑吗?用3.3V逻辑好像是不行的! 看看我写的吧,什么都写好了的
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3703520&bbs_page_no=1&search_mode=4&search_text=maxbiger&bbs_id=9999 E使能之前最好清零数据线,,解除使能之后也清零数据线~~ 谢谢大家 没关注别的,就是发现楼主的主程序没死循环。程序跟定跑飞,还不知编译能过不? 弄了好久了 1602LCD还是跟没有初始化一样 显示一排小黑块
页:
[1]