写命令OK,写数据后无显示,请高手帮忙check
执行写命令OK,例如我W_cmd(0x85); 光标会跑到第一行第五列的位置并闪烁. 但是当我执行写数据指令把要显示的内容写入的时候,屏幕就什么也没有了. 我怀疑是W_data();有问题,可是我试了把 LCD_DATA=lcddata;放在LCD_EN=1;前面,也不行,而且我看别人的demo程序时序也是这样的,实在找不出问题了. 以前没有搞过LCD,请高手帮忙看看, /*-------------------------------------------------------------
-------------------------------------------------------------*/ #include "REG52.H" #define uchar unsigned char
/*------------------------------------------------------------- sbit分别定义CPU 管脚对应的硬件连接 -------------------------------------------------------------*/ sfr LCD_DATA = 0xA0;
sbit LCD_EN = 0xB3;//------P3.3 Enable Pin sbit LCD_RS = 0xB4;//------P3.4 RS pin sbit LCD_RW = 0xB5;//------P3.5 R/W pin
sbit led0 = 0x80;//------LED, for debug sbit led1 = 0x82;//------LED, for debug sbit led2 = 0x84;//------LED, for debug sbit led3 = 0x86;//------LED, for debug sbit bflag=P2^7; //------busy bit
LCD_busy(void); //判断LCD BUSY void W_cmd(uchar); //写命令 void R_data(void); //读数据 void W_data(uchar); //写数据 void Delay_xMs(unsigned int x);//延时;
LCD_busy(void) //----判断LCD BUSY { unsigned char Lcdbusy; LCD_EN=0; //clear enable led0=0; Delay_xMs(3); LCD_RS=0; //clear RS led1=0; Delay_xMs(3); LCD_RW=1; //set R/W led2=1; Delay_xMs(3); LCD_EN=1; //set enable led0=1; Delay_xMs(3); Lcdbusy=P2; //读P2口,取得BF状态 while( bflag==1) { Lcdbusy=P2;} LCD_EN=0; //clear EN led0=0;
} void W_cmd(uchar lcdcmd) //---写命令 { LCD_busy(); //判断BUSY LCD_EN=0; //clear EN led0=0; Delay_xMs(3); LCD_RS=0; //clear RS led1=0; Delay_xMs(3); LCD_RW=0; //clear RW led2=0; Delay_xMs(3); LCD_EN=1; //set EN led0=1; Delay_xMs(3); LCD_DATA=lcdcmd; //send command to LCD LCD_EN=0; //clear EN led1=0; Delay_xMs(128); }
void W_data(uchar lcddata) //--写数据到LCD { LCD_busy(); //判断BUSY LCD_EN=0; //clear EN led0=0; Delay_xMs(3); LCD_RS=1; //set RS led1=1; Delay_xMs(3); LCD_RW=0; //clear RW led2=0; Delay_xMs(3); LCD_EN=1; //set EN led0=1; Delay_xMs(3); LCD_DATA=lcddata; //send data to LCD
LCD_EN=0; //clear EN led0=0; Delay_xMs(128); }
/*------------------------------------------------ 功能:显示码. -------------------------------------------------*/ unsigned char code LCD_Show[]={0x50,0xf5,0x68,0x4a,0x47,0xc2,0xc0,0x5b,0x40,0x42,0x41,0xc4,0xf0,0x4c,0xe0,0xe1,0xff};
/*------------------------------------------------- 功能:1MS延时子程序 -------------------------------------------------*/ void Delay_xMs(unsigned int x) { unsigned int i,j; for( i =0;i < x;i++ ) { for( j =0;j<500;j++ ); } }
/*------------------------------------------------- 主程序 --------------------------*/ void main() {
uchar i; LCD_EN=0; led0=0; LCD_RW=0; led2=0;
// led0=0; W_cmd(0x38);//显示模式设置,这个命令的格式为:001,DL,N,F,-,- ; ------------------------------------------------请看第6条命令的说明,因这是一个16字符 ;--------------------------------------------------2行的模组,用并行传输,因此将DL设定为1,将N设定 ;--------------------------------------------------为1表示有两行,将F设定为0,表示用5X8的点的字符 // led1=0; W_cmd(0x01);//清屏 W_cmd(0x0E);;-----------------显示,光标,闪动控制,这个命令的格式为:00001,D,C,B ;--------------------------------------------------D为1,表示显示开,C为0表示光标关,B为0表示闪动关 W_cmd(0x80);//设定首行地址
W_data(0x55);//写入要显示的内容--------问题就在这行执行以后
// led2=0; while(1);
KEITHLEY 2007移动终端测试技术方案研讨会(北京、深圳)
jmx 发表于 2007-7-27 21:57 LCD液晶 ←返回版面
2楼: 难道没有人能帮忙解决么?
难道没有人能帮忙解决么?
KEITHLEY 2007移动终端测试技术方案研讨会(北京、深圳)
XWJ 发表于 2007-7-27 22:39 LCD液晶 ←返回版面
3楼: 先送数,再改变EN
void W_cmd(uchar lcdcmd) //---写命令 { LCD_busy(); //判断BUSY LCD_EN=0; //clear EN led0=0; Delay_xMs(3); LCD_RS=0; //clear RS led1=0; Delay_xMs(3); LCD_RW=0; //clear RW led2=0; LCD_DATA=lcdcmd; //send command to LCD Delay_xMs(3); LCD_EN=1; //set EN led0=1; Delay_xMs(3); LCD_EN=0; //clear EN led1=0; Delay_xMs(128); }
void W_data(uchar lcddata) //--写数据到LCD { LCD_busy(); //判断BUSY LCD_EN=0; //clear EN led0=0; Delay_xMs(3); LCD_RS=1; //set RS led1=1; Delay_xMs(3); LCD_RW=0; //clear RW led2=0; LCD_DATA=lcddata; //send data to LCD Delay_xMs(3); LCD_EN=1; //set EN led0=1; Delay_xMs(3);
LCD_EN=0; //clear EN led0=0; Delay_xMs(128); }
签名:
Blog--心中那自由的世界
|