Protues 提示 countroller received data whilst busy
#include"AT89X51.h"intdelay();voidinti_lcd();voidshow_lcd(int);voidcmd_wr();voidShowS...
#include "AT89X51.h"int delay();void inti_lcd();void show_lcd(int);void cmd_wr();void ShowState(); sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;char SpeedChar[]=" Hello C51!";main(){ inti_lcd(); ShowState();}int delay() //判断LCD是否忙{ int a;start: RS=0; RW=1; E=0; for(a=0;a<2;a++); E=1; P1=0xff; if(P1_7==0) return 0; else goto start;}void inti_lcd() //设置LCD方式{ delay(); P1=0x38; cmd_wr(); delay(); P1=0x01; //清除 cmd_wr(); delay(); P1=0x0f; cmd_wr(); delay(); P1=0x06; cmd_wr(); delay(); P1=0x0c; cmd_wr(); delay();}void cmd_wr() //写控制字{ RS=0; RW=0; E=0; E=1;}void show_lcd(int i) //LCD显示子程序{ P1=i; RS=1; RW=0; E=0; E=1;}void ShowState() //显示状态与速度{ int i=0; while(SpeedChar[i]!='\0') { delay(); show_lcd(SpeedChar[i]); i++; } }一个简单的1602lcd显示,为什么会提示countroller received data whilst busy,结果显示“hello c51!”一直在闪,请问问题出在哪?该怎么改正?
展开
1个回答
展开全部
void cmd_wr() //写控制字
{
RS=0;
RW=0;
E=0;
E=1;
}
命令字放在外面是有问题的,而且“忙"的检测也应该放在控制字和数据写的程序中,给你一个我的示范程序。
void lcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
void lcd1602_WriteCmd(uchar cmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
void lcd1602_WriteData(uchar dat)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=dat;
lcd1602_e=0;
}
{
RS=0;
RW=0;
E=0;
E=1;
}
命令字放在外面是有问题的,而且“忙"的检测也应该放在控制字和数据写的程序中,给你一个我的示范程序。
void lcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
void lcd1602_WriteCmd(uchar cmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
void lcd1602_WriteData(uchar dat)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=dat;
lcd1602_e=0;
}
更多追问追答
追答
void lcd1602_Init()
{
lcd1602_WriteCmd(0x38);
lcd1602_WriteCmd(0x0f);
lcd1602_WriteCmd(0x06);
lcd1602_WriteCmd(0x01);
}
void lcd1602_Display(uchar *ptr)
{
uchar i=0;
uchar *data q;
q=ptr;
lcd1602_WriteCmd(0x80);
while(q!=NULL && (*q!='\0') && i=16 && i<32)
{
lcd1602_WriteData(*q);
q++;
i++;
}
}
main()
{
lcd1602_Init();
lcd1602_Display(a);
while(1);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询