刚开始怎么调都不行,后来才发觉位与操作应该是"&",而不是"&&",犯了个低级错误,哈哈!
#include "xparameters.h"
#include "xgpio_l.h"
#include "xio.h"
#include "xgpio.h"
#define uchar unsigned char
#define uint unsigned int
#define INIT_DELAY 1000 //usec delay timer during initialization, important to change if clock speed changes
#define INST_DELAY 500 //usec delay timer between instructions
#define DATA_DELAY 250 //usec delay timer between data
#define SHOW_DELAY 25000 //delay 150ms
XGpio lcd;
//====================================================
void WriteCommand(unsigned char c);
void ShowChar(unsigned char pos,unsigned char c);
void ShowString(unsigned char line,char *ptr);
void InitLcd();
void usleep(unsigned int delay);
int main (void) {
XGpio_Initialize(&lcd, XPAR_LCD1602_DEVICE_ID);
XGpio_SetDataDirection(&lcd, 1,0x00000000);
usleep(INIT_DELAY);
InitLcd();
usleep(INIT_DELAY);
while(1)
{
ShowString(0,"Temperature is :");
ShowString(1,"This is my LCD !");
}
return 0;
}
void WriteCommand(unsigned char c)
{
Xuint32 Current;
usleep(500);//DelayS();
XGpio_DiscreteClear(&lcd, 1, 0x00000100);//E=0;
usleep(1);
XGpio_DiscreteClear(&lcd, 1, 0x00000400);//RS=0;
usleep(1);
XGpio_DiscreteClear(&lcd, 1, 0x00000200);//RW=0;
usleep(1);
usleep(10);//_nop_();
XGpio_DiscreteSet(&lcd, 1, 0x00000100);//E=1;
usleep(1);
Current = XGpio_mReadReg(XPAR_LCD1602_BASEADDR, 0);
Current=(Current&0x00000700)+c;
XGpio_mWriteReg(XPAR_LCD1602_BASEADDR, 0, Current);
usleep(1);
XGpio_DiscreteClear(&lcd, 1, 0x00000100);//E=0;
usleep(1);
}
void WriteData(unsigned char c)
{
Xuint32 Current;
usleep(500);//DelayS();
XGpio_DiscreteClear(&lcd, 1, 0x00000100);//E=0;
usleep(1);
XGpio_DiscreteSet(&lcd, 1, 0x00000400);//RS=1;
usleep(1);
XGpio_DiscreteClear(&lcd, 1, 0x00000200);//RW=0;
usleep(1);
usleep(10);//_nop_();
XGpio_DiscreteSet(&lcd, 1, 0x00000100);//E=1;
usleep(1);
Current = XGpio_mReadReg(XPAR_LCD1602_BASEADDR, 0);
Current=(Current&0x00000700)+c;
XGpio_mWriteReg(XPAR_LCD1602_BASEADDR, 0, Current);
usleep(1);
XGpio_DiscreteClear(&lcd, 1, 0x00000100);//E=0;
usleep(1);
XGpio_DiscreteClear(&lcd, 1, 0x00000400);//RS=0;
usleep(1);
}
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if(pos>=0x10)
p=pos+0xB0;
else
p=pos+0x80;
WriteCommand(p);
WriteData(c);
}
void ShowString(unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for(i=0;i<16;i++)
ShowChar(l++,*(ptr+i));
}
void InitLcd()
{
usleep(INIT_DELAY);
WriteCommand(0x38);
usleep(INIT_DELAY);
WriteCommand(0x38);
usleep(INIT_DELAY);
WriteCommand(0x06);
WriteCommand(0x0C);
WriteCommand(0x01);
WriteCommand(0x80);
}
void usleep(unsigned int delay)
{
unsigned int j, i;
for(i=0; i<delay; i++)
for(j=0; j<10000; j++);
}
////////////////////////////////////////////////////////////////////////////////////////////
Net lcd1602_GPIO_IO_pin<0> LOC=e16; #RS
Net lcd1602_GPIO_IO_pin<1> LOC=e10; #RW
Net lcd1602_GPIO_IO_pin<2> LOC=c11; #E
Net lcd1602_GPIO_IO_pin<3> LOC=d16; #D7
Net lcd1602_GPIO_IO_pin<4> LOC=c16; #D6
Net lcd1602_GPIO_IO_pin<5> LOC=r3; #D5
Net lcd1602_GPIO_IO_pin<6> LOC=b16; #D4
Net lcd1602_GPIO_IO_pin<7> LOC=e11; #D3
Net lcd1602_GPIO_IO_pin<8> LOC=d12; #D2
Net lcd1602_GPIO_IO_pin<9> LOC=c12; #D1
Net lcd1602_GPIO_IO_pin<10> LOC=d11; #D0