数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2706|回复: 7

[C51] STC屠龙刀实验板驱动7寸TFT屏测试代码分享1-LCM接口驱动

[复制链接]
发表于 2023-1-2 12:47:01 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 2023-1-6 19:49 编辑

收到STC厂家寄来的开天斧实验板和屠龙刀实验板好久了,由于时逢感染泛滥之际偶尔上手弄一弄也总是不能安心深入,这几天借阳过症状稍减、等待新阳到来的空闲时间又玩了一阵子,感觉STC32G这款单片机可玩性尚可,常来本坛的朋友或许知道,我用单片机只是为了玩儿而且玩法也非常单一就喜欢玩MCU-TFT屏和万年历显示,用途决定技术,我的用途注定用不到单片机太多的功能,也决定了我的分享也不会有太多可用经验,很多这款单片机的高大上的功能我就不琢磨了,只是测试了一下STC32G的LCM接口应用、LCM_DMA刷屏、内部RTC应用测试,本文也就是根据这个顺序分三篇分享给大家,对STC单片机感兴趣的新手可以看看,其他高手无视就好。

实验器材、硬件接线等详见程序起始之前的注释。
注:为了简单起见,仅分享所有.c文件,.h文件请自行整理编写
本文主函数相关:
  1. //-----------------------------------------------------------------------------
  2. //STC32G单片机LCM接口驱动SSD1963-7寸TFT液晶屏测试程序
  3. //程序原创:wannenggong 于2022年12月10日测试通过
  4. //程序基于STC32G为主控芯片的实验箱测试例程改编
  5. //程序编译:KEILuv4(5.60)-C251
  6. //程序下载时内部时钟选择24MHz
  7. //程序演示效果为STC32G单片机LCM接口16bit总线驱动SSD1963-7“TFTLCD显示数字、汉字
  8. //------------------------------------------------
  9. //本案LCM接口的应用配置(引脚接线方式)如下:(参照STC32G.pdf--27.x)
  10. //TFT-LCD驱动芯片型号为:SSD1963(7”屏幕为创群AT070N92)
  11. //16bit-MCU并行总线 I8080模式,
  12. //低8位口接D0~D7连接P0.0-P0.7
  13. //高8位口接D8~D15连接P2.0-P2.7
  14. //LCD_RS = P4^5;//数据/命令切换
  15. //LCD_WR = P4^2;//写控制
  16. //LCD_RD = P4^4;//读控制
  17. //------------------------------------------------
  18. #include "STC32G.h"
  19. #include "TFT_LCD.h"
  20. #include "delay.h"
  21. #include "SSD1963.h"
  22. //==========================================================================
  23. void main(void)
  24. {
  25. WTST = 0; //设置程序指令延时参数、赋值为0为等待0个时钟、可将CPU执行指令的速度设置为最快
  26. EAXFR = 1; //相当于P_SW2 |= 0x80(使能扩展寄存器(XFR)访问)
  27. CKCON = 0; //提高访问XRAM速度
  28. EXTRAM = 1; //使能外部扩展寄存器(xdata)的操作
  29. P0M0 = 0xff; //P0推挽输出
  30. P0M1 = 0x00;
  31. P2M0 = 0xff; //P2推挽输出
  32. P2M1 = 0x00;
  33. P3M0 = 0x10; //P3.4推挽输出
  34. P3M1 = 0x00;
  35. P4M0 = 0x3c; //P4-2.3.4.5推挽输出
  36. P4M1 = 0x00;
  37. EA = 1;
  38. LCM_Config();
  39. LCD_Init(); //LCM初始化
  40. ClearScreen(BLUE);//BLACK WHITE
  41. while(1)
  42. {
  43. Put32_64( 100, 200, 8, WHITE, BLUE );
  44. hanzi_48( 150, 200, "月", WHITE, BLUE );
  45. Put64_128(200, 200, 9, WHITE, BLUE);
  46. hanzi_48( 270, 200, "日", WHITE, BLUE );

  47. }
  48. }
复制代码

TFT_LCD.c
  1. #include"TFT_LCD.h"
  2. #include"delay.h"
  3. #include"font.h"
  4. bit LcmFlag;
  5. //-----------------------------------------------------
  6. void LCM_Config(void)//STC32G硬件LCM接口寄存器配置函数
  7. {
  8. LCMIFCFG=0x82; //使能LCM接口中断、中断等级设为最低、接口选择00(P2=高字节P0=低字节)、16位+I8080总线
  9. LCMIFCFG2=0x09; //控制信号端口配置为00模式(RS=P4.5,RD-P4.4,WR=P4.2);SetupTime=2,HOLDTime=1(屏幕的Setup=HOLE=8ns)
  10. LCMIFSTA=0x00; //状态寄存器清零,B0=LCMIFIF(中断请求标志)
  11. }
  12. //-----------------------------------------------------
  13. //LcmFlag作用:参数传输完成后等待返回中断标志
  14. //中断标志位LCMIFIF变高电平时LCMIFSTA=1、中断函数中清除中断LCMIFSTA=0标志、LcmFlag=0
  15. void LCD_WR_REG(u8 Reg)
  16. {
  17. if(LcmFlag==0)
  18. {
  19. LCMIFDATH=0;
  20. LCMIFDATL=Reg;
  21. LCMIFCR=0x84; //使能LCM接口、写命令
  22. }
  23. }
  24. //----8位数据发送函数---------------------------------
  25. void LCD_WR_DATA(u8 Dat)
  26. {
  27. if(LcmFlag==0)
  28. {
  29. LCMIFDATH=0;
  30. LCMIFDATL=Dat;
  31. LCMIFCR=0x85; //使能LCM接口、写数据
  32. }
  33. }
  34. //----------------------------------------------------
  35. void LCD_WR_DATA16(u16 Dat)
  36. {
  37. if(LcmFlag==0)
  38. {
  39. LCMIFDATH=Dat>>8;
  40. LCMIFDATL=Dat;
  41. LCMIFCR=0x85; //使能LCM接口、写数据
  42. }
  43. }
  44. //====窗口尺寸定义函数=========================================
  45. void LCD_SetWindows(u16 xStar,u16 yStar,u16 xEnd,u16 yEnd)
  46. {
  47. LCD_WR_REG(0x2a);
  48. LCD_WR_DATA((u8)(xStar>>8));
  49. LCD_WR_DATA((u8)(0x00FF&xStar));
  50. LCD_WR_DATA((u8)(xEnd>>8));
  51. LCD_WR_DATA((u8)(0x00FF&xEnd));

  52. LCD_WR_REG(0x2b);
  53. LCD_WR_DATA((u8)(yStar>>8));
  54. LCD_WR_DATA((u8)(0x00FF&yStar));
  55. LCD_WR_DATA((u8)(yEnd>>8));
  56. LCD_WR_DATA((u8)(0x00FF&yEnd));

  57. LCD_WR_REG(0x2c); //开始写入GRAM
  58. }
  59. //----全屏涂色函数(清屏)--------------------------------------
  60. void ClearScreen(u16 bColor)
  61. {
  62. u32 i;
  63. LCD_SetWindows(0,0,800-1,480-1); //给出起始与终止坐标
  64. for(i=0; i<384000; i++) //写入800*480个像素点
  65. {
  66. LCD_WR_DATA16(bColor);//每个像素两个字节
  67. }
  68. }
  69. //----写48*48汉字函数------------------------------------------
  70. void hanzi_48(u16 x,u16 y,u8 c[2],u16 fColor,u16 bColor)
  71. {
  72. u16 i,j,k,m;
  73. LCD_SetWindows(x,y,x+48-1,y+48-1);
  74. for(k=0; k<17; k++)
  75. {
  76. if((GB_48[k].Index[0]==c[0])&&(GB_48[k].Index[1]==c[1]))
  77. {
  78. for(i=0; i<288; i++)
  79. {
  80. m=GB_48[k].Msk[i];
  81. for(j=0; j<8; j++)
  82. {
  83. if((m&0x80)==0x80)
  84. {
  85. LCD_WR_DATA16(fColor);
  86. }
  87. else
  88. {
  89. LCD_WR_DATA16(bColor);
  90. }
  91. m<<=1;
  92. }
  93. }
  94. }
  95. }
  96. }
  97. //----96宽128高字型显示函数-------------------------------------
  98. //使用单片机内部存储的96*128字模型数组,shuzi=数字
  99. void Put32_64(u16 x,u16 y,u8 shuzi,u16 fColor,u16 bColor)
  100. {
  101. u8 j,m;
  102. u16 i;
  103. LCD_SetWindows(x,y,x+32-1,y+64-1);
  104. for(i=0; i<256; i++)
  105. {
  106. m=shuzi_32[shuzi][i];
  107. for(j=0; j<8; j++)
  108. {
  109. if((m&0x80)==0x80)
  110. {
  111. LCD_WR_DATA16(fColor);
  112. }
  113. else
  114. {
  115. LCD_WR_DATA16(bColor);
  116. }
  117. m<<=1;
  118. }
  119. }
  120. }
  121. //----96宽128高字型显示函数-------------------------------------
  122. //使用单片机内部存储的96*128字模型数组,shuzi=数字
  123. void Put64_128(u16 x, u16 y, u8 shuzi, u16 fColor,u16 bColor)
  124. {
  125. u8 j,m;
  126. u16 i;
  127. LCD_SetWindows(x,y,x+64-1, y+128-1);
  128. for(i=0; i<1024; i++)
  129. {
  130. m=shuzi_64[shuzi][i];
  131. for(j=0; j<8; j++)
  132. {
  133. if((m&0x80)==0x80)
  134. {
  135. LCD_WR_DATA16(fColor);
  136. }
  137. else
  138. {
  139. LCD_WR_DATA16(bColor);
  140. }
  141. m<<=1;
  142. }
  143. }
  144. }
  145. //----LCM中断函数----------------------------------
  146. void LCMIF_DMA_Interrupt(void) interrupt 13
  147. {
  148. if(LCMIFSTA & 0x01)
  149. {
  150. LCMIFSTA = 0x00;
  151. LcmFlag = 0;
  152. }
  153. }
复制代码

以下是公用函数文件
SSD1963.c
  1. #include "SSD1963.h"
  2. #include "TFT_LCD.h"
  3. #include "delay.h"
  4. #include "STC32G.h"
  5. //----LCD屏固有参数声明-------------------------------------
  6. #define HDP0 853
  7. #define HT 1101//928
  8. #define HPS 46
  9. #define HPW 0
  10. #define VDP0 479
  11. #define VT 524
  12. #define VPS 23
  13. #define VPW 209

  14. //----------------------------------------------------------
  15. void LCD_Init(void)
  16. {
  17. //复位SSD1963
  18. LCD_RESET = 1;
  19. delay_ms(5);
  20. LCD_RESET = 0;
  21. delay_ms(5);
  22. LCD_RESET = 1;
  23. LCD_CS = 1; //关闭片选
  24. delay_ms(5);
  25. LCD_CS = 0; //使能片选
  26. delay_ms(50);
  27. //复位结束、开始初始化SSD1963
  28. LCD_WR_REG(0xE2); //Set PLL with OSC = 10MHz (hardware), Multiplier N = 35, 250MHz < VCO < 800MHz = OSC*(N+1), VCO = 300MHz
  29. LCD_WR_DATA(0x23); //参数1//N=0x23=35(D);VCO=OSC*(N=1)=10MHz*36=360MHz
  30. LCD_WR_DATA(0x02); //参数2 Divider M = 2, PLL = 360/(M+1) = 120MHz
  31. LCD_WR_DATA(0x04); //参数3 确认上述计算数据
  32. delay_ms(1);

  33. LCD_WR_REG(0xE0);
  34. LCD_WR_DATA(0x03); // 使用并使能系统PLL作为系统时钟
  35. delay_ms(12);
  36. LCD_WR_REG(0x01); //软复位
  37. delay_ms(10);

  38. LCD_WR_REG(0xE6); //设置像素频率,33Mhz
  39. LCD_WR_DATA(0x03);
  40. LCD_WR_DATA(0xFF);
  41. LCD_WR_DATA(0xFF);

  42. LCD_WR_REG(0xB0); //设置LCD模式
  43. LCD_WR_DATA(0x00); //24位模式
  44. LCD_WR_DATA(0x00); //TFT 模式
  45. LCD_WR_DATA(HDP0 >> 8); //设置LCD水平像素
  46. LCD_WR_DATA(HDP0);
  47. LCD_WR_DATA(VDP0 >> 8); //设置LCD垂直像素
  48. LCD_WR_DATA(VDP0);
  49. LCD_WR_DATA(0x00); //RGB像素排列

  50. LCD_WR_REG(0xB4); //设置水平扫描参数
  51. LCD_WR_DATA(HT >> 8);
  52. LCD_WR_DATA(HT);
  53. LCD_WR_DATA(HPS >> 8);
  54. LCD_WR_DATA(HPS);
  55. LCD_WR_DATA(HPW);
  56. LCD_WR_DATA(0x00);
  57. LCD_WR_DATA(0x00);
  58. LCD_WR_DATA(0x00);
  59. LCD_WR_REG(0xB6); //设置垂直扫描参数
  60. LCD_WR_DATA(VT >> 8);
  61. LCD_WR_DATA(VT);
  62. LCD_WR_DATA(VPS >> 8);
  63. LCD_WR_DATA(VPS);
  64. LCD_WR_DATA(VPW);
  65. LCD_WR_DATA(0x00);
  66. LCD_WR_DATA(0x00);

  67. LCD_WR_REG(0xBA);
  68. LCD_WR_DATA(0x05); //gpio[3:0] out 1
  69. LCD_WR_REG(0xB8);
  70. LCD_WR_DATA(0x07); //gpio3=input, gpio[2:0]=output
  71. LCD_WR_DATA(0x01); //gpio0 normal
  72. LCD_WR_REG(0x36); //rotation
  73. LCD_WR_DATA(0x00);
  74. //正常横向0x00=左到右、0x40=右到左
  75. //顺时针旋转180度后0x80=左到右、0xc0=右到左
  76. //顺时针旋转90度后0x20= 、0x30=

  77. LCD_WR_REG(0xF0); //设置颜色格式
  78. LCD_WR_DATA(0x03); //16bit颜色RGB565
  79. LCD_WR_REG(0x29); //开启显示
  80. //设置PWM输出 背光通过占空比可调
  81. LCD_WR_REG(0xD0); //可调背光的设置
  82. LCD_WR_DATA(0x0D); //禁用=0x0D
  83. LCD_WR_REG(0x00BE); //配置PWM输出
  84. LCD_WR_DATA(0x0002); //1设置PWM频率
  85. LCD_WR_DATA(80 * 2.55); //2设置PWM占空比
  86. LCD_WR_DATA(0x0001); //3设置C
  87. LCD_WR_DATA(0x00FF); //4设置D
  88. LCD_WR_DATA(0x0000); //5设置E
  89. LCD_WR_DATA(0x0000); //6设置F
  90. //LCD_direction(USE_HORIZONTAL);//设置LCD显示方向
  91. }

复制代码

delay.c
  1. #include "delay.h"
  2. #include <intrins.h>

  3. //======================================
  4. void delay_ms( unsigned int ms_value ) //@24.000MHz
  5. {
  6. unsigned long i;
  7. while( ms_value > 0 )
  8. {

  9. _nop_();
  10. _nop_();
  11. _nop_();
  12. i = 5998UL;
  13. while ( i ) i--;
  14. ms_value--;
  15. }
  16. }
复制代码

注:烧录代码时设置内部时钟频率为24MHz!










网盘分享在:STC屠龙刀实验板驱动7寸TFT屏测试代码分享3-片内RTC时钟演示
https://www.mydigit.cn/thread-364135-1-1.html
(出处: 数码之家)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 4家元 +140 收起 理由
玛德陛下 + 20 謝謝分享
家睦 + 80
jf201006 + 20 謝謝分享
springvirus + 20 謝謝分享

查看全部打赏

发表于 2023-1-2 12:58:18 | 显示全部楼层
看起来挺好,不知道还能不能申请到
回复 支持 反对

使用道具 举报

发表于 2023-1-2 19:20:18 | 显示全部楼层
雪随冰舞 发表于 2023-1-2 12:58
看起来挺好,不知道还能不能申请到

不用申请了,一回复是个人就直接不理你了
回复 支持 反对

使用道具 举报

发表于 2023-1-2 19:40:32 来自手机浏览器 | 显示全部楼层
雪随冰舞 发表于 2023-1-2 12:58
看起来挺好,不知道还能不能申请到

任意有点相关性的公司地址就能申请到,配合下别人的商业活动也是起码的。至于项目可以写 评估物联网在XX行业的应用,笼统一些也就行了。
回复 支持 反对

使用道具 举报

发表于 2023-1-5 16:04:54 | 显示全部楼层
楼主能不能搞个压缩工程下载链接??
回复 支持 反对

使用道具 举报

发表于 2023-1-5 16:41:04 | 显示全部楼层

感谢楼主分享,好东西啊
回复 支持 反对

使用道具 举报

发表于 2023-1-10 20:31:18 来自手机浏览器 | 显示全部楼层
请问7寸的1963屏幕哪买的?价格应该不菲。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-10 22:00:51 | 显示全部楼层
hefanghua 发表于 2023-1-10 20:31
请问7寸的1963屏幕哪买的?价格应该不菲。

方才毛保查看记录这块屏是17年入手的当时是178现在涨了40。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-21 16:49 , Processed in 0.156000 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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