单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3143|回复: 4
收起左侧

Cortex-M3学习LPC1768 - TFT实验

[复制链接]
xiongxiao 发表于 2015-5-27 19:37 | 显示全部楼层 |阅读模式
自己用的LPC1768的开板带有一块2.4寸的TFT彩色液晶屏,虽然自己工作中还用不过显示屏,但是晚上闲着也是闲着,于是继续玩咱的LPC1768吧。

我的开发板上的液晶屏的用的是SPI接口,当然你也可以把它设计成并行口,其接口电路如下所示:

    话说这个液晶屏的驱动芯片是ILI9325,在网上下载了该芯片的数据手册,好家伙有111页,全是E文呀,没办法,谁让咱是小电工呢,就慢慢啃吧。ILI9325这个芯片的寄存器比较多,不过没关系,我们暂时用到的不是太多,这里只要简要的总结,剩下的还是日后用到了再好好研究吧。
1、寄存器03H(Entry Mode),该寄存器主要设置图像的显示模式,包括屏幕的扫描方式(水平扫描或垂直扫描),这直接影响到img2lcd软件(这是个取模软件)的扫描方式控制项。
2、寄存器04H(Resizing Control Register)重新调整大小 寄存器,通过配置该寄存器,可以调整所显示图片的大小。
3、寄存器07H(Display Control 1),配置该寄存器可打开或关闭图形。
4、水平和垂直位置的RAM地址(R50h,R51h,R52h,R53h)
    看手册上寄存器不少,不过控制方式不一样,所用到的寄存器不一样,这里不再列举寄存器,想做驱动,一定要看芯片的手册,而且一定要仔细的研究它的手册。话说写液晶驱动不显示图片什么的貌似对不起LCD,当然这次懒猫这次写的驱动也有图片显示,想图片显示当然少不了取模软件,懒猫这次用的取模软件是img2lcd,这个软件功能不错,用起来也比较简单,如果不会用可以查看一下它自带的帮助文件。
    注意:LCD的配置方式不同,所设置的扫描方式也不同。
   好了,贴上咱写的这个驱动;
  1. /********************************************************************************
  2. * 函数名称 :GLCD_clear (unsigned short color)
  3. * 函数描述 : 清屏
  4. * 入口参数 : 无
  5. * 出口参数 : 无
  6. * 备    注:
  7. *******************************************************************************/
  8. void GLCD_clear (unsigned short color)
  9. {
  10.   unsigned int   i;

  11.   wr_reg(0x20, 0);        // 1st line GRAM Data(AD0-AD7)
  12.   wr_reg(0x21, 0);        // 1st line GRAM Data(AD8-AD16)
  13.   wr_cmd(0x22);
  14.   for(i = 0; i < (WIDTH*HEIGHT); i++){
  15.     wr_dat(color);        // Set color of background
  16.   }
  17. }

  18. /********************************************************************************
  19. * 函数名称 :void GLCD_bitmap (unsigned int x, unsigned int y, unsigned int w,
  20. *                              unsigned int h, unsigned char *bitmap)
  21. * 函数描述 : 显示图片
  22. * 入口参数 : unsigned int x  --  Vertical   GRAM Start Address
  23. *            unsigned int y  --  Horizontal GRAM Start Address
  24. *            unsigned int w  --  The width of picture
  25. *            unsigned int h  --  The high of picture
  26. *            unsigned char *bitmap  --  The array which store picture
  27. * 出口参数 : 无
  28. * 备    注:
  29. *******************************************************************************/
  30. void GLCD_bitmap (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char *bitmap)
  31. {
  32.   unsigned int   i;
  33.   unsigned int   len = w*h;                            /* 数组长度 = 图片的width*high(注:元素是16位的) */

  34.   /* 用Img2Lcd这个软件生成的数组是char型的(元素是8位的),需转换成short型(元素是16位的)   */
  35.   unsigned short *bitmap_ptr = (unsigned short *)bitmap;

  36.   wr_reg(0x50, y);                      /* 水平GRAM起始地址       */
  37.   wr_reg(0x51, y+h-1);                  /* 水平GRAM结束地址(-1) */
  38.   wr_reg(0x52, x);                      /* 垂直GRAM起始地址       */
  39.   wr_reg(0x53, x+w-1);                  /* 垂直GRAM结束地址(-1) */

  40.   wr_reg(0x20, y);                                                                                /* GRAM水平垂直地址设置   */
  41.   wr_reg(0x21, x);

  42.   wr_cmd(0x22);                                     /* 写数据到GRAM,AC自动加  */
  43.   for (i = 0; i < len; i++) {           /* 开始写数据             */
  44.     wr_dat(*bitmap_ptr++);                /* 向GRAM写入数据 */
  45.   }
  46. }
复制代码

glcd.c
  1. /*********************************************************************************
  2. 文件名称:GLCD.c
  3. 功    能: 关于ILI9325的一些函数                                                         
  4. 编译环境: MDKV4.12                                                   
  5. 时    钟: 外部12Mhz                                                                                           
  6. 日    期: 12/03/19                                                        
  7. 作    者: 懒猫爱飞
  8. 备    注:NULL
  9. ---------------------------------------------------------------------------------
  10. 修改内容:NULL
  11. 修改日期:XXXX年xx月xx日      xx时xx分
  12. 修改人员:xxx xxx xxx
  13.                                                                                                          
  14. **********************************************************************************/
  15. #include "GLCD.inc"


  16. /********************************************************************************
  17. * 函数名称 :__inline static void delay (int cnt)
  18. * 函数描述 : 简短延时
  19. * 入口参数 : 无
  20. * 出口参数 : 无
  21. * 备    注 :
  22. *******************************************************************************/
  23. __inline static void delay (int cnt) {

  24.   cnt <<= DELAY_2N;
  25.   while (cnt--);
  26. }

  27. /********************************************************************************
  28. * 函数名称 :__inline void wr_cmd (unsigned char c)
  29. * 函数描述 : 通过ssp1向LCD写命令
  30. * 入口参数 : 无
  31. * 出口参数 : 无
  32. * 备    注 :
  33. *******************************************************************************/
  34. static __inline void wr_cmd (unsigned char cmd)
  35. {
  36.   LCD_EN();                                          /* Enable ILI9325 */
  37.   ssp_send(SSP_START | SSP_WR | SSP_INDEX);   /* Write : RS = 0, RW = 0       */
  38.   ssp_send(0);
  39.   ssp_send(cmd);                              /* Send the command */
  40.   LCD_DIS();                                  /* Disable ILI9325 */        
  41. }

  42. /********************************************************************************
  43. * 函数名称 :__inline void wr_dat (unsigned char dat)
  44. * 函数描述 : 通过ssp1向LCD写数据
  45. * 入口参数 : 无
  46. * 出口参数 : 无
  47. * 备    注 :
  48. *******************************************************************************/
  49. static __inline void wr_dat (unsigned short dat)
  50. {

  51.   LCD_EN();                                          /* Enable ILI9325 */
  52.   ssp_send(SSP_START | SSP_WR | SSP_DATA);    /* Write : RS = 1, RW = 0       */
  53.   ssp_send((dat >>   8));                     /* Write D8..D15                */
  54.   ssp_send((dat & 0xFF));                     /* Write D0..D7                 */
  55.   LCD_DIS();                                  /* Disable ILI9325 */
  56. }

  57. /********************************************************************************
  58. * 函数名称 :__inline unsigned short rd_dat (void)
  59. * 函数描述 : 通过ssp1读取数据
  60. * 入口参数 : 无
  61. * 出口参数 : 无
  62. * 备    注 :
  63. *******************************************************************************/
  64. static __inline unsigned short rd_dat (void)
  65. {
  66.   unsigned short val = 0;

  67.   LCD_EN();                                          /* Enable ILI9325 */
  68.   ssp_send(SSP_START | SSP_RD | SSP_DATA);    /* Read: RS = 1, RW = 1         */
  69.   ssp_send(0);                                /* Dummy read                   */
  70.   val   = ssp_send(0);                        /* Read D8..D15                 */
  71.   val <<= 8;
  72.   val  |= ssp_send(0);                        /* Read D0..D7                  */
  73.   LCD_DIS();                                  /* Disable ILI9325 */
  74.   return (val);
  75. }

  76. /********************************************************************************
  77. * 函数名称 :__inline void wr_reg (unsigned char reg, unsigned short val)
  78. * 函数描述 : 通过ssp1向LCD寄存器写数据
  79. * 入口参数 : 无
  80. * 出口参数 : 无
  81. * 备    注 :
  82. *******************************************************************************/
  83. static __inline void wr_reg (unsigned char reg, unsigned short val)
  84. {
  85.   wr_cmd(reg);
  86.   wr_dat(val);
  87. }



  88. /********************************************************************************
  89. * 函数名称 :unsigned short rd_reg (unsigned char reg)
  90. * 函数描述 : 通过ssp1从LCD寄存器读取数据
  91. * 入口参数 : 无
  92. * 出口参数 : 无
  93. * 备    注 :
  94. *******************************************************************************/
  95. static unsigned short rd_reg (unsigned char reg)
  96. {

  97.   wr_cmd(reg);
  98.   return (rd_dat());
  99. }

  100. /********************************************************************************
  101. * 函数名称 :void GLCD_init (void)
  102. * 函数描述 : LCD初始化
  103. * 入口参数 : 无
  104. * 出口参数 : 无
  105. * 备    注 :
  106. *******************************************************************************/
  107. void GLCD_init (void)
  108. {
  109.     wr_reg(0xE3, 0x3008);  
  110.     wr_reg(0xE7, 0x0012);  
  111.     wr_reg(0xEF, 0x1231);
  112.     /* 源扫描设置SS=0, 输出的移动方向是从S1到S720
  113.          * (源扫描设置SS=1, 输出的移动方向是从S720到S1)
  114.          * SM=0,逐行扫描(SM=1,隔行扫描)
  115.         */       
  116.         wr_reg(0x00, 0x0001);                 /* Start internal OSC                 */
  117.     wr_reg(0x01, 0x0100);                 /* Set SS and SM bit                  */
  118.     wr_reg(0x02, 0x0700);                 /* Set 1 line inversion               */
  119.         wr_reg(0x03, 0x1030);                 /* GRAM为水平扫描方向(BGR=1)        */
  120.     //wr_reg(0x03, 0x1031);                 /* GRAM为垂直扫描方向(BGR=1)        */
  121.     wr_reg(0x04, 0x0000);                 /* Resize register                    */
  122.     wr_reg(0x08, 0x0207);                 /* 2 lines each, back and front porch */
  123.     wr_reg(0x09, 0x0000);                 /* Set non-disp area refresh cyc ISC  */
  124.     wr_reg(0x0A, 0x0000);                 /* FMARK function                     */
  125.     wr_reg(0x0C, 0x0000);                 /* RGB interface setting              */
  126.     wr_reg(0x0D, 0x0000);                 /* Frame marker Position              */
  127.     wr_reg(0x0F, 0x0000);                 /* RGB interface polarity             */

  128.     /* Power On sequence -------------------------------------------------------*/
  129.     wr_reg(0x10, 0x0000);                 /* Reset Power Control 1              */
  130.     wr_reg(0x11, 0x0007);                 /* Reset Power Control 2              */
  131.     wr_reg(0x12, 0x0000);                 /* Reset Power Control 3              */
  132.     wr_reg(0x13, 0x0000);                 /* Reset Power Control 4              */
  133.     delay(20);                            /* Discharge cap power voltage (200ms)*/
  134.     wr_reg(0x10, 0x1690);                 /* SAP, BT[3:0], AP, DSTB, SLP, STB   */
  135.     wr_reg(0x11, 0x0227);                 /* DC1[2:0], DC0[2:0], VC[2:0]        */
  136.     delay(5);                             /* Delay 50 ms                        */
  137.     wr_reg(0x12, 0x001B);                 /* VREG1OUT voltage                   */
  138.     delay(5);                             /* Delay 50 ms                        */
  139.     wr_reg(0x13, 0x1600);                 /* VDV[4:0] for VCOM amplitude        */
  140.     wr_reg(0x29, 0x0018);                 /* VCM[4:0] for VCOMH                 */
  141.     wr_reg(0x2B, 0x000C);  
  142.     delay(5);                             /* Delay 50 ms                        */
  143.     wr_reg(0x20, 0x0000);                 /* GRAM horizontal Address            */
  144.     wr_reg(0x21, 0x0000);                 /* GRAM Vertical Address              */
  145.   
  146.     /* Adjust the Gamma Curve --------------------------------------------------*/
  147.     wr_reg(0x30, 0x0000);
  148.     wr_reg(0x31, 0x0404);
  149.     wr_reg(0x32, 0x0304);
  150.     wr_reg(0x35, 0x0005);
  151.     wr_reg(0x36, 0x1604);
  152.     wr_reg(0x37, 0x0304);
  153.     wr_reg(0x38, 0x0303);
  154.     wr_reg(0x39, 0x0707);
  155.     wr_reg(0x3C, 0x0500);
  156.     wr_reg(0x3D, 0x000F);
  157.   
  158.     /* Set GRAM area -----------------------------------------------------------*/
  159.     wr_reg(0x50, 0x0000);                 /* Horizontal GRAM Start Address      */
  160.     wr_reg(0x51, (HEIGHT-1));             /* Horizontal GRAM End   Address      */
  161.     wr_reg(0x52, 0x0000);                 /* Vertical   GRAM Start Address      */
  162.     wr_reg(0x53, (WIDTH-1));              /* Vertical   GRAM End   Address      */
  163.     wr_reg(0x60, 0xA700);                 /* Gate Scan Line                     */
  164.     wr_reg(0x61, 0x0001);                 /* NDL,VLE, REV                       */
  165.     wr_reg(0x6A, 0x0000);                 /* Set scrolling line                 */

  166.     /* Partial Display Control -------------------------------------------------*/
  167.     wr_reg(0x80, 0x0000);
  168.     wr_reg(0x81, 0x0000);
  169.     wr_reg(0x82, 0x0000);
  170.     wr_reg(0x83, 0x0000);
  171.     wr_reg(0x84, 0x0000);
  172.     wr_reg(0x85, 0x0000);

  173.     /* Panel Control -----------------------------------------------------------*/
  174.     wr_reg(0x90, 0x0010);
  175.     wr_reg(0x92, 0x6000);
  176. //  wr_reg(0x93, 0x0003);
  177. //  wr_reg(0x95, 0x0110);
  178. //  wr_reg(0x97, 0x0000);
  179. //  wr_reg(0x98, 0x0000);

  180.     /* Set GRAM write direction and BGR = 1
  181.        I/D=10 (Horizontal : increment, Vertical : increment)
  182.        AM=1 (address is updated in vertical writing direction)                  */  
  183.     wr_reg(0x03, 0x1038);

  184.     wr_reg(0x07, 0x0133);                 /* 262K color and display ON          */

  185.         BACK_LIGHT_ON();                      /* Turn backlight on */
  186. }

  187. /********************************************************************************
  188. * 函数名称 :GLCD_clear (unsigned short color)
  189. * 函数描述 : 清屏
  190. * 入口参数 : 无
  191. * 出口参数 : 无
  192. * 备    注 :
  193. *******************************************************************************/
  194. void GLCD_clear (unsigned short color)
  195. {
  196.   unsigned int   i;

  197.   wr_reg(0x20, 0);        // 1st line GRAM Data(AD0-AD7)
  198.   wr_reg(0x21, 0);        // 1st line GRAM Data(AD8-AD16)
  199.   wr_cmd(0x22);
  200.   for(i = 0; i < (WIDTH*HEIGHT); i++){
  201.     wr_dat(color);        // Set color of background
  202.   }
  203. }

  204. /********************************************************************************
  205. * 函数名称 :void GLCD_bitmap (unsigned int x, unsigned int y, unsigned int w,
  206. *                              unsigned int h, unsigned char *bitmap)
  207. * 函数描述 : 显示图片
  208. * 入口参数 : unsigned int x  --  Vertical   GRAM Start Address
  209. *            unsigned int y  --  Horizontal GRAM Start Address
  210. *            unsigned int w  --  The width of picture
  211. *            unsigned int h  --  The high of picture
  212. *            unsigned char *bitmap  --  The array which store picture
  213. * 出口参数 : 无
  214. * 备    注 :
  215. *******************************************************************************/
  216. void GLCD_bitmap (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char *bitmap)
  217. {
  218.   unsigned int   i;
  219.   unsigned int   len = w*h;                        /* 数组长度 = 图片的width*high(注:元素是16位的) */

  220.   /* 用Img2Lcd这个软件生成的数组是char型的(元素是8位的),需转换成short型(元素是16位的)   */
  221.   unsigned short *bitmap_ptr = (unsigned short *)bitmap;

  222.   wr_reg(0x50, y);                      /* 水平GRAM起始地址       */
  223.   wr_reg(0x51, y+h-1);                  /* 水平GRAM结束地址(-1) */
  224.   wr_reg(0x52, x);                      /* 垂直GRAM起始地址       */
  225.   wr_reg(0x53, x+w-1);                  /* 垂直GRAM结束地址(-1) */

  226.   wr_reg(0x20, y);                                                /* GRAM水平垂直地址设置   */
  227.   wr_reg(0x21, x);

  228.   wr_cmd(0x22);                                /* 写数据到GRAM,AC自动加  */
  229.   for (i = 0; i < len; i++) {           /* 开始写数据             */
  230.     wr_dat(*bitmap_ptr++);                    /* 向GRAM写入数据 */
  231.   }
  232. }






复制代码

主程序:
  1. /*********************************************************************************
  2. 工程名称:lesson8
  3. 功    能: 学习使用TFT屏                                         
  4. 编译环境: MDKV4.12                                                   
  5. 时    钟: 外部12Mhz                                                                                           
  6. 日    期: 12/04/12                                                      
  7. 作    者: 懒猫爱飞
  8. 版本  号:V1R0
  9. ---------------------------------------------------------------------------------
  10. 修改内容:NULL
  11. 修改日期:
  12. 修改人员:
  13. ---------------------------------------------------------------------------------
  14.                                                                                                                                                                                                                          
  15. **********************************************************************************/


  16. /*********************************************************************************
  17. 文件名称:mian.c
  18. 功    能: 主要调度函数及应用函数                                                         
  19. 编译环境: MDKV4.12                                                   
  20. 时    钟: 外部12Mhz                                                                                           
  21. 日    期: 11/09/14                                                        
  22. 作    者: 懒猫爱飞
  23. 备    注:NULL
  24. ---------------------------------------------------------------------------------
  25. 修改内容:NULL
  26. 修改日期:XXXX年xx月xx日      xx时xx分
  27. 修改人员:xxx xxx xxx
  28.                                                                                                          
  29. **********************************************************************************/
  30. #include"includes.h"
  31.                                                                             
  32. /* 全局变量声明 */

  33. /* 局部变量声明 */
  34. unsigned char OpenString[][50] = {
  35.                                 "**********************************************\r\n",
  36.                                 "****             --欢迎光临--             ****\r\n",
  37.                                                                 "**** 小野兽的小草窝^_^                    ****\r\n",
  38.                                                                 "**** http://blog#ednchina#com/ytfdhb/     ****\r\n",
  39.                                                                 "**** 我是懒猫爱飞,我的口号是:           ****\r\n",
  40.                                                                 "**** 每天进步一点点,开心多一点^_^        ****\r\n",
  41.                                                                 "**********************************************\r\n"
  42.                                                             };
  43. unsigned short colortab[16] = {Black,Navy,DarkGreen,DarkCyan ,Maroon ,Purple,Olive,LightGrey ,
  44.                                DarkGrey,Blue,Green,Cyan,Red,Magenta,Yellow,White};



  45. /* 函数声明 */
  46. void board_init(void);  /* 系统初始始化 */



  47. /********************************************************************************
  48. * 函数名称 :int main(void)
  49. * 函数功能 : 主函数
  50. * 入口参数 : 无
  51. * 出口参数 : 无
  52. * 备    注 :无
  53. *******************************************************************************/
  54. int main(void)
  55. {
  56.     unsigned int i = 0;
  57.         //unsigned char cnt = 0;

  58.         board_init(); /* 系统初始化 */

  59.         for(i=0;i<7;i++)
  60.         {
  61.                 UARTSend(0,OpenString[i],50);            /* 发送欢迎信息 */
  62.         }

  63.         GLCD_init();
  64.         GLCD_clear(Red);
  65.         DelayMs(500);
  66.        
  67.        
  68.     //GLCD_bitmap (  0,   0, 320,  128, ARM_Ani_16bpp_fh_fv);

  69.         //GLCD_bitmap (30,  10,   259, 99, (unsigned char *)gImage_dd);          // 已正确显示
  70.         //GLCD_bitmap (0,  0,   320, 240, (unsigned char *)gImage_love);
  71.         //DelayMs(2000);
  72.         //GLCD_clear(0x0000);
  73.         //GLCD_bitmap (0,  0,   320, 240, (unsigned char *)gImage_great);
  74.         //DelayMs(2000);
  75.         //DelayMs(2000);

  76.         while(1)
  77.         {

  78.                 GLCD_bitmap (0,  0,   320, 240, (unsigned char *)gImage_great);
  79.             DelayMs(5000);
  80.                 GLCD_bitmap (0,  0,   320, 240, (unsigned char *)gImage_love);
  81.                 DelayMs(5000);
  82.                 GLCD_bitmap (0,  0,   320, 240, (unsigned char *)gImage_butterfly);
  83.                 DelayMs(5000);
  84.                 //GLCD_bitmap (0,  0,   320, 240, (unsigned char *)gImage_beauty);
  85.                 //DelayMs(3000);
  86.                 //GLCD_bitmap (0,  0,   320, 240, (unsigned char *)gImage_hand);
  87.                 //DelayMs(3000);
  88.                 //GLCD_bitmap (0,  0,   320, 240, (unsigned char *)gImage_aether);
  89.                 //DelayMs(3000);
  90.                
  91.         }

  92. }

  93. /********************************************************************************
  94. * 函数名称 :void board_init(void)
  95. * 函数功能 : 初始化系统
  96. * 入口参数 : 无
  97. * 出口参数 : 无
  98. * 备    注 :无
  99. *******************************************************************************/
  100. void board_init(void)
  101. {
  102.         SystemInit();       /* 系统初始化,函数在system_LPC17xx.c文件夹中定义 */
  103.         SysTick_init ();    /*  配置节拍定时器中断,每1ms中断一次 */
  104.                                                 
  105.     PortInit();         /* 端口初始化 */
  106.         //DACInit();          /* DAC初始化 */                     
  107.         //AdcInit();                    /* ADCC初始化 */
  108.         UARTInit(0,19200);  /* 设置串口0波特率 */
  109.         ssp_init();
  110.          //init_ssp();   
  111. }





复制代码


由于原代码比较多,这里只贴上部分函数,具体的代码,请参考附件,这里上传几张效果图,懒猫已把液晶屏显示字符,显示汉字,画圆,画线等的程序写好了,改天整理一下也发上来,下一步弄一下SD卡,USB方面的东东,今天先写这么多吧。


每天进步一点点,开心多一点^_^
完整程序源代码工程文件下载地址: 21935.rar (1.55 MB, 下载次数: 16)
回复

使用道具 举报

Erefalas 发表于 2016-12-28 23:55 | 显示全部楼层
haobang
回复

使用道具 举报

Erefalas 发表于 2016-12-28 23:55 | 显示全部楼层
dazan
回复

使用道具 举报

无效楼层,该帖已经被删除
Erefalas 发表于 2016-12-29 23:37 | 显示全部楼层
谢谢提供
回复

使用道具 举报

zdg20042586 发表于 2017-1-17 11:19 | 显示全部楼层
最近一直在学习,谢谢分享哈...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

快速回复 返回顶部 返回列表