[单片机芯片] 用沁恒Riscv单片机驱动圆形屏

[复制链接]
171|2
楼主
  GC9A01 圆形屏凭借 “小尺寸、低功耗、适配圆形显示” 的核心优势,主要落地在便携、穿戴、嵌入式交互三大场景,GC9A01 是一款专为圆形显示屏设计的单芯片 TFT-LCD 驱动控制器,由台湾通泰半导体(Ilitek)推出,广泛应用于智能手表、运动手环、小型便携设备等场景。
  基本参数
分辨率:常见为 240×240 像素,正好匹配直径约 1.2-1.5 英寸的圆形屏幕
接口类型:支持 SPI(3 线 / 4 线)和 8 位并行接口,SPI 模式下通信速率最高可达 60MHz
色彩深度:支持 16 位 RGB565 格式,可显示 65536 种颜色
工作电压:通常为 1.8V-3.3V(逻辑电压),VDDIO 可单独控制
  

   沁恒(WCH)的 CH32 系列单片机(如 CH32V307、317)驱动 GC9A01 圆形屏时,凭借硬件特性、开发便捷性和生态适配等优势,能形成高效、稳定的解决方案:
  1. 硬件特性匹配,通信效率高
SPI  DMA 接口性能适配,GC9A01 主要通过 SPI 接口通信(最高支持 60MHz),而 CH32V317 等型号内置高速 SPI 外设,支持最高 180MHz 时钟频率,完全覆盖 GC9A01 的速率需求,可实现高速数据传输,减少屏幕刷新延迟(尤其适合显示动态内容如心率波形、动画)。
   2,GPIO 资源灵活:
CH32 系列单片机的 GPIO 引脚支持推挽 / 开漏输出、快速切换等特性,能稳定驱动 GC9A01 的 DC(数据 / 命令切换)、RST(复位)、CS(片选)等控制引脚,且引脚复用功能丰富,便于硬件布局时优化布线。
低功耗协同:
   3.CH32V317 支持多种低功耗模式(如睡眠、停机模式),可与 GC9A01 的休眠模式联动(例如设备待机时,MCU 进入低功耗并关闭屏幕背光),大幅降低整体功耗,特别适合穿戴设备、电池供电场景。以下是具体场景拆解及适配逻辑。


   
   上代码:
底层驱动
  1. #include "lcd.h"
  2. #include "lcd_init.h"
  3. #include "lcdfont.h"
  4. #include "spi.h"
  5. #include "dma.h"

  6. /******************************************************************************
  7.       函数说明:在指定区域填充颜色
  8.       入口数据:xsta,ysta   起始坐标
  9.                 xend,yend   终止坐标
  10.                                                                 color       要填充的颜色
  11.       返回值:  无
  12. ******************************************************************************/
  13. void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
  14. {         
  15.         u16 color1[1],t=1;
  16.         u32 num,num1;
  17.         color1[0]=color;
  18.         num=(xend-xsta)*(yend-ysta);
  19.         LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
  20.         LCD_CS_Clr();
  21.         SPI1->CTLR1|=1<<11;//设置SPI16位传输模式
  22.         SPI_Cmd(SPI1, ENABLE);//使能SPI
  23.         while(t)
  24.         {
  25.                 if(num>65534)
  26.                 {
  27.                         num-=65534;
  28.                         num1=65534;
  29.                 }
  30.                 else
  31.                 {
  32.                         t=0;
  33.                         num1=num;
  34.                 }
  35.                 MYDMA_Config1(DMA1_Channel3,(u32)&SPI1->DATAR,(u32)color1,num1);
  36.                 SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE);
  37.                 MYDMA_Enable(DMA1_Channel3);
  38.                 while(1)
  39.                 {
  40.                         if(DMA_GetFlagStatus(DMA1_FLAG_TC3)!=RESET)//等待通道4传输完成
  41.                         {
  42.                                 DMA_ClearFlag(DMA1_FLAG_TC3);//清除通道3传输完成标志
  43.                                 break;
  44.                         }
  45.                 }
  46.   }
  47.         LCD_CS_Set();
  48.         SPI1->CTLR1=~SPI1->CTLR1;
  49.         SPI1->CTLR1|=1<<11;
  50.         SPI1->CTLR1=~SPI1->CTLR1;//设置SPI8位传输模式
  51.         SPI_Cmd(SPI1, ENABLE);//使能SPI
  52. }

  53. /******************************************************************************
  54.       函数说明:在指定位置画点
  55.       入口数据:x,y 画点坐标
  56.                 color 点的颜色
  57.       返回值:  无
  58. ******************************************************************************/
  59. void LCD_DrawPoint(u16 x,u16 y,u16 color)
  60. {
  61.         LCD_Address_Set(x,y,x,y);//设置光标位置
  62.         LCD_WR_DATA(color);
  63. }


  64. /******************************************************************************
  65.       函数说明:画线
  66.       入口数据:x1,y1   起始坐标
  67.                 x2,y2   终止坐标
  68.                 color   线的颜色
  69.       返回值:  无
  70. ******************************************************************************/
  71. void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)
  72. {
  73.         u16 t;
  74.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  75.         int incx,incy,uRow,uCol;
  76.         delta_x=x2-x1; //计算坐标增量
  77.         delta_y=y2-y1;
  78.         uRow=x1;//画线起点坐标
  79.         uCol=y1;
  80.         if(delta_x>0)incx=1; //设置单步方向
  81.         else if (delta_x==0)incx=0;//垂直线
  82.         else {incx=-1;delta_x=-delta_x;}
  83.         if(delta_y>0)incy=1;
  84.         else if (delta_y==0)incy=0;//水平线
  85.         else {incy=-1;delta_y=-delta_y;}
  86.         if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  87.         else distance=delta_y;
  88.         for(t=0;t<distance+1;t++)
  89.         {
  90.                 LCD_DrawPoint(uRow,uCol,color);//画点
  91.                 xerr+=delta_x;
  92.                 yerr+=delta_y;
  93.                 if(xerr>distance)
  94.                 {
  95.                         xerr-=distance;
  96.                         uRow+=incx;
  97.                 }
  98.                 if(yerr>distance)
  99.                 {
  100.                         yerr-=distance;
  101.                         uCol+=incy;
  102.                 }
  103.         }
  104. }


  105. /******************************************************************************
  106.       函数说明:画矩形
  107.       入口数据:x1,y1   起始坐标
  108.                 x2,y2   终止坐标
  109.                 color   矩形的颜色
  110.       返回值:  无
  111. ******************************************************************************/
  112. void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
  113. {
  114.         LCD_DrawLine(x1,y1,x2,y1,color);
  115.         LCD_DrawLine(x1,y1,x1,y2,color);
  116.         LCD_DrawLine(x1,y2,x2,y2,color);
  117.         LCD_DrawLine(x2,y1,x2,y2,color);
  118. }


  119. /******************************************************************************
  120.       函数说明:画圆
  121.       入口数据:x0,y0   圆心坐标
  122.                 r       半径
  123.                 color   圆的颜色
  124.       返回值:  无
  125. ******************************************************************************/
  126. void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color)
  127. {
  128.         int a,b;
  129.         a=0;b=r;          
  130.         while(a<=b)
  131.         {
  132.                 LCD_DrawPoint(x0-b,y0-a,color);             //3           
  133.                 LCD_DrawPoint(x0+b,y0-a,color);             //0           
  134.                 LCD_DrawPoint(x0-a,y0+b,color);             //1               
  135.                 LCD_DrawPoint(x0-a,y0-b,color);             //2            
  136.                 LCD_DrawPoint(x0+b,y0+a,color);             //4               
  137.                 LCD_DrawPoint(x0+a,y0-b,color);             //5
  138.                 LCD_DrawPoint(x0+a,y0+b,color);             //6
  139.                 LCD_DrawPoint(x0-b,y0+a,color);             //7
  140.                 a++;
  141.                 if((a*a+b*b)>(r*r))//判断要画的点是否过远
  142.                 {
  143.                         b--;
  144.                 }
  145.         }
  146. }

  147. /******************************************************************************
  148.       函数说明:显示汉字串
  149.       入口数据:x,y显示坐标
  150.                 *s 要显示的汉字串
  151.                 fc 字的颜色
  152.                 bc 字的背景色
  153.                 sizey 字号 可选 16 24 32
  154.                 mode:  0非叠加模式  1叠加模式
  155.       返回值:  无
  156. ******************************************************************************/
  157. void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
  158. {
  159.         while(*s!=0)
  160.         {
  161.                 if(sizey==12) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode);
  162.                 else if(sizey==16) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode);
  163.                 else if(sizey==24) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode);
  164.                 else if(sizey==32) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode);
  165.                 else return;
  166.                 s+=2;
  167.                 x+=sizey;
  168.         }
  169. }

  170. /******************************************************************************
  171.       函数说明:显示单个12x12汉字
  172.       入口数据:x,y显示坐标
  173.                 *s 要显示的汉字
  174.                 fc 字的颜色
  175.                 bc 字的背景色
  176.                 sizey 字号
  177.                 mode:  0非叠加模式  1叠加模式
  178.       返回值:  无
  179. ******************************************************************************/
  180. void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
  181. {
  182.         u8 i,j,m=0;
  183.         u16 k;
  184.         u16 HZnum;//汉字数目
  185.         u16 TypefaceNum;//一个字符所占字节大小
  186.         u16 x0=x;
  187.         TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
  188.                                  
  189.         HZnum=sizeof(tfont12)/sizeof(typFNT_GB12);        //统计汉字数目
  190.         for(k=0;k<HZnum;k++)
  191.         {
  192.                 if((tfont12[k].Index[0]==*(s))&&(tfont12[k].Index[1]==*(s+1)))
  193.                 {        
  194.                         LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
  195.                         for(i=0;i<TypefaceNum;i++)
  196.                         {
  197.                                 for(j=0;j<8;j++)
  198.                                 {       
  199.                                         if(!mode)//非叠加方式
  200.                                         {
  201.                                                 if(tfont12[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
  202.                                                 else LCD_WR_DATA(bc);
  203.                                                 m++;
  204.                                                 if(m%sizey==0)
  205.                                                 {
  206.                                                         m=0;
  207.                                                         break;
  208.                                                 }
  209.                                         }
  210.                                         else//叠加方式
  211.                                         {
  212.                                                 if(tfont12[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
  213.                                                 x++;
  214.                                                 if((x-x0)==sizey)
  215.                                                 {
  216.                                                         x=x0;
  217.                                                         y++;
  218.                                                         break;
  219.                                                 }
  220.                                         }
  221.                                 }
  222.                         }
  223.                 }                                         
  224.                 continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
  225.         }
  226. }


  227. /******************************************************************************
  228.       函数说明:显示单个16x16汉字
  229.       入口数据:x,y显示坐标
  230.                 *s 要显示的汉字
  231.                 fc 字的颜色
  232.                 bc 字的背景色
  233.                 sizey 字号
  234.                 mode:  0非叠加模式  1叠加模式
  235.       返回值:  无
  236. ******************************************************************************/
  237. void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
  238. {
  239.         u8 i,j,m=0;
  240.         u16 k;
  241.         u16 HZnum;//汉字数目
  242.         u16 TypefaceNum;//一个字符所占字节大小
  243.         u16 x0=x;
  244.   TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
  245.         HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);        //统计汉字数目
  246.         for(k=0;k<HZnum;k++)
  247.         {
  248.                 if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1)))
  249.                 {        
  250.                         LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
  251.                         for(i=0;i<TypefaceNum;i++)
  252.                         {
  253.                                 for(j=0;j<8;j++)
  254.                                 {       
  255.                                         if(!mode)//非叠加方式
  256.                                         {
  257.                                                 if(tfont16[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
  258.                                                 else LCD_WR_DATA(bc);
  259.                                                 m++;
  260.                                                 if(m%sizey==0)
  261.                                                 {
  262.                                                         m=0;
  263.                                                         break;
  264.                                                 }
  265.                                         }
  266.                                         else//叠加方式
  267.                                         {
  268.                                                 if(tfont16[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
  269.                                                 x++;
  270.                                                 if((x-x0)==sizey)
  271.                                                 {
  272.                                                         x=x0;
  273.                                                         y++;
  274.                                                         break;
  275.                                                 }
  276.                                         }
  277.                                 }
  278.                         }
  279.                 }                                         
  280.                 continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
  281.         }
  282. }


  283. /******************************************************************************
  284.       函数说明:显示单个24x24汉字
  285.       入口数据:x,y显示坐标
  286.                 *s 要显示的汉字
  287.                 fc 字的颜色
  288.                 bc 字的背景色
  289.                 sizey 字号
  290.                 mode:  0非叠加模式  1叠加模式
  291.       返回值:  无
  292. ******************************************************************************/
  293. void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
  294. {
  295.         u8 i,j,m=0;
  296.         u16 k;
  297.         u16 HZnum;//汉字数目
  298.         u16 TypefaceNum;//一个字符所占字节大小
  299.         u16 x0=x;
  300.         TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
  301.         HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);        //统计汉字数目
  302.         for(k=0;k<HZnum;k++)
  303.         {
  304.                 if ((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1)))
  305.                 {        
  306.                         LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
  307.                         for(i=0;i<TypefaceNum;i++)
  308.                         {
  309.                                 for(j=0;j<8;j++)
  310.                                 {       
  311.                                         if(!mode)//非叠加方式
  312.                                         {
  313.                                                 if(tfont24[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
  314.                                                 else LCD_WR_DATA(bc);
  315.                                                 m++;
  316.                                                 if(m%sizey==0)
  317.                                                 {
  318.                                                         m=0;
  319.                                                         break;
  320.                                                 }
  321.                                         }
  322.                                         else//叠加方式
  323.                                         {
  324.                                                 if(tfont24[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
  325.                                                 x++;
  326.                                                 if((x-x0)==sizey)
  327.                                                 {
  328.                                                         x=x0;
  329.                                                         y++;
  330.                                                         break;
  331.                                                 }
  332.                                         }
  333.                                 }
  334.                         }
  335.                 }                                         
  336.                 continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
  337.         }
  338. }

  339. /******************************************************************************
  340.       函数说明:显示单个32x32汉字
  341.       入口数据:x,y显示坐标
  342.                 *s 要显示的汉字
  343.                 fc 字的颜色
  344.                 bc 字的背景色
  345.                 sizey 字号
  346.                 mode:  0非叠加模式  1叠加模式
  347.       返回值:  无
  348. ******************************************************************************/
  349. void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
  350. {
  351.         u8 i,j,m=0;
  352.         u16 k;
  353.         u16 HZnum;//汉字数目
  354.         u16 TypefaceNum;//一个字符所占字节大小
  355.         u16 x0=x;
  356.         TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
  357.         HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);        //统计汉字数目
  358.         for(k=0;k<HZnum;k++)
  359.         {
  360.                 if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
  361.                 {        
  362.                         LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
  363.                         for(i=0;i<TypefaceNum;i++)
  364.                         {
  365.                                 for(j=0;j<8;j++)
  366.                                 {       
  367.                                         if(!mode)//非叠加方式
  368.                                         {
  369.                                                 if(tfont32[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
  370.                                                 else LCD_WR_DATA(bc);
  371.                                                 m++;
  372.                                                 if(m%sizey==0)
  373.                                                 {
  374.                                                         m=0;
  375.                                                         break;
  376.                                                 }
  377.                                         }
  378.                                         else//叠加方式
  379.                                         {
  380.                                                 if(tfont32[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
  381.                                                 x++;
  382.                                                 if((x-x0)==sizey)
  383.                                                 {
  384.                                                         x=x0;
  385.                                                         y++;
  386.                                                         break;
  387.                                                 }
  388.                                         }
  389.                                 }
  390.                         }
  391.                 }                                         
  392.                 continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
  393.         }
  394. }


  395. /******************************************************************************
  396.       函数说明:显示单个字符
  397.       入口数据:x,y显示坐标
  398.                 num 要显示的字符
  399.                 fc 字的颜色
  400.                 bc 字的背景色
  401.                 sizey 字号
  402.                 mode:  0非叠加模式  1叠加模式
  403.       返回值:  无
  404. ******************************************************************************/
  405. void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)
  406. {
  407.         u8 temp,sizex,t,m=0;
  408.         u16 i,TypefaceNum;//一个字符所占字节大小
  409.         u16 x0=x;
  410.         sizex=sizey/2;
  411.         TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
  412.         num=num-' ';    //得到偏移后的值
  413.         LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  //设置光标位置
  414.         for(i=0;i<TypefaceNum;i++)
  415.         {
  416.                 if(sizey==12)temp=ascii_1206[num][i];                       //调用6x12字体
  417.                 else if(sizey==16)temp=ascii_1608[num][i];                 //调用8x16字体
  418.                 else if(sizey==24)temp=ascii_2412[num][i];                 //调用12x24字体
  419.                 else if(sizey==32)temp=ascii_3216[num][i];                 //调用16x32字体
  420.                 else return;
  421.                 for(t=0;t<8;t++)
  422.                 {
  423.                         if(!mode)//非叠加模式
  424.                         {
  425.                                 if(temp&(0x01<<t))LCD_WR_DATA(fc);
  426.                                 else LCD_WR_DATA(bc);
  427.                                 m++;
  428.                                 if(m%sizex==0)
  429.                                 {
  430.                                         m=0;
  431.                                         break;
  432.                                 }
  433.                         }
  434.                         else//叠加模式
  435.                         {
  436.                                 if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//画一个点
  437.                                 x++;
  438.                                 if((x-x0)==sizex)
  439.                                 {
  440.                                         x=x0;
  441.                                         y++;
  442.                                         break;
  443.                                 }
  444.                         }
  445.                 }
  446.         }                      
  447. }


  448. /******************************************************************************
  449.       函数说明:显示字符串
  450.       入口数据:x,y显示坐标
  451.                 *p 要显示的字符串
  452.                 fc 字的颜色
  453.                 bc 字的背景色
  454.                 sizey 字号
  455.                 mode:  0非叠加模式  1叠加模式
  456.       返回值:  无
  457. ******************************************************************************/
  458. void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)
  459. {         
  460.         while(*p!='\0')
  461.         {      
  462.                 LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
  463.                 x+=sizey/2;
  464.                 p++;
  465.         }  
  466. }


  467. /******************************************************************************
  468.       函数说明:显示数字
  469.       入口数据:m底数,n指数
  470.       返回值:  无
  471. ******************************************************************************/
  472. u32 mypow(u8 m,u8 n)
  473. {
  474.         u32 result=1;         
  475.         while(n--)result*=m;
  476.         return result;
  477. }


  478. /******************************************************************************
  479.       函数说明:显示整数变量
  480.       入口数据:x,y显示坐标
  481.                 num 要显示整数变量
  482.                 len 要显示的位数
  483.                 fc 字的颜色
  484.                 bc 字的背景色
  485.                 sizey 字号
  486.       返回值:  无
  487. ******************************************************************************/
  488. void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey)
  489. {                
  490.         u8 t,temp;
  491.         u8 enshow=0;
  492.         u8 sizex=sizey/2;
  493.         for(t=0;t<len;t++)
  494.         {
  495.                 temp=(num/mypow(10,len-t-1))%10;
  496.                 if(enshow==0&&t<(len-1))
  497.                 {
  498.                         if(temp==0)
  499.                         {
  500.                                 LCD_ShowChar(x+t*sizex,y,' ',fc,bc,sizey,0);
  501.                                 continue;
  502.                         }else enshow=1;
  503.                           
  504.                 }
  505.                  LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
  506.         }
  507. }


  508. /******************************************************************************
  509.       函数说明:显示两位小数变量
  510.       入口数据:x,y显示坐标
  511.                 num 要显示小数变量
  512.                 len 要显示的位数
  513.                 fc 字的颜色
  514.                 bc 字的背景色
  515.                 sizey 字号
  516.       返回值:  无
  517. ******************************************************************************/
  518. void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey)
  519. {                
  520.         u8 t,temp,sizex;
  521.         u16 num1;
  522.         sizex=sizey/2;
  523.         num1=num*100;
  524.         for(t=0;t<len;t++)
  525.         {
  526.                 temp=(num1/mypow(10,len-t-1))%10;
  527.                 if(t==(len-2))
  528.                 {
  529.                         LCD_ShowChar(x+(len-2)*sizex,y,'.',fc,bc,sizey,0);
  530.                         t++;
  531.                         len+=1;
  532.                 }
  533.                  LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
  534.         }
  535. }


  536. /******************************************************************************
  537.       函数说明:显示图片
  538.       入口数据:x,y起点坐标
  539.                 length 图片长度
  540.                 width  图片宽度
  541.                 pic[]  图片数组   
  542.       返回值:  无
  543. ******************************************************************************/
  544. void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
  545. {
  546.         u8 t=1;
  547.         u32 num=length*width*2,num1;
  548.         LCD_Address_Set(x,y,x+length-1,y+width-1);
  549.         LCD_CS_Clr();
  550.         while(t)
  551.         {
  552.           if(num>65534)
  553.                 {
  554.                         num-=65534;
  555.                         num1=65534;
  556.                 }
  557.                 else
  558.                 {
  559.                         t=0;
  560.                         num1=num;
  561.                 }
  562.                 MYDMA_Config(DMA1_Channel3,(u32)&SPI1->DATAR,(u32)pic,num1);
  563.                 SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE);
  564.                 MYDMA_Enable(DMA1_Channel3);
  565. //                while(!(DMA_GetCurrDataCounter(DMA1_Channel3) == 0))
  566. //        {
  567. ////                    printf("%d\r\n",DMA_GetCurrDataCounter(DMA1_Channel3));
  568. ////                    Delay_Ms(10);
  569. //        }
  570.                 while(1)
  571.                 {
  572.                         if(DMA_GetFlagStatus(DMA1_FLAG_TC3)!=RESET)//等待通道3传输完成
  573.                         {
  574.                                 DMA_ClearFlag(DMA1_FLAG_TC3);//清除通道3传输完成标志
  575.                                 break;
  576.                         }
  577.                 }
  578.                 pic+=65534;
  579.         }
  580.         LCD_CS_Set();
  581. }





SPI发送
  1. void LCD_Writ_Bus(u8 dat)
  2. {       
  3.         LCD_CS_Clr();
  4.     while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//检查接收标志位
  5.         SPI_I2S_SendData(SPI1,dat);
  6.         delay(1);
  7.         LCD_CS_Set();
  8. }


A2.png (226.85 KB, 下载次数: 0)

A2.png
沙发
EPTmachine 发表于 2025-10-31 07:55 来自手机 | 只看该作者
驱动圆形屏的能力都很好
板凳
cooldog123pp 发表于 2025-10-31 09:33 | 只看该作者
这个屏幕很可爱啊,是不是可以做智能手表的表盘?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

109

主题

197

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部