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. }


复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
jiespring
1楼-- · 2019-12-12 19:39
  1. #ifndef __LCD_H_
  2. #define __LCD_H_       
  3. #include "sys.h"         
  4. #include "stdlib.h"


  5. #define        LCDWIDTH        240
  6. #define        LCDHEIGHT        320
  7. //TFTLCD部分外要调用的函数                  
  8. extern u16  POINT_COLOR;//默认黑 {MOD}
  9. extern u16  BACK_COLOR; //背景颜 {MOD}.默认为白 {MOD}

  10. ////////////////////////////////////////////////////////////////////
  11. //-----------------LCD端口定义----------------
  12. #define        LCD_BL PBout(3) //LCD背光                     PB3
  13. #define        LCDBKON                GPIO_ResetBits(GPIOB, GPIO_Pin_3)   
  14. #define        LCDBKOFF        GPIO_SetBits(GPIOB, GPIO_Pin_3)
  15. //如果使用快速IO,则定义下句,如果不使用,则去掉即可!
  16. //使用快速IO,刷屏速率可以达到28帧每秒!
  17. //普通IO,只能14帧每秒!

  18. #define        LCD_CS_SET          GPIOB->BSRR=1<<7    //片选端口               PB9
  19. #define        LCD_RS_SET                GPIOB->BSRR=1<<6   //数据/命令         PB8          
  20. #define        LCD_WR_SET                GPIOB->BSRR=1<<5    //写数据                         PB5
  21. #define        LCD_RD_SET                GPIOB->BSRR=1<<4    //读数据                         PB4
  22. #define        LCD_RESET_SET        GPIOA->BSRR=1<<15    //复位                                 PB3
  23.                                                                     
  24. #define        LCD_CS_CLR          GPIOB->BRR=1<<7     //片选端口               
  25. #define        LCD_RS_CLR                GPIOB->BRR=1<<6     //数据/命令                    
  26. #define        LCD_WR_CLR                GPIOB->BRR=1<<5     //写数据                         
  27. #define        LCD_RD_CLR                GPIOB->BRR=1<<4    //读数据                         
  28. #define        LCD_RESET_CLR        GPIOA->BRR=1<<15           //复位       

  29. //写8位数据函数
  30. //用宏定义,提高速度.

  31. #define LCD_WR_DATA(data){
  32. LCD_RS_SET;
  33. LCD_CS_CLR;
  34. LCD_RD_SET;
  35. LCD_WR_CLR;
  36. DATAOUT(data);
  37. LCD_WR_SET;
  38. LCD_CS_SET;
  39. }


  40. //PD0~15,作为数据线
  41. #define DATAOUT(x) GPIOD->ODR=x; //数据输出
  42. #define DATAIN     GPIOD->IDR;   //数据输入
  43. //////////////////////////////////////////////////////////////////////
  44. //画笔颜 {MOD}
  45. #define WHITE                                0xFFFF
  46. #define BLACK                                0x0000          
  47. #define BLUE                                0x001F  
  48. #define BRED                                0XF81F
  49. #define GRED                                0XFFE0
  50. #define GBLUE                                0X07FF
  51. #define RED                            0xF800
  52. #define MAGENTA                  0xF81F
  53. #define GREEN             0x07E0
  54. #define CYAN                    0x7FFF
  55. #define YELLOW                   0xFFE0
  56. #define BROWN                         0XBC40 //棕 {MOD}
  57. #define BRRED                         0XFC07 //棕红 {MOD}
  58. #define GRAY                          0X8430 //灰 {MOD}

  59. #define  color1            0xFBEF
  60. #define  color2            0xEDB1
  61. #define  color3            0x8410
  62. #define  color4            0x69a0
  63. #define  color5            0x52AA
  64. #define  color6            YELLOW
  65. #define bluel0            0xF6CC
  66. #define  bluel1            0xE60A
  67. #define  bluel2            0xD549
  68. #define  bluel3            0xC488
  69. #define bluel4             0xB3E7
  70. #define  bluel5           0xA326
  71. #define  bluel6           0x9265
  72. #define  bluel7            0x79A4
  73. #define bluel8            0x6903
  74. #define  bluel9            0x5842
  75. #define gray0                          0xB575
  76. #define gray5                         0x73AE
  77. #define gray6                          0x630C
  78. #define gray7                          0x526A
  79. #define gray8                         0x39E8
  80. #define gray9             0x2945
  81. #define  backgroundcolor1        0xEF7D
  82. #define  backgroundcolor2        0xEDB1
  83. #define  backgroundcolor3        0x8410
  84. #define  backgroundcolor4        0xE71C
  85. #define  backgroundcolor5        0xC638
  86. #define  backgroundcolor6        gray_L10                   

  87. //----------------------------------------------------------------------

  88. #define gray_L0 0X0
  89. #define gray_L1 0X821
  90. #define gray_L2 0X861
  91. #define gray_L3 0X1082
  92. #define gray_L4 0X18A3
  93. #define gray_L5 0X18C3
  94. #define gray_L6 0X2104
  95. #define gray_L7 0X2124
  96. #define gray_L8 0X2945
  97. #define gray_L9 0X3166
  98. #define gray_L10 0X31A6
  99. #define gray_L11 0X39C7
  100. #define gray_L12 0X41E8
  101. #define gray_L13 0X4208
  102. #define gray_L14 0X4A49
  103. #define gray_L15 0X4A69
  104. #define gray_L16 0X528A
  105. #define gray_L17 0X5AAB
  106. #define gray_L18 0X5AEB
  107. #define gray_L19 0X630C
  108. #define gray_L20 0X6B2D
  109. #define gray_L21 0X6B4D
  110. #define gray_L22 0X738E
  111. #define gray_L23 0X73AE
  112. #define gray_L24 0X7BCF
  113. #define gray_L25 0X83F0
  114. #define gray_L26 0X8430
  115. #define gray_L27 0X8C51
  116. #define gray_L28 0X9472
  117. #define gray_L29 0X9492
  118. #define gray_L30 0X9CD3
  119. #define gray_L31 0X9CF3
  120. #define gray_L32 0XA514
  121. #define gray_L33 0XAD35
  122. #define gray_L34 0XAD75
  123. #define gray_L35 0XB596
  124. #define gray_L36 0XBDB7
  125. #define gray_L37 0XBDD7
  126. #define gray_L38 0XC618
  127. #define gray_L39 0XC638
  128. #define gray_L40 0XCE59
  129. #define gray_L41 0XD67A
  130. #define gray_L42 0XD6BA
  131. #define gray_L43 0XDEDB
  132. #define gray_L44 0XE6FC
  133. #define gray_L45 0XE71C
  134. #define gray_L46 0XEF5D
  135. #define gray_L47 0XEF7D
  136. #define gray_L48 0XF79E
  137. #define gray_L49 0XFFBF
  138. #define gray_L50 0XFFFF

  139. //----------------------------------------------------------------------
  140. void LCD_WR_REG(u8 data);
  141. void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue);
  142. void LCD_WriteRAM_Prepare(void);
  143. void LCD_WriteRAM(u16 RGB_Code);          
  144. u16 LCD_BGR2RGB(u16 c);
  145. void LCD_DisplayOn(void);
  146. void LCD_DisplayOff(void);

  147. void LCD_SetCursor(u16 Xpos, u16 Ypos);
  148. void LCD_DrawPoint(u16 x,u16 y);//画点
  149. void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color);

  150. void LCD_Init(void);
  151. void LCD_Clear(u16 Color);
  152. void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);
  153. void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color);

  154. void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);
  155. void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);       
  156. void Draw_Circle(u16 x0,u16 y0,u8 r);
  157. void Draw_Circle2(u16 x0,u16 y0,u8 r);

  158. void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode);//显示一个字符
  159. void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);  //显示一个数字
  160. void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);//显示2个数字
  161. void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p); //显示一个字符串,16字体
  162. void LCDOpenWindows(u16 x, u16 y, u16 len, u16 wid);
  163. void ili9341_DrawPicture(u16 StartX,u16 StartY,u16 Xend,u16 Yend,u8 *pic);


  164.                                                    
  165. #endif  
  166.          
复制代码
bailao99
2楼-- · 2019-12-12 22:32
顶顶楼主,做个记号
lrzxc
3楼-- · 2019-12-12 23:39
嗯,比较长
jiespring
4楼-- · 2019-12-13 03:21
自己也是移植别人的,不过保证调试通过了!
jiespring
5楼-- · 2019-12-13 08:04
 精彩回答 2  元偷偷看……
jiespring
6楼-- · 2019-12-13 13:41
上传两个软件
图片制作软件,来自周立功的:
TK_LCD.zip (439.59 KB, 下载次数: 105) 2013-8-18 08:59 上传 点击文件名下载附件
字模软件,非常好用的,下图为LCD取字模的设置方法
PCtoLCD2002完美版.rar (704.22 KB, 下载次数: 55) 2013-8-18 09:00 上传 点击文件名下载附件

setup.JPG (230.95 KB, 下载次数: 1)

下载附件

2013-8-18 09:00 上传

一周热门 更多>