集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2837|回复: 2

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

[复制链接]
vhdl 发表于 2010-8-9 20:27:25 | 显示全部楼层 |阅读模式
用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)

{                          

   Xuint8  pos;

   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 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-4-29 08:00 , Processed in 0.068044 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表