STM32并口16bit方式驱动ILI9341代码分享

2019-12-12 18:12发布

  1. #include "lcd.h"
  2. #include "stdlib.h"
  3. #include "font.h"
  4. #include "delay.h"         
  5.                                          
  6. //画笔颜 {MOD},背景颜 {MOD}
  7. u16 POINT_COLOR = 0x0000, BACK_COLOR = WHITE;//0xFFFF;  

  8. //写寄存器函数
  9. void LCD_WR_REG(u8 data)
  10. {
  11.         LCD_RS_CLR;//写地址  
  12.         LCD_CS_CLR;        
  13.         LCD_RD_SET;
  14.         LCD_WR_CLR;

  15.         DATAOUT(data);         
  16.         LCD_WR_SET;
  17.         LCD_RS_SET;
  18.         LCD_CS_SET;  
  19. }

  20. //写寄存器
  21. void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
  22. {       
  23.         LCD_WR_REG(LCD_Reg);  
  24.         LCD_WR_DATA(LCD_RegValue);                             
  25. }         

  26. //开始写GRAM
  27. void LCD_WriteRAM_Prepare(void)
  28. {
  29.         LCD_WR_REG(0x2C);
  30. }         
  31. //LCD写GRAM
  32. void LCD_WriteRAM(u16 RGB_Code)
  33. {                                                            
  34.         LCD_WR_DATA(RGB_Code);//写十六位GRAM
  35. }
  36. //从ILI93xx读出的数据为GBR格式,而我们写入的时候为RGB格式。
  37. //通过该函数转换
  38. //c:GBR格式的颜 {MOD}值
  39. //返回值:RGB格式的颜 {MOD}值
  40. u16 LCD_BGR2RGB(u16 c)
  41. {
  42.         u16  r,g,b,rgb;   
  43.         b=(c>>0)&0x1f;
  44.         g=(c>>5)&0x3f;
  45.         r=(c>>11)&0x1f;         
  46.         rgb=(b<<11)+(g<<5)+(r<<0);                 
  47.         return(rgb);
  48. }                 

  49. //LCD开启显示        ILI9341
  50. void LCD_DisplayOn(void)
  51. {                                          
  52.         LCD_WR_REG(0X29); //26万 {MOD}显示开启
  53. }         
  54. //LCD关闭显示        ILI9341
  55. void LCD_DisplayOff(void)
  56. {          
  57.         LCD_WR_REG(0X28);//关闭显示
  58. }   
  59. //设置光标位置
  60. //Xpos:横坐标
  61. //Ypos:纵坐标
  62. void LCD_SetCursor(u16 Xpos, u16 Ypos)
  63. {
  64.         LCD_WR_REG(0X2A);
  65.         LCD_WR_DATA(Xpos>>8);
  66.         LCD_WR_DATA(Xpos&0XFF);         
  67.         LCD_WR_REG(0X2B);
  68.         LCD_WR_DATA(Ypos>>8);
  69.         LCD_WR_DATA(Ypos&0XFF);
  70. }  
  71. //画点
  72. //x:0~239
  73. //y:0~319
  74. //POINT_COLOR:此点的颜 {MOD}
  75. void LCD_DrawPoint(u16 x,u16 y)
  76. {
  77.         LCD_SetCursor(x,y);//设置光标位置
  78.         LCD_WR_REG(0X2C);//开始写入GRAM
  79.         LCD_WR_DATA(POINT_COLOR);
  80. }          

  81. void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
  82. {                    
  83.         LCD_WR_REG(0x2A);
  84.         LCD_WR_DATA(x>>8);
  85.         LCD_WR_DATA(x&0XFF);         
  86.         LCD_WR_REG(0x2B);
  87.         LCD_WR_DATA(y>>8);
  88.         LCD_WR_DATA(y&0XFF);
  89.                  
  90.         LCD_WR_REG(0X2C);//开始写入GRAM
  91.         LCD_WR_DATA(color);
  92. }         
  93. //初始化lcd
  94. //该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!!
  95. //在其他型号的驱动芯片上没有测试!
  96. void LCD_Init(void)
  97. {
  98.         GPIO_InitTypeDef  GPIO_InitStructure;
  99.             
  100.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE );
  101.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);        //JTAG-DP 失能 + SW-DP使能
  102.        
  103.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  104.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  105.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  106.         GPIO_Init(GPIOD, &GPIO_InitStructure);                                                             
  107.         GPIO_Write(GPIOD,0XFF);
  108.        
  109.         //LCDBL,RD,WR,RS,CS
  110.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  111.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  112.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  113.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  114.         GPIO_SetBits(GPIOB, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //CS RS WR RD
  115.   
  116.         //LCDRESET
  117.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_15;
  118.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输LCDRESET
  119.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  120.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  121.         GPIO_SetBits(GPIOA, GPIO_Pin_15);                                                                                                                             
  122.        
  123.         LCDBKON;//点亮LCD背光

  124.         //***************************RESET LCD Driver******************************
  125.         LCD_RESET_SET;       //reset-->1
  126.         delay_ms(1);         //Delay 1ms
  127.         LCD_RESET_CLR;       //reset-->0
  128.         delay_ms(10);        //Delay 10ms
  129.         LCD_RESET_SET;       //reset-->1
  130.         delay_ms(120);       //Delay 200ms
  131.         //************************Start initial sequence***************************

  132.         LCD_WR_REG(0xCF);
  133.                         LCD_WR_DATA(0x00);
  134.                         LCD_WR_DATA(0xDB);//83
  135.                         LCD_WR_DATA(0X30);

  136.         LCD_WR_REG(0xB1);           
  137.                         LCD_WR_DATA(0x00);
  138.                         LCD_WR_DATA(0x18);

  139.         LCD_WR_REG(0xED);
  140.                         LCD_WR_DATA(0x64);
  141.                         LCD_WR_DATA(0x03);
  142.                         LCD_WR_DATA(0X12);
  143.                         LCD_WR_DATA(0x81);

  144.         LCD_WR_REG(0xE8);
  145.                         LCD_WR_DATA(0x85);
  146.                         LCD_WR_DATA(0x00);
  147.                         LCD_WR_DATA(0x70);

  148.         LCD_WR_REG(0xCB);
  149.                         LCD_WR_DATA(0x39);
  150.                         LCD_WR_DATA(0x2C);
  151.                         LCD_WR_DATA(0x00);
  152.                         LCD_WR_DATA(0x34);
  153.                         LCD_WR_DATA(0x02);

  154.         LCD_WR_REG(0xF7);
  155.                         LCD_WR_DATA(0x20);

  156.         LCD_WR_REG(0xEA);
  157.                         LCD_WR_DATA(0x00);
  158.                         LCD_WR_DATA(0x00);

  159.         LCD_WR_REG(0xC0);
  160.                         LCD_WR_DATA(0x22);

  161.         LCD_WR_REG(0xC1);
  162.                         LCD_WR_DATA(0x12);

  163.         LCD_WR_REG(0xC5);
  164.                         LCD_WR_DATA(0x5C);
  165.                         LCD_WR_DATA(0x4C);

  166.         LCD_WR_REG(0xC7);
  167.                         LCD_WR_DATA(0x8F);

  168.         LCD_WR_REG(0x36);
  169.                         LCD_WR_DATA(0x48);

  170.         LCD_WR_REG(0x3A);
  171.                         LCD_WR_DATA(0x55);

  172.         LCD_WR_REG(0xF2);
  173.                         LCD_WR_DATA(0x02);

  174.         LCD_WR_REG(0x26);
  175.                         LCD_WR_DATA(0x01);

  176.         LCD_WR_REG(0xE0);
  177.                         LCD_WR_DATA(0x0F);
  178.                         LCD_WR_DATA(0x20);
  179.                         LCD_WR_DATA(0x19);
  180.                         LCD_WR_DATA(0x0F);
  181.                         LCD_WR_DATA(0x10);
  182.                         LCD_WR_DATA(0x08);
  183.                         LCD_WR_DATA(0x4A);
  184.                         LCD_WR_DATA(0xF6);
  185.                         LCD_WR_DATA(0x3A);
  186.                         LCD_WR_DATA(0x0F);
  187.                         LCD_WR_DATA(0x14);
  188.                         LCD_WR_DATA(0x09);
  189.                         LCD_WR_DATA(0x18);
  190.                         LCD_WR_DATA(0x0B);
  191.                         LCD_WR_DATA(0x08);
  192.         LCD_WR_REG(0xE1);
  193.                         LCD_WR_DATA(0x00);
  194.                         LCD_WR_DATA(0x1E);
  195.                         LCD_WR_DATA(0x1E);
  196.                         LCD_WR_DATA(0x05);
  197.                         LCD_WR_DATA(0x0F);
  198.                         LCD_WR_DATA(0x04);
  199.                         LCD_WR_DATA(0x31);
  200.                         LCD_WR_DATA(0x33);
  201.                         LCD_WR_DATA(0x43);
  202.                         LCD_WR_DATA(0x04);
  203.                         LCD_WR_DATA(0x0B);
  204.                         LCD_WR_DATA(0x06);
  205.                         LCD_WR_DATA(0x27);
  206.                         LCD_WR_DATA(0x34);
  207.                         LCD_WR_DATA(0x0F);

  208.         LCD_WR_REG(0x11);
  209.        
  210.         delay_ms(120);

  211.         LCD_WR_REG(0x29);

  212.         LCD_WR_REG(0x2A);
  213.                         LCD_WR_DATA(0x00);
  214.                         LCD_WR_DATA(0x00);
  215.                         LCD_WR_DATA(0x00);
  216.                         LCD_WR_DATA(0xEF);
  217.         LCD_WR_REG(0x2B);
  218.                         LCD_WR_DATA(0x00);
  219.                         LCD_WR_DATA(0x00);
  220.                         LCD_WR_DATA(0x01);
  221.                         LCD_WR_DATA(0x3F);
  222.         LCD_WR_REG(0x2C);

  223.         delay_ms(10);

  224.         LCD_Clear(WHITE);
  225. }
  226.   
  227. //清屏函数
  228. //Color:要清屏的填充 {MOD}
  229. void LCD_Clear(u16 Color)
  230. {
  231.         u32 index=0;      
  232.         LCD_SetCursor(0x00,0x0000);//设置光标位置
  233.         LCD_WriteRAM_Prepare();     //开始写入GRAM                   
  234.         for(index=0;index<76800;index++)
  235.         {
  236.                 LCD_WR_DATA(Color);   
  237.         }
  238. }  
  239. //在指定区域内填充指定颜 {MOD}
  240. //区域大小:
  241. //  (xend-xsta)*(yend-ysta)
  242. void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
  243. {         
  244.         u16 i,j;
  245.         u16 xlen=0;       

  246.         xlen=xend-xsta+1;          
  247.         for(i=ysta;i<=yend;i++)
  248.         {
  249.                  LCD_SetCursor(xsta,i);      //设置光标位置
  250.                 LCD_WriteRAM_Prepare();     //开始写入GRAM          
  251.                 for(j=0;j<xlen;j++)LCD_WR_DATA(color);//设置光标位置             
  252.         }
  253.                                               
  254. }  

  255. //在指定区域内填充指定颜 {MOD}块                         
  256. //(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)   
  257. //color:要填充的颜 {MOD}
  258. void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color)
  259. {  
  260.         u16 height,width;
  261.         u16 i,j;
  262.         width=ex-sx+1;                 //得到填充的宽度
  263.         height=ey-sy+1;                //高度
  264.         for(i=0;i<height;i++)
  265.         {
  266.                 LCD_SetCursor(sx,sy+i);           //设置光标位置
  267.                 LCD_WriteRAM_Prepare();     //开始写入GRAM
  268.                 for(j=0;j<width;j++)
  269.                         LCD_WR_DATA(color[i*height+j]);//写入数据
  270.         }          
  271. }

  272. //画线
  273. //x1,y1:起点坐标
  274. //x2,y2:终点坐标  
  275. void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
  276. {
  277.         u16 t;
  278.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  279.         int incx,incy,uRow,uCol;

  280.         delta_x=x2-x1; //计算坐标增量
  281.         delta_y=y2-y1;
  282.         uRow=x1;
  283.         uCol=y1;
  284.         if(delta_x>0)incx=1; //设置单步方向
  285.         else if(delta_x==0)incx=0;//垂直线
  286.         else {incx=-1;delta_x=-delta_x;}
  287.         if(delta_y>0)incy=1;
  288.         else if(delta_y==0)incy=0;//水平线
  289.         else{incy=-1;delta_y=-delta_y;}
  290.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  291.         else distance=delta_y;
  292.         for(t=0;t<=distance+1;t++ )//画线输出
  293.         {  
  294.                 LCD_DrawPoint(uRow,uCol);//画点
  295.                 xerr+=delta_x ;
  296.                 yerr+=delta_y ;
  297.                 if(xerr>distance)
  298.                 {
  299.                         xerr-=distance;
  300.                         uRow+=incx;
  301.                 }
  302.                 if(yerr>distance)
  303.                 {
  304.                         yerr-=distance;
  305.                         uCol+=incy;
  306.                 }
  307.         }  
  308. }   
  309. //画矩形
  310. void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
  311. {
  312.         LCD_DrawLine(x1,y1,x2,y1);
  313.         LCD_DrawLine(x1,y1,x1,y2);
  314.         LCD_DrawLine(x1,y2,x2,y2);
  315.         LCD_DrawLine(x2,y1,x2,y2);
  316. }
  317. //在指定位置画一个指定大小的圆
  318. //(x,y):中心点
  319. //r    :半径
  320. void Draw_Circle(u16 x0,u16 y0,u8 r)
  321. {
  322.         int a,b;
  323.         int di;
  324.         a=0;b=r;          
  325.         di=3-(r<<1);             //判断下个点位置的标志
  326.         while(a<=b)
  327.         {
  328.                 LCD_DrawPoint(x0-b,y0-a);             //3           
  329.                 LCD_DrawPoint(x0+b,y0-a);             //0           
  330.                 LCD_DrawPoint(x0-a,y0+b);             //1      
  331.                 LCD_DrawPoint(x0-b,y0-a);             //7           
  332.                 LCD_DrawPoint(x0-a,y0-b);             //2            
  333.                 LCD_DrawPoint(x0+b,y0+a);             //4               
  334.                 LCD_DrawPoint(x0+a,y0-b);             //5
  335.                 LCD_DrawPoint(x0+a,y0+b);             //6
  336.                 LCD_DrawPoint(x0-b,y0+a);            
  337.                 a++;
  338.                 //使用Bresenham算法画圆     
  339.                 if(di<0)di +=4*a+6;          
  340.                 else
  341.                 {
  342.                         di+=10+4*(a-b);   
  343.                         b--;
  344.                 }
  345.                 LCD_DrawPoint(x0+a,y0+b);
  346.         }
  347. }

  348. void Draw_Circle2(u16 x0,u16 y0,u8 r)
  349. {
  350.         int a,b;
  351.         int di;
  352.         a=0;b=r;          
  353.         di=3-(r<<1);             //判断下个点位置的标志
  354.         while(a<=b)
  355.         {

  356.                 //LCD_DrawPoint(x0-b,y0-a);             //3           
  357.                 LCD_DrawPoint(x0+b,y0-a);             //0           
  358.                 //LCD_DrawPoint(x0-a,y0+b);             //1      
  359.                 //LCD_DrawPoint(x0-b,y0-a);             //7           
  360.                 LCD_DrawPoint(x0-a,y0-b);             //2            
  361.                 LCD_DrawPoint(x0+b,y0+a);             //4               
  362.                 LCD_DrawPoint(x0+a,y0-b);             //5
  363.                 //LCD_DrawPoint(x0+a,y0+b);             //6
  364.                 //LCD_DrawPoint(x0-b,y0+a);            
  365.                 a++;
  366.                 //使用Bresenham算法画圆     
  367.                 if(di<0)di +=4*a+6;          
  368.                 else
  369.                 {
  370.                         di+=10+4*(a-b);   
  371.                         b--;
  372.                 }
  373.                 //LCD_DrawPoint(x0+a,y0+b);
  374.         }
  375. }
  376. //在指定位置显示一个字符
  377. //x:0~234
  378. //y:0~308
  379. //num:要显示的字符:" "--->"~"
  380. //size:字体大小 12/16
  381. //mode:叠加方式(1)还是非叠加方式(0)
  382. //在指定位置显示一个字符
  383. //x:0~234
  384. //y:0~308
  385. //num:要显示的字符:" "--->"~"
  386. //size:字体大小 12/16
  387. //mode:叠加方式(1)还是非叠加方式(0)
  388. void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
  389. {
  390.   u8 temp;
  391.   u8 pos,t;
  392.         u16 x0=x;
  393.         u16 colortemp=POINT_COLOR;
  394.          
  395.   if(x>(LCDWIDTH-size/2)||y>(LCDHEIGHT-size))return;            
  396.         //设置窗口                  
  397.         num=num-' ';//得到偏移后的值
  398.         if(!mode) //非叠加方式
  399.         {
  400.                 for(pos=0;pos<size;pos++)
  401.                 {
  402.                         if(size==12)temp=asc2_1206[num][pos];//调用1206字体
  403.                         else temp=asc2_1608[num][pos];                 //调用1608字体
  404.                         for(t=0;t<size/2;t++)
  405.                   {                 
  406.                     if(temp&0x01)POINT_COLOR=colortemp;
  407.                                 else POINT_COLOR=WHITE;//BACK_COLOR;
  408.                                 LCD_DrawPoint(x,y);       
  409.                                 temp>>=1;
  410.                                 x++;
  411.                   }
  412.                         x=x0;
  413.                         y++;
  414.                 }       
  415.         }else//叠加方式
  416.         {
  417.                 for(pos=0;pos<size;pos++)
  418.                 {
  419.                         if(size==12)temp=asc2_1206[num][pos];//调用1206字体
  420.                         else temp=asc2_1608[num][pos];                 //调用1608字体
  421.                         for(t=0;t<size/2;t++)
  422.                     {                 
  423.                         if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点     
  424.                         temp>>=1;
  425.                     }
  426.                 }
  427.         }
  428.         POINT_COLOR=colortemp;                                          
  429. }  

  430. //m^n函数
  431. //返回值:m^n次方.
  432. u32 LCD_Pow(u8 m,u8 n)
  433. {
  434.         u32 result=1;         
  435.         while(n--)result*=m;   
  436.         return result;
  437. }       

  438. //显示数字,高位为0,则不显示
  439. //x,y :起点坐标         
  440. //len :数字的位数
  441. //size:字体大小
  442. //color:颜 {MOD}
  443. //num:数值(0~4294967295);         
  444. void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
  445. {                
  446.         u8 t,temp;
  447.         u8 enshow=0;                                                  
  448.         for(t=0;t<len;t++)
  449.         {
  450.                 temp=(num/LCD_Pow(10,len-t-1))%10;
  451.                 if(enshow==0&&t<(len-1))
  452.                 {
  453.                         if(temp==0)
  454.                         {
  455.                                 LCD_ShowChar(x+(size/2)*t,y,' ',size,0);
  456.                                 continue;
  457.                         }else enshow=1;
  458.                           
  459.                 }
  460.                  LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,0);
  461.         }
  462. }

  463. //显示数字,高位为0,还是显示
  464. //x,y:起点坐标
  465. //num:数值(0~999999999);         
  466. //len:长度(即要显示的位数)
  467. //size:字体大小
  468. //mode:
  469. //[7]:0,不填充;1,填充0.
  470. //[6:1]:保留
  471. //[0]:0,非叠加显示;1,叠加显示.
  472. void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)
  473. {  
  474.         u8 t,temp;
  475.         u8 enshow=0;                                                  
  476.         for(t=0;t<len;t++)
  477.         {
  478.                 temp=(num/LCD_Pow(10,len-t-1))%10;
  479.                 if(enshow==0&&t<(len-1))
  480.                 {
  481.                         if(temp==0)
  482.                         {
  483.                                 if(mode&0X80)LCD_ShowChar(x+(size/2)*t,y,'0',size,mode&0X01);  
  484.                                 else LCD_ShowChar(x+(size/2)*t,y,' ',size,mode&0X01);  
  485.                                 continue;
  486.                         }else enshow=1;
  487.                           
  488.                 }
  489.                  LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,mode&0X01);
  490.         }
  491. }
  492. //显示字符串
  493. //x,y:起点坐标
  494. //width,height:区域大小  
  495. //size:字体大小
  496. //*p:字符串起始地址                  
  497. void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)
  498. {         
  499.         u8 x0=x;
  500.         width+=x;
  501.         height+=y;
  502.     while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
  503.     {      
  504.         if(x>=width){x=x0;y+=size;}
  505.         if(y>=height)break;//退出
  506.         LCD_ShowChar(x,y,*p,size,0);
  507.         x+=size/2;
  508.         p++;
  509.     }  
  510. }


  511. void LCDOpenWindows(u16 x, u16 y, u16 len, u16 wid)
  512. {
  513.         LCD_WR_REG(0X2A);
  514.         LCD_WR_DATA(x>>8);        //start
  515.         LCD_WR_DATA(x-((x>>8)<<8));
  516.         LCD_WR_DATA((x+len-1)>>8);        //end
  517.         LCD_WR_DATA((x+len-1)-(((x+len-1)>>8)<<8));
  518.        
  519.         LCD_WR_REG(0X2B);
  520.         LCD_WR_DATA(y>>8);   //start
  521.         LCD_WR_DATA(y-((y>>8)<<8));
  522.         LCD_WR_DATA((y+wid-1)>>8);   //end
  523.         LCD_WR_DATA((y+wid-1)-(((y+wid-1)>>8)<<8));       
  524.         LCD_WR_REG(0x2C);
  525. }

  526. /****************************************************************************
  527. * 名    称:void ili9341_DrawPicture(u16 StartX,u16 StartY,u16 EndX,u16 EndY,u16 *pic)
  528. * 功    能:在指定座标范围显示一副图片
  529. * 入口参数:StartX     行起始座标
  530. *           StartY     列起始座标
  531. *           EndX       行结束座标
  532. *           EndY       列结束座标
  533.             pic        图片头指针
  534. * 出口参数:无
  535. * 说    明:图片取模格式为水平扫描,16位颜 {MOD}模式
  536. * 调用方法:ili9320_DrawPicture(0,0,100,100,(u16*)demo);
  537. ****************************************************************************/
  538. void ili9341_DrawPicture(u16 StartX,u16 StartY,u16 Xend,u16 Yend,u8 *pic)
  539. {
  540.         static        u16 i=0,j=0;
  541.   
  542.   u16 *bitmap = (u16 *)pic;
  543.        
  544.         LCDOpenWindows(StartX,StartY,Xend,Yend);
  545.        
  546.         for(i=0;i<Yend;i++)
  547.         {
  548.                 for(j=0;j<Xend;j++) LCD_WriteRAM(*bitmap++);        
  549.         }
  550.        
  551. }


复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。