hiram

MicroBlaze 控制LCD1602

0
阅读(34942)

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

  Copyright(C)    柏兆来

  All rights reserved

 

  文件名称: LCD1602.C  file

  文件标识: 见配置管理计划书

  摘    要:

 

  版    本: V1.1

  作    者: 柏兆来

  建立日期: 2009 -8 -17   21:03:53

 

  版权所有,盗版必究。

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

 

//#include < stdio.h>

#include "xgpio_l.h"

#include "xparameters.h"

#include "xgpio.h"

 

#define   XPAR_LCD_DEVICE_ID   XPAR_GENERIC_GPIO_DEVICE_ID

 

XGpio   lcd; 

 

///////////////////////////////////////////////////////////////////////

//

// 函数名       : delayus

// 功能描述     : 延时2us

// 参数         : Xuint16  delay

// 返回值       : void

//

///////////////////////////////////////////////////////////////////////

 

 

static void delayus(Xuint16  delay)

{

    volatile Xuint16  i, j;

    for (i = 0; i < delay; i++)

              for (j = 0; j < 10; j++)

                     ;

}

 

 

 

///////////////////////////////////////////////////////////////////////

//

// 函数名       : WaitForEnable

// 功能描述     : 忙状态检测

// 返回值       : void

//

///////////////////////////////////////////////////////////////////////

static void WaitForEnable(void)   

{                              

    XGpio_SetDataDirection(&lcd, 1,0x000000ff);  

    XGpio_DiscreteClear(&lcd, 1, 0x00000200);   //RS=0

        XGpio_DiscreteSet(&lcd, 1, 0x00000100);     // RW=1

        delayus(1);

    XGpio_DiscreteSet(&lcd, 1, 0x00000400);     // EN=1

 

    delayus(1);

//  delayus(1);

        while(XGpio_DiscreteRead(&lcd, 1)&0x00000080);

    XGpio_DiscreteClear(&lcd, 1, 0x00000400);      //EN=0        

        XGpio_SetDataDirection(&lcd, 1,0x00000000);

}    

   

 

 

///////////////////////////////////////////////////////////////////////

//

// 函数名       : XromWriteCmd

// 功能描述     : 写命令

// 参数         : Xuint32  Command

// 返回值       : void

//

///////////////////////////////////////////////////////////////////////

static void XromWriteCmd(Xuint8  Command,Xuint8 Attribc)

{

    Xuint32  Current;

    Current = 0x00000400 | Command;

        if(Attribc)

          WaitForEnable();

 

    XGpio_DiscreteClear(&lcd, 1, 0x00000200);   // RS=0

    XGpio_DiscreteClear(&lcd, 1, 0x00000100);   // RW=0

    delayus(1);

    XGpio_DiscreteWrite(&lcd, 1, Command);

    delayus(1);

    XGpio_DiscreteWrite(&lcd, 1, Current);

    delayus(1);

    delayus(1);

    XGpio_DiscreteWrite(&lcd, 1, Command);

}

 

 

///////////////////////////////////////////////////////////////////////

//

// 函数名       : XromWriteData

// 功能描述     : 写数据

// 参数         : Xuint32 data

// 返回值       : void

//

///////////////////////////////////////////////////////////////////////

static void XromWriteData(Xuint8 data)

{

    Xuint32  rs_data, enable_rs_data;

    rs_data = 0x00000200 | data;

    enable_rs_data = 0x00000600 | data;

        WaitForEnable(); 

    XGpio_DiscreteSet(&lcd, 1, 0x00000200);     // RS=1

    XGpio_DiscreteClear(&lcd, 1, 0x00000100);   // RW=0

    delayus(1);

    XGpio_DiscreteWrite(&lcd, 1, rs_data);

    delayus(1);

    XGpio_DiscreteWrite(&lcd, 1, enable_rs_data);

    delayus(1);

    delayus(1);

    XGpio_DiscreteWrite(&lcd, 1, rs_data);

}

 

 

///////////////////////////////////////////////////////////////////////

//

// 函数名       : XromLCDInit

// 功能描述     : 液晶初始化

// 返回值       : void

//

///////////////////////////////////////////////////////////////////////

void XromLCDInit()

{

       XGpio_Initialize(&lcd, XPAR_LCD_DEVICE_ID);

    XGpio_SetDataDirection(&lcd, 1, 0x00000000);

    XGpio_DiscreteWrite(&lcd, 1, 0x00000000);

 

    XromWriteCmd(0x00000038,1);

    XromWriteCmd(0x00000008,1);

    XromWriteCmd(0x00000001,1);

    XromWriteCmd(0x00000006,1);

    XromWriteCmd(0x0000000c,1);

}

  

 

///////////////////////////////////////////////////////////////////////

//

// 函数名       : DisplayOneChar

// 功能描述     : 显示一个字符

// 参数         : Xuint8 x

// 参数         : Xuint8 y

// 参数         : Xuint8 DData

// 返回值       : void

//

///////////////////////////////////////////////////////////////////////

void DisplayOneChar(Xuint8 x, Xuint8 y, Xuint8 DData)

{

    y&=1;

    x&=15;

    if (y)

              x|=0x40;

    x|=0x80;

    XromWriteCmd(x,0);

    XromWriteData(DData);

}

 

 

 

///////////////////////////////////////////////////////////////////////

//

// 函数名       : DisplayString

// 功能描述     : 显示字符串

// 参数         : Xuint8 X

// 参数         : Xuint8 Y

// 参数         : Xuint8 *String

// 返回值       : void

//

///////////////////////////////////////////////////////////////////////

void DisplayString(Xuint8 X, Xuint8 Y, Xuint8 *String)

{

       Xuint8 StringLength = 0;

       Y&=0x1;               

       X&=0xF;

       while (String[StringLength] != '\0')

       {

              DisplayOneChar(X, Y, String[StringLength]);

              StringLength++;

              X++;

       }

}

 

 

///////////////////////////////////////////////////////////////////////

//

// 函数名       : DisplayNum

// 功能描述     : 显示十进制数

// 参数         : Xuint8 X

// 参数         : Xuint8 Y

// 参数         : Xuint32  DecNum

// 返回值       : void

//

///////////////////////////////////////////////////////////////////////

void DisplayNum(Xuint8 X, Xuint8 Y, Xuint32  DecNum)

{

       Xint8 i;  

       Xuint8  display_buf[10];

       Y&=0x1;               

       X&=0xF;

       for (i = 9; i >= 0; i--)     

       {

              display_buf[i] = '0'+DecNum%10;

              DecNum /=10;

       }

       for (i = 0; i < 9; i++)

       {

              if (display_buf[i] != '0')

                     break;

       }

       for (; i < 10; i++)

       {

              DisplayOneChar(X, Y, display_buf[i]);

              X++;

       }

}