原创 Microblaze_12864

2010-8-10 08:29 1378 8 9 分类: FPGA/CPLD

#include "xparameters.h"


#include "stdio.h"


#include "xutil.h"


#include "xbasic_types.h"


#include "xstatus.h"


#include "xgpio.h"


 


#define CHANNEL 1


 


 


XGpio Lcd_Data,Lcd_Ctr;


Xuint8 table[]="timthorpe";


unsigned char number[]="0123456789";


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


/*延时time us*/


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


}


/*短延时time */


void delay_s(time)


{ Xuint8 i;


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


}


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


/*液?2864进行操作的一系列子函数 没什么可说的 按照时序图写褪橇?


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


 


 


 


Xint8 lcd_busy()


 


 {                         


     
Xuint16 nTimeOut=0;


 


 
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);


 


   
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);


 


   
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);


 


   
delay(3);


   


     XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0xffffffff);


 


     while((XGpio_DiscreteRead(&Lcd_Data,CHANNEL)&0x80));


   


     XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);


      delay(1);


     


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


     


 


 }


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


 


/*                                                                
*/


 


/*写指令数据到LCD                                                  */


 


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


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


void lcd_wcmd(Xuint8 cmd)


 


{                         


 


    
lcd_busy();


   //
delay_ms(20);


  


   


  
//delay(1);


   
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);


   
//delay(1);


   
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);


     //delay(1);


   


     XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);


   
//delay(1);


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


   
XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,cmd);


 


   
delay_ms(5);


   
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);


  


  


 


   
delay_ms(5);


 


   
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4); 


     delay(1);


     XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);


    //
delay(1);


    XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1); 


     //delay(1);


     


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


     


}


 


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


 


/*                                                                
*/


 


/*写显示数据到LCD                                                 
*/


 


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


 


/*                                                                
*/


 


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


 


void lcd_wdat(Xuint8 dat)


 


{                         


 


  
lcd_busy();


  /*
delay_ms(20);


   


   


    //delay(1);


   
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x1);


  


   
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);


 


    XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);


    //delay(100);


    
//delay(1);


     
XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,dat);


  


      delay(5);


      XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);


      delay(5);


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


    


   
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);


    //
delay(1);


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


    //
delay(1);


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


    //
delay(1);


 


  
xil_printf("data %x\r\n",dat);


    delay_ms(1);*/


   


     // 
delay_ms(20);


  


   


  
//delay(1);


   
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x1);


   
//delay(1);


   
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);


     //delay(1);


   


     XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);


   
//delay(1);


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


   
XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,dat);


 


   
delay_ms(5);


   
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);


  


  


 


   
delay_ms(5);


 


   
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4); 


     delay(1);


     XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);


    //
delay(1);


    XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1); 


     //delay(1);


     


   
xil_printf("data %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 != '\0')


 


{


 


lcd_wdat(lcd_temp);


 


lcd_temp=*(++str);


 


 


}


 


}


 


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


 


/*                                                                
*/


 


/*  LCD初始化设定                                                 
*/


 


/*                                                                
*/


 


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


 


void lcd_init()


 


{   
delay_ms(50);


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


 


   
delay(1500);


 


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


 


   
delay(400);


     


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


    delay(1500);


 


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


   
delay_ms(15);


   


   


     


   


   


   


   


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


 


}


 


 


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


int main(void){


   Xuint8
result;


 


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


 XGpio_Initialize(&Lcd_Data,XPAR_LCD_DATA_DEVICE_ID);


 XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);


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


 XGpio_Initialize(&Lcd_Ctr,XPAR_LCD_CTR_DEVICE_ID);


 XGpio_SetDataDirection(&Lcd_Ctr,CHANNEL,0x0);


 


 lcd_init();


 


 
lcd_pos(1,3);


 
lcd_wdat(0x35);


 
/*delay_ms(10000);


 
lcd_wcmd(0x87);


 
lcd_wdat(0x2F);


 


 
delay_ms(10000);


 
print_string(2,0,number);


 
delay_ms(10000);


 
lcd_wcmd(0x01);*/


   while(1);


 


 return 0;


 


 


 }


 


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户372435 2010-8-14 17:02

******************************************************************** Copyright(C) 李洋 All rights reserved 文件名称: LCD12864.C file 摘 要: 版 本: V1.0 作 者: 李洋 建立日期: 2010-8 -12 10:03:53 本程序借鉴了avr虚拟论坛上程序部分实现的方法,特此说明并致谢 ********************************************************************/ #include "xgpio_l.h" #include "xparameters.h" #include "xgpio.h" #include "xbasic_types.h" #include "math.h" XGpio lcd; /////////////////////////////////////////////////////////////////////// // // 函数名 : delayus delayms // 功能描述 : 延时2us 1ms // 参数 : Xuint16 delay // 返回值 : void // /////////////////////////////////////////////////////////////////////// static void delayus(Xuint16 delay) { volatile Xuint16 i, j; for (i = 0; i < delay; i++) for (j = 0; j < 10; j++) ; } static void delayms(Xuint16 delay) { volatile Xuint16 i,j; for(i=0;ix1) { temp=x1; x1=x0; x0=temp; } do GUI_Point(x0,y,color); while(x1-(x0++)); } /*********************************************************/ /* */ /* 画竖直直线 */ /* */ /*********************************************************/ void GUI_RLine(Xuint8 x,Xuint8 y0,Xuint8 y1,Xuint8 color) { Xuint8 temp; if(y0>y1) { temp=y1; y1=y0; y0=temp; } do GUI_Point(x,y0,color); while(y1-(y0++)); } /*********************************************************/ /* */ /* 任意两点画直线 给出两点坐标 x0 y0 x1 y1 */ /* */ /*********************************************************/ void GUI_Line(Xuint8 x0,Xuint8 y0,Xuint8 x1,Xuint8 y1,Xuint8 color) { Xint8 dx,dy;//两点坐标差值 Xint8 dx_sym,dy_sym;//增长方向 Xint8 dx_x2,dy_x2; Xint8 di; if(x0==x1)//水平坐标相同 画垂线 { GUI_RLine(x0,y0,y1,color); return; } if(y0==y1)//垂直坐标相同 画水平线 { GUI_HLine(x0,x1,y0,color); return; } dx=x1-x0; dy=y1-y0; /*判断增长方向,*/ if(dx>0) dx_sym=1; else { if(dx<0) dx_sym=-1; else { GUI_RLine(x0,y0,y1,color); return; } } if(dy>0) dy_sym=1; else { if(dy<0) dy_sym=-1; else { GUI_HLine(x0,x1,y1,color); return; } } /*将dx dy取绝对值*/ dx = dx_sym * dx; dy = dy_sym * dy; /*计算2倍的dx及dy*/ dx_x2=dx*2; dy_x2=dy*2; /*使用bresenham法进行画直线*/ if(dx>=dy) //此时使用x轴为基准 { di = dy_x2 - dx; while(x0!=x1) { GUI_Point(x0,y0,color); x0 += dx_sym; if(di<0) { di += dy_x2; } else { di += dy_x2- dx_x2; y0 += dy_sym; } } GUI_Point(x0,y0,color); } else { di = dx_x2 - dy; while(y0!=y1) { GUI_Point(x0,y0,color); y0 += dy_sym; if(di<0) di += dx_x2; else { di += dx_x2-dy_x2; x0 += dx_sym; } } GUI_Point(x0,y0,color); } } /*********************************************************/ /* */ /* 画矩形 */ /* */ /*********************************************************/ void GUI_Rectangle(Xuint8 x0,Xuint8 y0,Xuint8 x1,Xuint8 y1,Xuint8 color) { GUI_HLine(x0,x1,y0,color); GUI_RLine(x0,y0,y1,color); GUI_RLine(x1,y0,y1,color); GUI_HLine(x0,x1,y1,color); } /*********************************************************/ /* */ /* 填充矩形 */ /* */ /*********************************************************/ void GUI_Rectangle_Fill(Xuint8 x0,Xuint8 y0,Xuint8 x1,Xuint8 y1,Xuint8 color) { Xuint8 temp; if(x0>x1) { temp=x0; x0=x1; x1=temp; } if(y0>y1) { temp=y0; y0=y1; y1=temp; } if(y0==y1) { GUI_HLine(x0,x1,y0,color); return; } if(x0==x1) { GUI_RLine(x0,y0,y1,color); return; } while(y0<=y1) { GUI_HLine(x0,x1,y0,color); y0++; } } /*********************************************************/ /* */ /* 画圆筒 */ /* */ /*********************************************************/ void GUI_Circle(Xuint8 x0,Xuint8 y0,Xuint8 r,Xuint8 color) { Xint8 a,b; Xint8 di; if(r>31||r==0) return; a=0; b=r; di=2-2*r; while(a<=b) { GUI_Point(x0-b,y0-a,color); GUI_Point(x0+b,y0-a,color); GUI_Point(x0-a,y0+b,color); GUI_Point(x0-b,y0-a,color); GUI_Point(x0-a,y0-b,color); GUI_Point(x0+b,y0+a,color); GUI_Point(x0+a,y0-b,color); GUI_Point(x0+a,y0+b,color); GUI_Point(x0-b,y0+a,color); a++; /*使用Bresenham算法画*/ if(di<0) di += 4*a+6; else { di += 10+4*(a-b); b--; } GUI_Point(x0+a,y0+b,color); } } /////////////////////////////////////////////////////////////////////// // // 函数名 : XromLCDInit // 功能描述 : 液晶初始化 // 返回值 : void // /////////////////////////////////////////////////////////////////////// void XromLCDInit() { XGpio_Initialize(&lcd, XPAR_LCD_DEVICE_ID); XGpio_SetDataDirection(&lcd, 1, 0x00000000); XGpio_DiscreteWrite(&lcd, 1, 0x00000000); lcd_wcmd(0x00000030,1); lcd_wcmd(0x00000030,1); lcd_wcmd(0x00000001,1); lcd_wcmd(0x00000006,1); lcd_wcmd(0x0000000c,1); } /*********************************************************/ /* */ /* 设定显示位置 */ /* */ /*********************************************************/ 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,0); } /////////////////////////////////////////////////////////////////////// // // 函数名 : print-string() // 功能描述 : 显示任意字字符或字符串 // 参数 : Xuint8 x // 参数 : Xuint8 y // 参数 : Xuint8 * string // 返回值 : void // /////////////////////////////////////////////////////////////////////// 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_wdat(lcd_temp); lcd_temp=*(++str); } } int main(void){ Xuint8 i,j; delayms(40); XromLCDInit(); // DisplayOneXint8(4,4,0x50); //print_string(1,0,"山东省电子设计大赛"); // delayms(5000); lcd_wcmd(0x01,1); clr(); for(i=0;i<124;i++) { j=35-27*sin((i-4)*3.14/30); GUI_Point(i,j,1); } delayms(1000); GUI_Circle(64,32,25,1); delayms(2000); GUI_Rectangle(2,2,126,60,1); GUI_HLine(0,127,32,1); while(1); return 0; }
相关推荐阅读
用户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
8
关闭 站长推荐上一条 /3 下一条