EDK中LCD1602驱动程序

上一篇 / 下一篇  2007-04-11 16:42:07 / 天气: 晴朗 / 心情: 平静 / 个人分类:FPGA

查看( 289 ) / 评论( 3 )

刚开始怎么调都不行,后来才发觉位与操作应该是"&",而不是"&&",犯了个低级错误,哈哈!

#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

 


TAG: FPGA Fpga fpga

winner869发布于2007-04-12 22:38:31
阿峰的程序好漂亮...
m678发布于2007-05-20 03:50:30
EDK中LCD1602驱动程序
谢楼主的共享~~
m678发布于2007-05-20 04:06:00
谢楼主的共享~~
我来说两句

(可选)

我的栏目

日历

« 2009-01-09  
    123
45678910
11121314151617
18192021222324
25262728293031

数据统计

  • 访问量: 5710
  • 日志数: 21
  • 文件数: 5
  • 建立时间: 2007-03-12
  • 更新时间: 2007-11-07

RSS订阅

Open Toolbar