51单片机的lcd1602的问题!!显示不正常。。
下面是我写的程序,我的目的是从右向左移动显示,然后闪动!!但就是不行,屏幕除了闪什么都没有!!请赐教!!#include<reg52.h>#include<intrins...
下面是我写的程序,我的目的是 从右向左移动显示,然后闪动!!但就是不行,屏幕除了闪什么都没有!!请赐教!!
#include <reg52.h>
#include <intrins.h>
#define delay_4us() _nop_(); _nop_(); _nop_(); _nop_()
sbit lcdrs=P2^6; //数据命令选择端
sbit lcdwr=P2^5; //读写选择端
sbit lcden=P2^7; //使能端
unsigned char code dis1[]="Hello everyone!";
unsigned char code dis2[]="Welcome to here!";
/*延时子程序*/
void delayms (int time)
{
unsigned char i;
while (time--)
{
for (i=0; i<250; i++)
{
delay_4us();
}
}
}
/*测试lcd忙碌状态
/*lcd_busy为1,忙,等待;0,闲,可进行写命令数据 */
bit lcd_busy ()
{
bit result;
lcdrs=0; //命令状态
lcdwr=1; //读状态
lcden=1;
delay_4us();
result=(bit)(P0 & 0x80);
lcden=0;
return result;
}
/* 向lcd写入命令*/
void write_order (unsigned char order)
{
while (lcd_busy ()); //等待lcd空闲
lcdrs=0; //命令
lcdwr=0; //写状态
lcden=0;
P0=order;
delay_4us(); //稍作延时
lcden=1; //高脉冲
delay_4us();
lcden=0;
}
/*向lcd写入数据 */
void write_data (unsigned char date)
{
while (lcd_busy ());
lcdrs=1; //数据
lcdwr=0; //写状态
lcden=0;
P0=date;
delay_4us();
lcden=1;
delay_4us();
lcden=0;
}
/* 显示位置子程序 */
void lcd_pos (unsigned char pos)
{
write_order (pos | 0x80);
}
/* 清屏子程序 */
void lcd_clear ()
{
write_order (0x01);
delayms(5);
}
/* 初始化子程序 */
void lcd_init ()
{
delayms (15);
write_order (0x38); //设置为16*2显示,5*7点阵,8位数据接口
delayms (5);
write_order (0x0c); //开显示,不显示光标
delayms (5);
write_order (0x06); //写一个字符后地址指针自动加1
delayms (5);
write_order (0x01); //清屏
delayms (5);
}
/*闪动子程序 */
void flash ()
{
delayms (600); //控制停留时间
write_order (0x08); //关闭显示
delayms (200);
write_order (0x0c); //开显示
delayms (200);
write_order (0x08); //关闭显示
delayms (200);
write_order (0x0c); //开显示
delayms (200);
}
/*主程序 */
void main ()
{
unsigned char i, j;
delayms (10);
lcd_init (); //初始化
while (1)
{
lcd_clear (); //清屏
lcd_pos (0x10); //写在第一行17字节处
i=0;
while (dis1[i] != '\0')
{
write_data (dis1[i]);
i++;
}
lcd_pos (0x50); //写在第二行17字节处
i=0;
while (dis2 != '\0')
{
write_data (dis2[i]);
i++;
}
for (j=0; j<16; j++)
{
write_order (0x18); //整屏向左移动16格
delayms (100);
}
flash ();
}
} 展开
#include <reg52.h>
#include <intrins.h>
#define delay_4us() _nop_(); _nop_(); _nop_(); _nop_()
sbit lcdrs=P2^6; //数据命令选择端
sbit lcdwr=P2^5; //读写选择端
sbit lcden=P2^7; //使能端
unsigned char code dis1[]="Hello everyone!";
unsigned char code dis2[]="Welcome to here!";
/*延时子程序*/
void delayms (int time)
{
unsigned char i;
while (time--)
{
for (i=0; i<250; i++)
{
delay_4us();
}
}
}
/*测试lcd忙碌状态
/*lcd_busy为1,忙,等待;0,闲,可进行写命令数据 */
bit lcd_busy ()
{
bit result;
lcdrs=0; //命令状态
lcdwr=1; //读状态
lcden=1;
delay_4us();
result=(bit)(P0 & 0x80);
lcden=0;
return result;
}
/* 向lcd写入命令*/
void write_order (unsigned char order)
{
while (lcd_busy ()); //等待lcd空闲
lcdrs=0; //命令
lcdwr=0; //写状态
lcden=0;
P0=order;
delay_4us(); //稍作延时
lcden=1; //高脉冲
delay_4us();
lcden=0;
}
/*向lcd写入数据 */
void write_data (unsigned char date)
{
while (lcd_busy ());
lcdrs=1; //数据
lcdwr=0; //写状态
lcden=0;
P0=date;
delay_4us();
lcden=1;
delay_4us();
lcden=0;
}
/* 显示位置子程序 */
void lcd_pos (unsigned char pos)
{
write_order (pos | 0x80);
}
/* 清屏子程序 */
void lcd_clear ()
{
write_order (0x01);
delayms(5);
}
/* 初始化子程序 */
void lcd_init ()
{
delayms (15);
write_order (0x38); //设置为16*2显示,5*7点阵,8位数据接口
delayms (5);
write_order (0x0c); //开显示,不显示光标
delayms (5);
write_order (0x06); //写一个字符后地址指针自动加1
delayms (5);
write_order (0x01); //清屏
delayms (5);
}
/*闪动子程序 */
void flash ()
{
delayms (600); //控制停留时间
write_order (0x08); //关闭显示
delayms (200);
write_order (0x0c); //开显示
delayms (200);
write_order (0x08); //关闭显示
delayms (200);
write_order (0x0c); //开显示
delayms (200);
}
/*主程序 */
void main ()
{
unsigned char i, j;
delayms (10);
lcd_init (); //初始化
while (1)
{
lcd_clear (); //清屏
lcd_pos (0x10); //写在第一行17字节处
i=0;
while (dis1[i] != '\0')
{
write_data (dis1[i]);
i++;
}
lcd_pos (0x50); //写在第二行17字节处
i=0;
while (dis2 != '\0')
{
write_data (dis2[i]);
i++;
}
for (j=0; j<16; j++)
{
write_order (0x18); //整屏向左移动16格
delayms (100);
}
flash ();
}
} 展开
4个回答
展开全部
先写个简单测试程序让液晶打开光标,看看是否成功,若错误可能时序或者电路连接错误。然后再检查吧。
问题大学刚学时貌似也遇见过,工作了忘了。
话陆裤饥说楼主要学会规范代码啊,要不没人喜欢看的~~(楼主的程序其实没有早返看,勿怪。程序纠错可纯罩以使用硬件调试,看看初始化完成没,然后慢慢找)
问题大学刚学时貌似也遇见过,工作了忘了。
话陆裤饥说楼主要学会规范代码啊,要不没人喜欢看的~~(楼主的程序其实没有早返看,勿怪。程序纠错可纯罩以使用硬件调试,看看初始化完成没,然后慢慢找)
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
意法半导体(中国)投资有限公司
2020-01-15 广告
2020-01-15 广告
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
寄存器配置好了没 看LCD1602元件手册
追问
我写lcd1602的其它程序都可以啊!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
大哥,您的解决方法可以和我分享一下吗?我也遇到类似问题,目的是液晶屏显示......万分感谢!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询