专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
1602显示
2019-03-24 19:37
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
10322
10
973
1602在main函数最后加while(1); lcd上就不显示了,去掉就显示,但是显示内容是闪的。本来想加个while不闪的 ,现在不显示了,怎么回事呢? 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
小小白
1楼-- · 2019-03-25 02:56
看看程序啊,没有程序说不清啊。。。
加载中...
skyman_liu
2楼-- · 2019-03-25 07:16
#include<reg52.h>
#include<intrins.h>
char code table[]={"hello"} ;
sbit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
#define DP P0
#define BF 0x80
void checkby();
void writecmd(char cmd,char b);
void writedata(char *a);
void lcdreset();
void delay();
void main()
{
char *ap ;
ap=table;
lcdreset();
delay();
writecmd(0x84,0);
while(*ap!=' ')
{
writedata(ap);
ap++;
delay();
}
while(1);
}
void lcdreset()
{
writecmd(0x01,1);
writecmd(0x0c,1);
writecmd(0x06,1);
writecmd(0x38,1);
}
void writecmd(char cmd,char b)
{
if(b==1)checkby();
RS=0;
RW=0;
_nop_();
DP=cmd;
_nop_();
E=1;
_nop_();
E=0;
}
void checkby()
{
DP=0xff;
RS=0;
RW=1;
E=1;
_nop_();
if(DP&BF)delay();
E=0;
}
void delay()
{
char i,j;
i=100;
for(;i>0;i--)
for(;j<100;j++);
}
void writedata(char *a)
{
RS=1;
RW=0;
_nop_();
DP=*a;
_nop_();
E=1;
_nop_();
_nop_();
E=0;
}
加载中...
jishuaihu
3楼-- · 2019-03-25 10:58
你可以仿真吗?单步运行一下看看。
你可以这样试一下,把
while(*ap!=' ')
{
writedata(ap);
ap++;
delay();
}
while(1);
改成
while(1)
{
while(*ap!=' ')
{
writedata(ap);
ap++;
delay();
}
}
试一下。你不加whlie(1)的时候闪有可能是因为程序执行完一遍之后自动从头重新执行了,用C语言有的编译器会这样处理,这样的话你的1602就处于不停的复位和写入状态,所以就闪了。至于你说的加了while(1)之后显一遍表示不太理解,一般的液晶是不需要实时刷新的,不过我没用过1602,不清楚。
加载中...
Li_Lei
4楼-- · 2019-03-25 12:25
感觉像是你的单片机自己复位了,你查查电源,看门狗啥的
1602写入数据后只要供电他就一直显示着.
加载中...
skyman_liu
5楼-- · 2019-03-25 13:03
其实我参考人家写的,别人最后一行加while(1);让单片机原地踏步,1602里的DDRAM里的值也没有不变,所以应该显示的 。 而且以前写的都是加while(1)的 ,而且都正确的 这次加,就不正确了 ,不知道哪里出了问题 ,关键是别人写的加了while(1)都显示 就我自己写的不显示 郁闷
加载中...
小小白
6楼-- · 2019-03-25 16:28
精彩回答 2 元偷偷看……
加载中...
1
2
下一页
一周热门
更多
>
相关问题
相关文章
基于51单片机的计算器设计
0个评论
51单片机300个proteus仿真实例下载
0个评论
51单片机 蜂鸣器
0个评论
51单片机驱动RC522模块
0个评论
基于51单片机的指纹密码锁
0个评论
AT89C51单片机制作简易密码锁
0个评论
51单片机汇编语言计数器
0个评论
51单片机精确延时设计
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include<intrins.h>
char code table[]={"hello"} ;
sbit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
#define DP P0
#define BF 0x80
void checkby();
void writecmd(char cmd,char b);
void writedata(char *a);
void lcdreset();
void delay();
void main()
{
char *ap ;
ap=table;
lcdreset();
delay();
writecmd(0x84,0);
while(*ap!=' ')
{
writedata(ap);
ap++;
delay();
}
while(1);
}
void lcdreset()
{
writecmd(0x01,1);
writecmd(0x0c,1);
writecmd(0x06,1);
writecmd(0x38,1);
}
void writecmd(char cmd,char b)
{
if(b==1)checkby();
RS=0;
RW=0;
_nop_();
DP=cmd;
_nop_();
E=1;
_nop_();
E=0;
}
void checkby()
{
DP=0xff;
RS=0;
RW=1;
E=1;
_nop_();
if(DP&BF)delay();
E=0;
}
void delay()
{
char i,j;
i=100;
for(;i>0;i--)
for(;j<100;j++);
}
void writedata(char *a)
{
RS=1;
RW=0;
_nop_();
DP=*a;
_nop_();
E=1;
_nop_();
_nop_();
E=0;
}
你可以这样试一下,把
while(*ap!=' ')
{
writedata(ap);
ap++;
delay();
}
while(1);
改成
while(1)
{
while(*ap!=' ')
{
writedata(ap);
ap++;
delay();
}
}
试一下。你不加whlie(1)的时候闪有可能是因为程序执行完一遍之后自动从头重新执行了,用C语言有的编译器会这样处理,这样的话你的1602就处于不停的复位和写入状态,所以就闪了。至于你说的加了while(1)之后显一遍表示不太理解,一般的液晶是不需要实时刷新的,不过我没用过1602,不清楚。
1602写入数据后只要供电他就一直显示着.
一周热门 更多>