原创 MicroBlaze 驱动器12864 v0.0

2010-8-13 21:09 2051 12 13 分类: FPGA/CPLD

#include "xparameters.h"


#include "stdio.h"


#include "xutil.h"


#include "xbasic_types.h"


#include "xstatus.h"


#include "xgpio.h"


 


#define CHANNEL 1


#define SET_RS  
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1)


#define CLEAR_RS
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1)


#define SET_RW   XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2)


#define CLEAR_RW
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2)


#define SET_EN   XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x8)


#define CLEAR_EN XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x8)


#define SET_PORT_IN 
XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0xffffffff)


#define SET_PORT_OUT
XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x00000000)


 


unsigned char
dis[]={"123456"};


XGpio Lcd_Data,Lcd_Ctr;


 


/*延时time us*/


void delay_us(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++);


 }


/*对液晶12864进行操作的一系列子函数 没什么可说的 按照时序图写就是了


 


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


 


/*                                                                
*/


 


/*检查LCD忙状态                                                   
*/


 


/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */


 


 


 


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


 


/*                                                                
*/


 


/*写指令数据到LCD                                                 
*/


 


/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */


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


 


Xint8 lcd_busy()


 


 {                         


 
Xuint8 result;


 


 


   
SET_PORT_IN;


     CLEAR_EN;


   
CLEAR_RS;


     SET_RW;


     


     delay_us(2);


     SET_EN;


   
delay_us(2);


     


     result=XGpio_DiscreteRead
(&Lcd_Data,CHANNEL);


     xil_printf("the value of result is
%x\r\n",result);


   
CLEAR_EN;


     result=result&0x80;


     SET_PORT_OUT;


 


   
return result;


 


 }


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


 


 


void lcd_wcmd(Xuint8 cmd)


 


{                         


 


  
while(lcd_busy());


  
//  delay(50);


  
CLEAR_EN;


  
CLEAR_RS;// XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);


   
//asm("nop");


 
CLEAR_RW;// 
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);


  
// asm("nop");


   
//XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x8);


 


   
delay_us(2);


   
SET_EN;


   
//XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);


   
XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,cmd);


   
delay_us(2);


   
CLEAR_EN;//XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x8);


 


   
//delay(2);


 


   
//XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x8); 


  
xil_printf("cmd done: %x \r\n",cmd);


}


 


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


 


/*                                                                
*/


 


/*写显示数据到LCD                                                 
*/


 


/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */


 


/*                                                                
*/


 


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


 


void lcd_wdat(Xuint8 dat)


 


{                         


 


 
while(lcd_busy());


 
//  delay(50);


  
CLEAR_EN;


    SET_RS;


    CLEAR_RW;


    delay_us(2);


    SET_EN;


   


   


    //
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x1);


    
//asm("nop");


   
//XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);


    
// asm("nop");


   
//XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x8);


  
//  delay(2);


   
//XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);


   
XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,dat);


 


   


 


  
// XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x8);


 


   
delay_us(2);


 


   
//XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x8);


    
CLEAR_EN;


   
xil_printf("data done: %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 != 0x00)


 


{


 


lcd_wdat(lcd_temp);


 


lcd_temp=*(++str);


 


}


 


}


 


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


 


/*                                                                
*/


 


/* 
LCD初始化设定                                                 
*/


 


/*                                                                
*/


 


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


 


void lcd_init()


 


{   
delay_ms(40);


   
lcd_wcmd(0x30);      //扩充指令操作


 


   
delay_ms(5);


 


   
lcd_wcmd(0x30);      //基本指令操作


 


   
delay_ms(5);


 


   
lcd_wcmd(0x0f);      //显示开,关?


   
delay_ms(5);


 


   
lcd_wcmd(0x01);      //清除LCD的允灸谌?


    delay_ms(10);


     xil_printf("lcd initialization
done!\n\r");


 


}


 


 void MicroBlaze_Initialize(){


 XGpio_Initialize(&Lcd_Data,XPAR_LCD_DATA_DEVICE_ID);


 


 XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);


 XGpio_Initialize(&Lcd_Ctr,XPAR_LCD_CTR_DEVICE_ID);


 XGpio_SetDataDirection(&Lcd_Ctr,CHANNEL,0x0);


 
}


//********************************************上述为对液晶的操作


int main(void){


 
unsigned char i=0;


 
xil_printf("now begin\r\n");


 
MicroBlaze_Initialize();


 lcd_init();


 
lcd_pos(1,1);


 
while(dis!='0')


 
{


  
lcd_wdat(dis);


    ++i;


 
}


 xil_printf("print done\r\n");


 


 
while(1);  


 


 return 0;


 


 


 }


 


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


 


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户372435 2010-8-13 21:13

本人稍后会发布最终版本 已经通过测试 显示字符 图片 打点 绘制波形均可实现
相关推荐阅读
用户372435 2010-09-06 16:30
基于CGI的嵌入式web server设计
一、CGI概述  CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程 序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的 交互,也就是CGI程序接受Web浏览器发...
用户372435 2010-08-29 17:38
arm启动详解
关于ARM启动的一篇文章,本人感觉不错,大家共勉posted on 2004年4月9日 20:09 由 devzhao  下面是我抄来的一篇文章, 写的不错, 应该对大家有所帮助:基于ARM的芯片多数...
用户372435 2010-08-25 20:55
ATPCS概述
为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则.ATPCS就是ARM程序和THUMB程序中子程序调用的基本规则...一.ATPCS概述...     ATP...
用户372435 2010-08-24 21:31
]FFT结果的物理意义
    FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FF...
用户372435 2010-08-24 11:31
一个不错的fft的实现
  #include <iom128.h>#include <intrinsics.h> /******************************************...
用户372435 2010-08-23 21:19
用FPGA实现FFT算法
DFT(Discrete Fourier Transformation)是数字信号分析与处理如图形、语音及图像等领域的重要变换工具,直接计算DFT的计算量与变换区间长度N的平方成正比。当N较大时,因计...
EE直播间
更多
我要评论
1
12
关闭 站长推荐上一条 /3 下一条