找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2061|回复: 1
收起左侧

ST7789V的C语言源代码 自行移植

[复制链接]
ID:50487 发表于 2022-3-23 11:21 | 显示全部楼层 |阅读模式
这款单片机很多地方找不到源代码,我辛苦移植过来的希望大家下载加入自己的font.h使用

单片机源程序如下:
  1. #include "ST7789V.h"
  2. #include "intrins.h"
  3. #include "FONT.H"

  4. #define LCD_CS              P34
  5. #define LCD_RST             P37
  6. #define LCD_RS              P33
  7. #define LCD_SLC             P35
  8. #define LCD_SDA             P36


  9. /*写指令到 LCD 模块*/
  10. void transfer_command(int data1)
  11. {
  12. char i;
  13. LCD_CS=0;
  14. LCD_RS=0;
  15. for(i=0;i<8;i++)
  16. {
  17. LCD_SLC=0;
  18. if(data1&0x80) LCD_SDA=1;
  19. else LCD_SDA=0;
  20. LCD_SLC=1;
  21. data1=data1<<=1;
  22. }
  23. LCD_CS=1;
  24. }
  25. /*写数据到 LCD 模块*/
  26. void transfer_data(int data1)
  27. {
  28. char i;
  29. LCD_CS=0;
  30. LCD_RS=1;
  31. for(i=0;i<8;i++)
  32. {
  33. LCD_SLC=0;
  34. if(data1&0x80) LCD_SDA=1;
  35. else LCD_SDA=0;
  36. LCD_SLC=1;
  37. data1=data1<<=1;
  38. }
  39. LCD_CS=1;
  40. }

  41. void Delay200ms()                //@11.0592MHz
  42. {
  43.         unsigned char i, j, k;

  44.         _nop_();
  45.         _nop_();
  46.         i = 9;
  47.         j = 104;
  48.         k = 139;
  49.         do
  50.         {
  51.                 do
  52.                 {
  53.                         while (--k);
  54.                 } while (--j);
  55.         } while (--i);
  56. }

  57. void lcd_initial()
  58. {
  59. LCD_RST=0;
  60. Delay200ms();
  61. LCD_RST=1;
  62. Delay200ms();
  63. //************* Start Initial Sequence **********//
  64. //------------------------------display and color format setting--------------------------------//
  65. transfer_command(0x36); //行扫描顺序及 RGB,列扫描顺序,横放/竖放
  66. transfer_data(0xa0);
  67. transfer_data(0x48);

  68. transfer_command(0xB6); //显示功能设置:列/行 显示顺序
  69. transfer_data(0x0A);
  70. transfer_data(0x82); //改变 SOURCE 线的方向:0xa2:左到右,0x82:右到左

  71. transfer_command(0x3a); //256K 16bit/pixel
  72. transfer_data(0x05);
  73. //--------------------------------ST7789V Frame rate setting----------------------------------//
  74. transfer_command(0xb2);
  75. transfer_data(0x0c);
  76. transfer_data(0x0c);
  77. transfer_data(0x00);
  78. transfer_data(0x33);
  79. transfer_data(0x33);
  80. transfer_command(0xb7);
  81. transfer_data(0x35);
  82. //---------------------------------ST7789V Power setting--------------------------------------//
  83. transfer_command(0xbb);
  84. transfer_data(0x28);
  85. transfer_command(0xc0);
  86. transfer_data(0x2c);
  87. transfer_command(0xc2);
  88. transfer_data(0x01);
  89. transfer_command(0xc3);
  90. transfer_data(0x10);
  91. transfer_command(0xc4);
  92. transfer_data(0x20);
  93. transfer_command(0xc6);
  94. transfer_data(0x0f);
  95. transfer_command(0xd0);
  96. transfer_data(0xa4);
  97. transfer_data(0xa1);
  98. //--------------------------------ST7789V gamma setting---------------------------------------//
  99. transfer_command(0xe0);
  100. transfer_data(0xd0);
  101. transfer_data(0x00);
  102. transfer_data(0x02);
  103. transfer_data(0x07);
  104. transfer_data(0x0a);
  105. transfer_data(0x28);
  106. transfer_data(0x32);
  107. transfer_data(0x44);
  108. transfer_data(0x42);
  109. transfer_data(0x06);
  110. transfer_data(0x0e);
  111. transfer_data(0x12);
  112. transfer_data(0x14);
  113. transfer_data(0x17);

  114. transfer_command(0xe1);
  115. transfer_data(0xd0);

  116. transfer_data(0x00);
  117. transfer_data(0x02);
  118. transfer_data(0x07);
  119. transfer_data(0x0a);
  120. transfer_data(0x28);
  121. transfer_data(0x31);
  122. transfer_data(0x54);
  123. transfer_data(0x47);
  124. transfer_data(0x0e);
  125. transfer_data(0x1c);
  126. transfer_data(0x17);
  127. transfer_data(0x1b);
  128. transfer_data(0x1e);

  129. transfer_command(0x11); //退出睡眠
  130. Delay200ms();
  131. transfer_command(0x29); //打开显示
  132. }


  133. //===传 16 位指令,16 位指令一起赋值
  134. void transfer_command_16(uint com_16bit)
  135. {
  136. transfer_command(com_16bit >>8); //先传高 8 位
  137. transfer_command(com_16bit ); //再传低 8 位
  138. }
  139. //连写 2 个字节(即 16 位)数据到 LCD 模块
  140. void transfer_data_16(uint data_16bit)
  141. {
  142. transfer_data(data_16bit>>8);
  143. transfer_data(data_16bit);
  144. }

  145. //===发送 1 个字节的指令及 1 个字节的数据================
  146. void Lcd_Write_Com_Data(uint com,uint val)
  147. {
  148. transfer_command_16(com); //先传指令
  149. transfer_data_16(val); //再传数据
  150. }
  151. void delay(long i)
  152. {
  153. int j,k;
  154. for(j=0;j<i;j++)
  155. for(k=0;k<110;k++);
  156. }
  157. void delay_us(long i)
  158. {
  159. int j,k;
  160. for(j=0;j<i;j++)
  161. for(k=0;k<10;k++);
  162. }

  163. //定义窗口坐标:开始坐标(XS,YS)以及窗口大小(x_total,y_total)
  164. void lcd_address(int XS,int YS,int x_total,int y_total)
  165. {
  166. int XE,YE;
  167. XE=XS+x_total-1;
  168. YE=YS+y_total-1;
  169. transfer_command(0x2a); // 设置 X 开始及结束的地址
  170. transfer_data_16(XS); // X 开始地址(16 位)
  171. transfer_data_16(XE); // X 结束地址(16 位)

  172. transfer_command(0x2b); // 设置 Y 开始及结束的地址
  173. transfer_data_16(YS); // Y 开始地址(16 位)
  174. transfer_data_16(YE); // Y 结束地址(16 位)
  175. transfer_command(0x2c); // 写数据开始
  176. }
  177. void mono_transfer_data_16(int mono_data,int font_color,int back_color)
  178. {
  179. int i;
  180. for(i=0;i<8;i++)
  181. {
  182. if(mono_data&0x80)
  183. {
  184. transfer_data_16(font_color); //当数据是 1 时,显示字体颜色
  185. }
  186. else
  187. {
  188. transfer_data_16(back_color); //当数据是 0 时,显示底色
  189. }
  190. mono_data<<=1;
  191. }
  192. }
  193. //全屏显示一种颜色
  194. void display_color(int color_data)
  195. {
  196. int i,j;
  197. lcd_address(0,0,320,240);
  198. for(i=0;i<320;i++)
  199. {
  200. for(j=0;j<240;j++)
  201. {
  202. transfer_data_16(color_data);
  203. }
  204. }
  205. }


  206. void display_black(void)
  207. {
  208. int i,j,k;
  209. transfer_command(0x2c); // 写数据开始
  210. for(i=0;i<240;i++)
  211. {
  212. transfer_data_16(0xffff);
  213. }
  214. for(i=0;i<318;i++)
  215. {
  216. for(k=0;k<1;k++)
  217. {
  218. transfer_data_16(0xffff);
  219. }
  220. for(j=0;j<238;j++)
  221. {
  222. transfer_data_16(0x0000);
  223. }
  224. for(k=0;k<1;k++)
  225. {
  226. transfer_data_16(0xffff);
  227. }
  228. }
  229. for(i=0;i<320;i++)
  230. {
  231. transfer_data_16(0xffff);
  232. }
  233. }


  234. //显示 8x16 点阵的字符串
  235. void disp_string_8x16(int x,int y,char *text,int font_color,int back_color)
  236. {
  237. int i=0,j,k;
  238.        
  239. while(text[i]>0x00)
  240. {
  241. j=text[i];
  242. lcd_address(x,y,8,16);
  243. for(k=0;k<16;k++)
  244.          {
  245.          mono_transfer_data_16(ascii0816[j*16+k],font_color,back_color);
  246.          }
  247. x+=8;
  248. i++;
  249. }
  250. }

  251. //显示 16x32 点阵的单色的图像  
  252. void disp_string_16x32(int x,int y,char *text,int font_color,int back_color)
  253. {
  254. int i=0,j,k,l;
  255. while(text[i]>0x00)
  256. {
  257. j=text[i]-32;
  258. lcd_address(x,y,16,32);
  259. for(k=0;k<32;k++)
  260.          {
  261.          for(l=0;l<2;l++)
  262.                  {
  263.                         switch(l)
  264.                         {
  265.                                 case 0:
  266.                                     mono_transfer_data_16(ascii1632[j*64+2*k],font_color,back_color);        
  267.                                     break;
  268.                                 case 1:
  269.                                           mono_transfer_data_16(ascii1632[j*64+2*k+1],font_color,back_color);        
  270.                                     break;
  271.                         }
  272.                  }
  273.                  
  274.          }
  275. x+=16;
  276. i++;
  277. }
  278. }
  279. extern uint16_t  *chine_index;
  280. //显示 32x32 点阵的单色的图像  
  281. void disp_char_32x32(int x,int y,int *text,int font_color,int back_color)
  282. {
  283. int i=0,j,k,l,a;

  284. for(a=0;a<43;a++)
  285.         {
  286.    if(*(chine_index+a)==text[i])
  287.                  {
  288.                         j=a;
  289.                         break;
  290.                  }
  291.         }
  292. lcd_address(x,y,32,32);
  293. for(k=0;k<32;k++)
  294.          {
  295.          for(l=0;l<4;l++)
  296.                  {
  297.                         mono_transfer_data_16(china32132[j*128+4*k+l],font_color,back_color);                        
  298.                  }
  299.          }

  300. i++;

  301. }

  302. void disp_string_32x32(int x,int y,int *text,int font_color,int back_color)
  303. {
  304. while(*text!=0)
  305.         {
  306.          disp_char_32x32( x, y, text, font_color, back_color);
  307.         text=text+1;       
  308.         x=x+32;       
  309.         }       
  310. }
  311. void disp_16x32_app()
  312. {
  313. disp_string_32x32(0,32*5+32,"放电测试",0XF000,0xffff) ;
  314. }

  315. //显示一幅彩图
  316. void display_image(int x,int y,uchar *dp)
  317. {
  318. uchar i,j,k=0;
  319. lcd_address(x,y,120,160);
  320. for(i=0;i<120;i++)
  321. {
  322. for(j=0;j<160;j++)
  323. {
  324. transfer_data(*dp); //传一个像素的图片数据的高位
  325. dp++;
  326. transfer_data(*dp); //传一个像素的图片数据的低位
  327. dp++;
  328. }
  329. }
  330. }
复制代码
51hei.png
上图2个文件下载 c代码(请自行移植到各单片机平台):
ST7789V.zip (3.59 KB, 下载次数: 87)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:262 发表于 2022-3-23 17:54 | 显示全部楼层
楼主你好 取模方式是怎么样的?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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