Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4792
  • 博文数量: 2
  • 博客积分: 30
  • 博客等级: 民兵
  • 技术积分: 25
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-20 17:14
文章分类
文章存档

2012年(2)

我的朋友
最近访客

分类: IT业界

2012-03-09 19:06:53


点击(此处)折叠或打开

  1. /*
  2.  * Lcd.c
  3.  *
  4.  * Created on: 2012-2-26
  5.  * Author: lfchenc
  6.  */
  7. #include "Lcd.h"
  8. #include "my_types.h"
  9. #include "Zimo.h"
  10. /***********************************************************/
  11. //延时函数
  12. /**********************************************************/
  13. void delayms(int count) // X1ms
  14. {
  15.  int i;
  16.  for(i=0;i<count;i++)
  17.   usleep(5);//1000hz,实际测得宇宙中最权威最完美的数据
  18. }
  19. void LCD_Writ_Bus(alt_u16 data) //并行数据写入函数
  20. {
  21.     IOWR_ALTERA_AVALON_PIO_DATA(DB_BASE,data);
  22.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,0);
  23.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,1);
  24. }
  25. void LCD_Write_COM(alt_u16 data) //发送命令
  26. {
  27.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,0);
  28.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_RD_BASE,1);
  29.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_RS_BASE,0);
  30.     LCD_Writ_Bus(data);
  31. }
  32. void LCD_Write_DATA(alt_u16 data) //发送数据
  33. {
  34.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,0);
  35.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_RD_BASE,1);
  36.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_RS_BASE,1);
  37.     LCD_Writ_Bus(data);
  38. }
  39. void LCD_WR_REG(unsigned int index,unsigned int data)
  40. {
  41.      LCD_Write_COM(index);
  42.      LCD_Write_DATA(data);
  43. }
  44. void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
  45. {
  46.     LCD_Write_COM(0x004e);LCD_Write_DATA(x1); //设置X坐标位置
  47.     LCD_Write_COM(0x004f);LCD_Write_DATA(y1); //设置Y坐标位置

  48.     LCD_Write_COM(0x0044);LCD_Write_DATA(x2<<8|x1); //开始X
  49.     LCD_Write_COM(0x0045);LCD_Write_DATA(y1); //开始Y
  50.   // LCD_Write_COM(0x0051);LCD_Write_DATA(x2); //结束X
  51.     LCD_Write_COM(0x0046);LCD_Write_DATA(y2); //结束Y
  52.     LCD_Write_COM(0x0022);
  53. }
  54. /**********************************************
  55. 函数名:Lcd块选函数
  56. 功能:选定Lcd上指定的矩形区域

  57. 注意:xStart和 yStart随着屏幕的旋转而改变,位置是矩形框的四个角

  58. 入口参数:xStart x方向的起始点
  59.           ySrart y方向的终止点
  60.           xLong 要选定矩形的x方向长度
  61.           yLong 要选定矩形的y方向长度
  62. 返回值:无
  63. ***********************************************/
  64. void Lcd_SetBox(unsigned char xStart,unsigned int yStart,unsigned char xLong,unsigned int yLong)
  65. {
  66.      u16 xSE;
  67.     LCD_SetCursor(xStart,yStart);
  68.     xSE = ((xStart+xLong-1)<<8) | (xStart);

  69.     LCD_WR_REG(0x44,xSE);//水平 GRAM起始位置
  70.   // LCD_WR_REG(0x0051,xStart+xLong-1);//水平GRAM终止位置
  71.     LCD_WR_REG(0x45,yStart);//垂直GRAM起始位置
  72.     LCD_WR_REG(0x46,yStart+yLong-1);//垂直GRAM终止位置
  73.   // LCD_WR_REG(0x07,0x233);
  74. }


  75. /*************************************************
  76. 函数名:Lcd光标起点定位函数
  77. 功能:指定320240液晶上的一点作为写数据的起始点
  78. 入口参数:x 坐标 0~239
  79.           y 坐标 0~319
  80. 返回值:无
  81. *************************************************/
  82. void LCD_SetCursor(unsigned char Xpos, unsigned int Ypos)
  83. {
  84.  // CLR_RS;
  85.   LCD_WR_REG(0x4e, Xpos);
  86.   LCD_WR_REG(0x4f, Ypos);
  87. }
  88. /*===========================================================================
  89. ** 函数名称: LCD_reset()
  90. ** 功能描述: 复位LCD,注意,有时需调整前后两个delay()的输入值大小
  91. ============================================================================*/
  92. void LCD_reset(void)
  93. {
  94.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_RST_BASE,0);
  95.     delayms(5);
  96.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_RST_BASE,1);
  97.     delayms(5);
  98. }
  99. //=================================
  100. void DelayNS(uint time)
  101. {
  102.     while(time--!=0);
  103. }
  104. void LCD_Init(void)
  105. {
  106.     LCD_reset();
  107.     LCD_WR_REG(0x0000,0x0001); DelayNS(1000); //打开晶振
  108.     LCD_WR_REG(0x0003,0xA8A4); DelayNS(1000); //0xA8A4
  109.     LCD_WR_REG(0x000C,0x0000); DelayNS(1000);
  110.     LCD_WR_REG(0x000D,0x080C); DelayNS(1000);
  111.     LCD_WR_REG(0x000E,0x2B00); DelayNS(1000);
  112.     LCD_WR_REG(0x001E,0x00B0); DelayNS(1000);
  113.     LCD_WR_REG(0x0001,0x2B3F); DelayNS(1000); //驱动输出控制320*240 0x6B3F
  114.     LCD_WR_REG(0x0002,0x0600); DelayNS(1000);
  115.     LCD_WR_REG(0x0010,0x0000); DelayNS(1000);
  116.     LCD_WR_REG(0x0011,0x6070); DelayNS(1000); //0x4030 //定义数据格式 16位色
  117.     LCD_WR_REG(0x0005,0x0000); DelayNS(1000);
  118.     LCD_WR_REG(0x0006,0x0000); DelayNS(1000);
  119.     LCD_WR_REG(0x0016,0xEF1C); DelayNS(1000);
  120.     LCD_WR_REG(0x0017,0x0003); DelayNS(1000);
  121.     LCD_WR_REG(0x0007,0x0233); DelayNS(1000); //0x0233
  122.     LCD_WR_REG(0x000B,0x0000); DelayNS(1000);
  123.     LCD_WR_REG(0x000F,0x0000); DelayNS(1000); //扫描开始地址
  124.     LCD_WR_REG(0x0041,0x0000); DelayNS(1000);
  125.     LCD_WR_REG(0x0042,0x0000); DelayNS(1000);
  126.     LCD_WR_REG(0x0048,0x0000); DelayNS(1000);
  127.     LCD_WR_REG(0x0049,0x013F); DelayNS(1000);
  128.     LCD_WR_REG(0x004A,0x0000); DelayNS(1000);
  129.     LCD_WR_REG(0x004B,0x0000); DelayNS(1000);
  130.     LCD_WR_REG(0x0044,0xEF00); DelayNS(1000);
  131.     LCD_WR_REG(0x0045,0x0000); DelayNS(1000);
  132.     LCD_WR_REG(0x0046,0x013F); DelayNS(1000);
  133.     LCD_WR_REG(0x0030,0x0707); DelayNS(1000);
  134.     LCD_WR_REG(0x0031,0x0204); DelayNS(1000);
  135.     LCD_WR_REG(0x0032,0x0204); DelayNS(1000);
  136.     LCD_WR_REG(0x0033,0x0502); DelayNS(1000);
  137.     LCD_WR_REG(0x0034,0x0507); DelayNS(1000);
  138.     LCD_WR_REG(0x0035,0x0204); DelayNS(1000);
  139.     LCD_WR_REG(0x0036,0x0204); DelayNS(1000);
  140.     LCD_WR_REG(0x0037,0x0502); DelayNS(1000);
  141.     LCD_WR_REG(0x003A,0x0302); DelayNS(1000);
  142.     LCD_WR_REG(0x003B,0x0302); DelayNS(1000);
  143.     LCD_WR_REG(0x0023,0x0000); DelayNS(1000);
  144.     LCD_WR_REG(0x0024,0x0000); DelayNS(1000);
  145.     LCD_WR_REG(0x0025,0x8000); DelayNS(1000);
  146.     LCD_WR_REG(0x004f,0); //行首址0
  147.     LCD_WR_REG(0x004e,0); //列首址0
  148. }
  149. /***************************************************************
  150. 函数名称 : Pant(alt_u16 data)
  151. 功能描述 : 屏幕清屏
  152. 输入参数 : data 清屏颜色
  153. 输出参数 :
  154. 返回值 :
  155. ***************************************************************/
  156. void Pant(alt_u16 data)
  157. {
  158.     int i,j;
  159.     IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,0); //打开片选使能
  160.     Address_set(0,0,239,319);
  161.     for(i=0;i<320;i++)
  162.      {
  163.       for (j=0;j<240;j++)
  164.         {
  165.              LCD_Write_DATA(data);
  166.         }

  167.       }
  168. // IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,1); //关闭片选使能
  169. }
  170. /***************************************************************
  171. 函数名称 : LCD_write_english(unsigned char data,unsigned int color,unsigned int xcolor)//
  172. 功能描述 : 英文字符显示 配合LCD_write_english使用
  173. 输入参数 : data 字符
  174.     color:前景颜色
  175.     xcolor:背景颜色
  176. 输出参数 :
  177. 返回值 :
  178. ***************************************************************/
  179. void LCD_write_english(unsigned char data,unsigned int color,unsigned int xcolor)//写字符
  180. {

  181.     unsigned char avl,i,n;
  182.     LCD_Write_COM(0x0022);
  183.     for (i=0;i<16;i++)
  184.     {
  185.       avl=english[data-32][i];
  186.       for (n=0;n<8;n++)
  187.        {
  188.             if(avl&0x80) LCD_Write_DATA(color);
  189.              else LCD_Write_DATA(xcolor);

  190.          avl<<=1;
  191.        }
  192.     }
  193. }
  194. /***************************************************************
  195. 函数名称 : LCD_write_english_string(unsigned int x,unsigned int y,unsigned char *s,unsigned int color,unsigned int xcolor)
  196. 功能描述 : 英文字符串显示
  197. 输入参数 : x:0~239
  198.     y:0~319
  199.     s 字符串
  200.     color:前景颜色
  201.     xcolor:背景颜色
  202. 输出参数 :
  203. 返回值 :
  204. ***************************************************************/
  205. void LCD_write_english_string(unsigned int x,unsigned int y,unsigned char *s,unsigned int color,unsigned int xcolor)//英文字符串显示
  206. {
  207.  unsigned int k=0;
  208.  IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,0); //打开片选使能
  209.  while (*s)
  210.   {
  211.      Lcd_SetBox(x+k,y,8,16);
  212.      LCD_write_english( *s,color,xcolor);
  213.      k=k+8;
  214.      s++;

  215.   }

  216. }
  217. /***************************************************************
  218. 函数名称 : LCD_DrawPoint(u16 x,u16 y)
  219. 功能描述 : 画点
  220. 输入参数 : x:0~239
  221.     y:0~319
  222.     POINT_COLOR:此点的颜色
  223. 输出参数 :
  224. 返回值 :
  225. ***************************************************************/
  226. void LCD_DrawPoint(unsigned int x,unsigned int y,unsigned int POINT_COLOR)
  227. {
  228. LCD_SetCursor(x,y);//设置光标位置
  229. LCD_Write_COM(0x0022);
  230. LCD_Write_DATA(POINT_COLOR);
  231. }
  232. /***************************************************************
  233. 函数名称 : LCD_DrawPic240_320(unsigned char *Pic)
  234. 功能描述 : 画一张240*320图片
  235. 输入参数 : Pic 图片数据
  236. 输出参数 :
  237. 返回值 :
  238. ***************************************************************/
  239. void LCD_DrawPic240_320(unsigned char *Pic)
  240. {
  241.  u32 i;
  242.  TES Pix;
  243.  LCD_Write_COM(0x0022);
  244.  Lcd_SetBox(0,0,240,320);
  245.  for(i=0;i<76800;i++)
  246.  {
  247.  LCD_Write_COM(0x0022);
  248.  Pix.p[0]=Pic[2*i];
  249.  Pix.p[1]=Pic[2*i+1];
  250.  LCD_Write_DATA(Pix.all);
  251.  }
  252. }
  253. /***************************************************************
  254. 函数名称 : LCD_DrawPic(unsigned char *Pic,unsigned int StartX,unsigned int StartY,unsigned int XLong,unsigned int YLong)
  255. 功能描述 : 画一张XLong*YLong 图片
  256. 输入参数 : Pic 图片数据 StartX x起点坐标 StartY y起点坐标
  257. 输出参数 :
  258. 返回值 :
  259. ***************************************************************/
  260. void LCD_DrawPic(unsigned char *Pic,unsigned int StartX,unsigned int StartY,unsigned int XLong,unsigned int YLong)
  261. {
  262.  u32 i;
  263.  TES Pix;
  264.  u32 temp;
  265.  temp = XLong*YLong;
  266.  LCD_Write_COM(0x0022);
  267.  Lcd_SetBox(StartX,StartY,XLong,YLong);
  268.  for(i=0;i<temp;i++)
  269.  {
  270.  LCD_Write_COM(0x0022);
  271.  Pix.p[0]=Pic[2*i];
  272.  Pix.p[1]=Pic[2*i+1];
  273.  LCD_Write_DATA(Pix.all);
  274.  }
  275. }




阅读(606) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~