| 
 
| 写命令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--心中那自由的世界
 
 | 
 |