vhdl 发表于 2010-8-9 20:27:25

用microblaze控制12864 可以写指令 但不能写数据是怎么回事 谢谢

用microblaze控制12864 可以写指令 但不能写数据是怎么回事 谢谢

timthorpe 发表于 2010-8-10 08:15:23

#include "xparameters.h"
#include "stdio.h"
#include "xutil.h"
#include "xbasic_types.h"
#include "xstatus.h"
#include "xgpio.h"

#define CHANNEL 1


XGpio Lcd_Data,Lcd_Ctr;
Xuint8 table[]="timthorpe";
unsigned char number[]="0123456789";
/*******************************************************************/
/*延时time us*/
void delay(Xuint16 time)
{
Xuint16 i,j;
for(i=0;i<time;i++)
   for(j=0;j<26;j++);
}
void delay_ms(Xuint16 time)
{
Xuint16 i,j;
for(i=0;i<time;i++)
   for(j=0;j<3785;j++);
}
/*短延时time */
void delay_s(time)
{ Xuint8 i;
for(i=0;i<time;i++);
}
/*******************************************************************/
/*液?2864进行操作的一系列子函数 没什么可说的 按照时序图写褪橇?
/*******************************************************************/



Xint8 lcd_busy()

{                        
      Xuint16 nTimeOut=0;

XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);

    XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);

    XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);

    delay(3);
   
       XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0xffffffff);

       while((XGpio_DiscreteRead(&Lcd_Data,CHANNEL)&0x80));
       
       XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
          delay(1);
          
        // xil_printf("the value of result is %x\r\n",result);
       

}
/*******************************************************************/

/*                                                               */

/*写指令数据到LCD                                                */

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                           */
/*******************************************************************/
void lcd_wcmd(Xuint8 cmd)

{                        

   lcd_busy();
   // delay_ms(20);
   
       
   //delay(1);
    XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);
    //delay(1);
    XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);
       //delay(1);
       
       XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
    //delay(1);
   // XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);
    XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,cmd);

    delay_ms(5);
    XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);
   
   

    delay_ms(5);

    XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
       delay(1);
       XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);
        // delay(1);
        XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);
       //delay(1);
       
    xil_printf("command %x\r\n",cmd);
       
}

/*******************************************************************/

/*                                                               */

/*写显示数据到LCD                                                */

/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */

/*                                                               */

/*******************************************************************/

void lcd_wdat(Xuint8 dat)

{                        

   lcd_busy();
/* delay_ms(20);
       
       
        //delay(1);
    XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x1);
   
    XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);

        XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
        //delay(100);
   //delay(1);
          XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,dat);
   
          delay(5);
          XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);
          delay(5);
        //XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);
   
    XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
        // delay(1);
        //XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);
        // delay(1);
        //XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);
        // delay(1);

   xil_printf("data %x\r\n",dat);
        delay_ms(1);*/
       
       //delay_ms(20);
   
       
   //delay(1);
    XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x1);
    //delay(1);
    XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);
       //delay(1);
       
       XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
    //delay(1);
   // XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);
    XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,dat);

    delay_ms(5);
    XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);
   
   

    delay_ms(5);

    XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
       delay(1);
       XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);
        // delay(1);
        XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);
       //delay(1);
       
    xil_printf("data %x\r\n",dat);
}

/******************************************************************
设置在液晶中显疚?
********************************************************************/
void lcd_pos(Xuint8 x,Xuint8 y)

{                        

   Xuint8pos;

   if (x==0)

   {x=0x80;}

   else if (x==1)

   {x=0x90;}

   else if (x==2)

   {x=0x88;}

   else if (x==3)

   {x=0x98;}

   pos = x+y;

   lcd_wcmd(pos);   //显示地址

   
}

/*******************************************************************

在液晶中输出一串字?
********************************************************************

*/

void print_string(Xuint8 x,Xuint8 y,Xuint8 * str)

{

Xuint8 lcd_temp;

lcd_pos(x,y);

lcd_temp=*str;

while(lcd_temp != '\0')

{

lcd_wdat(lcd_temp);

lcd_temp=*(++str);


}

}

/*******************************************************************/

/*                                                               */

/*LCD初始化设定                                                */

/*                                                               */

/*******************************************************************/

void lcd_init()

{    delay_ms(50);
    lcd_wcmd(0x30);      //基本指令

    delay(1500);

    lcd_wcmd(0x30);      //基本指令操作

    delay(400);
       
          lcd_wcmd(0x0F);      //显示开,关?
    delay(1500);

    lcd_wcmd(0x01);      //清除LCD的允灸谌?
    delay_ms(15);
   
   
       
       
       
       
       
       xil_printf("lcd initialization done!\n\r");

}


//********************************************上述为对液晶的操作
int main(void){
   Xuint8 result;

xil_printf("now begin\r\n");
XGpio_Initialize(&Lcd_Data,XPAR_LCD_DATA_DEVICE_ID);
XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);
//XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);
XGpio_Initialize(&Lcd_Ctr,XPAR_LCD_CTR_DEVICE_ID);
XGpio_SetDataDirection(&Lcd_Ctr,CHANNEL,0x0);

lcd_init();

lcd_pos(1,3);
lcd_wdat(0x35);
/*delay_ms(10000);
lcd_wcmd(0x87);
lcd_wdat(0x2F);

delay_ms(10000);
print_string(2,0,number);
delay_ms(10000);
lcd_wcmd(0x01);*/
   while(1);

return 0;


}

Esmiamor 发表于 2015-7-22 16:29:30

用microblaze控制12864
页: [1]
查看完整版本: 用microblaze控制12864 可以写指令 但不能写数据是怎么回事 谢谢