hiram

MicroBlaze 控制LCD1602

0
阅读(33720)

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

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++;

}

}

Baidu
map