数码之家

 找回密码
 立即注册
搜索
查看: 1557|回复: 17

[C51] STC屠龙刀实验板驱动7寸TFT屏测试代码分享3-片内RTC时钟演示

[复制链接]
发表于 2023-1-4 10:25:12 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

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

x
本帖最后由 慕名而来 于 2023-1-6 19:56 编辑



STC屠龙刀实验板驱动7寸TFT屏测试代码分享1-LCM接口驱动
https://www.mydigit.cn/thread-363836-1-1.html



STC屠龙刀实验板驱动7寸TFT屏测试代码分享2-DMA_LCM接口应用
https://www.mydigit.cn/thread-363971-1-1.html


此篇分享STC32G内部RTC时钟颜色的代码,代码仅用于演示,秒点儿亮30S熄30S以及每分钟刷新一次数据的控制没有使用芯片的秒中断,而是通过芯片的1/128S计时功能实现的,其他详见代码注释,此应用仅测试了RTC功能,没有同时使用LCM和DMA_LCM接口功能详见代码。

TFT_LCD.c
  1. #include"TFT_LCD.h"
  2. #include"delay.h"
  3. #include"font.h"
  4. //-----------------------------------------------------
  5. //LcmFlag作用:参数传输完成后等待返回中断标志
  6. //中断标志位LCMIFIF变高电平时LCMIFSTA=1、中断函数中清除中断LCMIFSTA=0标志、LcmFlag=0
  7. void LCD_WR_REG(u8 Reg)
  8. {
  9. LCD_CS=0; //打开片选信号CS=0,低电平有效;
  10. LCD_RS=0; //选择模式:0--命令,1--数据;
  11. DL=Reg; //写低8位数据由P0口输入
  12. LCD_WR=0; //打开写使能(低电平有效),在此期间数据被写入;
  13. LCD_WR=1; //关闭写使能;
  14. LCD_CS=1; //关闭片选信号!!
  15. }
  16. //----8位数据发送函数---------------------------------
  17. void LCD_WR_DATA(u8 Dat)
  18. {
  19. LCD_CS=0; //打开片选信号CS=0,低电平有效;
  20. LCD_RS=1; //选择模式:0--命令,1--数据;
  21. DL=Dat; //写低8位数据由P0口输入
  22. LCD_WR=0; //打开写使能(低电平有效),在此期间数据被写入;
  23. LCD_WR=1; //关闭写使能;
  24. LCD_CS=1; //关闭片选信号!!
  25. }
  26. //----------------------------------------------------
  27. void LCD_WR_DATA16(u16 Dat)
  28. {
  29. LCD_CS=0; //打开片选信号CS=0,低电平有效;
  30. LCD_RS=1; //选择为数据模式:0--命令,1--数据;
  31. DL=Dat; //写低8位数据由P0口输入
  32. DH=Dat>>8; //写高8位数据由P2口输入
  33. LCD_WR=0; //打开写使能(低电平有效),在此期间数据被写入;
  34. LCD_WR=1; //关闭写使能;
  35. LCD_CS=1; //关闭片选信号!!
  36. }
  37. //====窗口尺寸定义函数=========================================
  38. void LCD_SetWindows(u16 xStar,u16 yStar,u16 xEnd,u16 yEnd)
  39. {
  40. LCD_WR_REG(0x2a);
  41. LCD_WR_DATA((u8)(xStar>>8));
  42. LCD_WR_DATA((u8)(0x00FF&xStar));
  43. LCD_WR_DATA((u8)(xEnd>>8));
  44. LCD_WR_DATA((u8)(0x00FF&xEnd));
  45. LCD_WR_REG(0x2b);
  46. LCD_WR_DATA((u8)(yStar>>8));
  47. LCD_WR_DATA((u8)(0x00FF&yStar));
  48. LCD_WR_DATA((u8)(yEnd>>8));
  49. LCD_WR_DATA((u8)(0x00FF&yEnd));
  50. LCD_WR_REG(0x2c); //开始写入GRAM
  51. }
  52. //----全屏涂色函数(清屏)--------------------------------------
  53. void ClearScreen(u16 bColor)
  54. {
  55. u32 i;
  56. LCD_SetWindows(0,0,800-1,480-1); //给出起始与终止坐标
  57. for(i=0; i<384000; i++) //写入800*480个像素点
  58. {
  59. LCD_WR_DATA16(bColor);//每个像素两个字节
  60. }
  61. }
  62. //----写48*48汉字函数------------------------------------------
  63. void hanzi_48(u16 x,u16 y,u8 c[2],u16 fColor,u16 bColor)
  64. {
  65. u16 i,j,k,m;
  66. LCD_SetWindows(x,y,x+48-1,y+48-1);
  67. for(k=0; k<17; k++)
  68. {
  69. if((GB_48[k].Index[0]==c[0])&&(GB_48[k].Index[1]==c[1]))
  70. {
  71. for(i=0; i<288; i++)
  72. {
  73. m=GB_48[k].Msk[i];
  74. for(j=0; j<8; j++)
  75. {
  76. if((m&0x80)==0x80)
  77. {
  78. LCD_WR_DATA16(fColor);
  79. }
  80. else
  81. {
  82. LCD_WR_DATA16(bColor);
  83. }
  84. m<<=1;
  85. }
  86. }
  87. }
  88. }
  89. }
  90. //----96宽128高字型显示函数-------------------------------------
  91. void Put32_64(u16 x,u16 y,u8 shuzi,u16 fColor,u16 bColor)
  92. {
  93. u8 j,m;
  94. u16 i;
  95. LCD_SetWindows(x,y,x+32-1,y+64-1);
  96. for(i=0; i<256; i++)
  97. {
  98. m=shuzi_32[shuzi][i];
  99. for(j=0; j<8; j++)
  100. {
  101. if((m&0x80)==0x80)
  102. {
  103. LCD_WR_DATA16(fColor);
  104. }
  105. else
  106. {
  107. LCD_WR_DATA16(bColor);
  108. }
  109. m<<=1;
  110. }
  111. }
  112. }
  113. //----96宽128高字型显示函数-------------------------------------
  114. void Put64_128(u16 x, u16 y, u8 shuzi, u16 fColor,u16 bColor)
  115. {
  116. u8 j,m;
  117. u16 i;
  118. LCD_SetWindows(x,y,x+64-1, y+128-1);
  119. for(i=0; i<1024; i++)
  120. {
  121. m=shuzi_64[shuzi][i];
  122. for(j=0; j<8; j++)
  123. {
  124. if((m&0x80)==0x80)
  125. {
  126. LCD_WR_DATA16(fColor);
  127. }
  128. else
  129. {
  130. LCD_WR_DATA16(bColor);
  131. }
  132. m<<=1;
  133. }
  134. }
  135. }

复制代码

RTC.c
  1. #include "RTC.h"
  2. #include "TFT_LCD.h"

  3. u8 xingqi[8][2] = {" ", "一", "二", "三", "四", "五", "六", "日",};
  4. bit B1S_Flag;
  5. //----RTC初始化函数------------------------------------------------
  6. //YEAR、MONTH、DAY、HOUR、MIN、SEC 这些变量名称已在头文件中定义了
  7. void RTC_config(void)
  8. {
  9. INIYEAR = 22; //Y:2021
  10. INIMONTH = 12; //M:12
  11. INIDAY = 31; //D:31
  12. INIHOUR = 23; //H:23
  13. INIMIN = 59; //M:59
  14. INISEC = 50; //S:50
  15. INISSEC = 0; //S/128:0
  16. //IRC32KCR = 0x80 ; //启动内部32K晶振,
  17. //while (!(IRC32KCR & 1)); //等待时钟稳定
  18. //RTCCFG |= 0x03; //选择内部32K时钟源,触发RTC寄存器初始化
  19. X32KCR = 0x80 + 0x40; //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
  20. while (!(X32KCR & 1)); //等待时钟稳定
  21. RTCCFG = 0x01; //选择外部32K时钟源,触发RTC寄存器初始化
  22. RTCIF = 0x00; //清除所有RTC中断标志(可以清0、写1无效)
  23. //RTCIEN = 0x04; //中断使能, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
  24. RTCCR = 0x01; //RTC使能
  25. while(RTCCFG & 0x01); //等待初始化完成,需要在 "RTC使能" 之后判断.
  26. }
  27. //====星期与日期绑定显示、调整函数====================
  28. void set_week(u8 mo, u8 ye, u8 da)
  29. {
  30. u8 wk;
  31. if(mo < 0x03)
  32. {
  33. mo += 12;
  34. ye -= 1;
  35. }
  36. wk = (ye + ye / 4 + 5 + (26 * (mo + 1)) / 10 + da - 41) % 7;
  37. if(wk < 0) wk = wk + 7;
  38. if((wk > 0) && (wk <= 7))
  39. hanzi_48(700, 15, xingqi[wk], YELLOW, BLUE);
  40. }
  41. //----秒点儿闪烁函数-------------------------------------
  42. void dasply_SEC()
  43. {
  44. //if(SEC%2==0)//亮1s熄1s
  45. if(SSEC<64)//利用1/128S数据使秒点儿亮1/2s熄1/2s
  46. Put64_128(368,150,10,YELLOW, BLUE);//显示:
  47. else
  48. Put64_128(368,150,11,YELLOW, BLUE);//无显示
  49. if(SEC==0)
  50. B1S_Flag=1;//60s更新显示数据一次、刷新一次显示
  51. }
  52. //--------------------------------------------------------------------
  53. void dasply_word()
  54. {
  55. hanzi_48(96, 15, "年",YELLOW, BLUE);
  56. hanzi_48(206,15, "月",YELLOW, BLUE);
  57. hanzi_48(318,15, "日",YELLOW, BLUE);
  58. hanzi_48(600,15, "星",YELLOW, BLUE);
  59. hanzi_48(650,15, "期",YELLOW, BLUE);
  60. }
  61. //-------------------------------------------------
  62. void dasply_time()
  63. {
  64. u8 hi;
  65. hi=HOUR;
  66. Put32_64(30, 5, (u8)(YEAR / 10), YELLOW, BLUE);
  67. Put32_64(62, 5, (u8)(YEAR % 10), YELLOW, BLUE);
  68. Put32_64(142, 5, (u8)( MONTH / 10), YELLOW, BLUE);
  69. Put32_64(174, 5, (u8)( MONTH % 10), YELLOW, BLUE);
  70. Put32_64(254, 5, (u8)(DAY / 10), YELLOW, BLUE);
  71. Put32_64(286, 5, (u8)(DAY % 10), YELLOW, BLUE);
  72. set_week(MONTH, YEAR, DAY); //显示星期
  73. //------------------------------------------
  74. if(hi>0&&hi<=12)
  75. {
  76. hi=HOUR; //午前
  77. }
  78. if(hi>12)
  79. {
  80. hi=HOUR%12; //午后
  81. }
  82. if(hi==0)
  83. {
  84. hi=12; //零点显示12点
  85. }
  86. if((u8)(hi/10)==0)
  87. Put64_128(240, 150, 11, YELLOW, BLUE);
  88. else
  89. Put64_128(240, 150, (u8)(hi/10), YELLOW, BLUE);
  90. Put64_128(304, 150, (u8)(hi%10), YELLOW, BLUE);
  91. Put64_128(432, 150, (u8)(MIN/10), YELLOW, BLUE);
  92. Put64_128(496, 150, (u8)(MIN%10), YELLOW, BLUE);
  93. }
复制代码

主函数
  1. #include "STC32G.h"
  2. #include "TFT_LCD.h"
  3. #include "delay.h"
  4. #include "SSD1963.h"
  5. #include "RTC.h"
  6. //==========================================================================
  7. void main(void)
  8. {
  9. WTST = 0; //设置程序指令延时参数、赋值为0为等待0个时钟、可将CPU执行指令的速度设置为最快
  10. EAXFR = 1; //相当于P_SW2 |= 0x80(使能扩展寄存器(XFR)访问)
  11. CKCON = 0; //提高访问XRAM速度
  12. EXTRAM = 1; //使能外部扩展寄存器(xdata)的操作
  13. P0M0 = 0xff; //P0推挽输出
  14. P0M1 = 0x00;
  15. P1M0 = 0x00; //P1准双向口
  16. P1M1 = 0x00;
  17. P2M0 = 0xff; //P2推挽输出
  18. P2M1 = 0x00;
  19. P3M0 = 0x1c; //P3.4、p3.3、p3.2推挽输出
  20. P3M1 = 0x00;
  21. P4M0 = 0x3c; //P4-2.3.4.5推挽输出
  22. P4M1 = 0x00;

  23. //LCM_Config(); //LCM接口初始化
  24. RTC_config(); //RTC时钟初始化
  25. EA = 1;
  26. LCD_Init(); //LCM初始化
  27. ClearScreen(BLUE); //设置屏显底色(BLACK WHITE BLUE)
  28. dasply_word(); //显示桌面汉字
  29. dasply_time(); //预显示时间
  30. while(1)
  31. {
  32. dasply_SEC();
  33. if(B1S_Flag)
  34. {
  35. B1S_Flag=0; //1分钟更新一次显示
  36. dasply_word();
  37. dasply_time();
  38. }
  39. }
  40. }
复制代码


网站电脑端仍然无法上传图片。
注:
1.烧录代码时设置内部时钟频率为24MHz!在此感谢 @chenghelin 坛友的提醒!
2.RTC时基采用外部晶振,方法为:使用RX8025T将pin7与pin6(VDD)连接,引出pin3脚直接连接单片机的P1.7引脚,另外在引出VDD,VSS连接3.3V电源即可。

002.jpg

本帖工程代码分享:
LCD_CLOCK.zip (144.5 KB, 下载次数: 1)

三个帖子的工程代码网盘分享:
链接: https://pan.baidu.com/s/111p7KUHsQhJ5iuJkGINDFA 提取码: 2jmk

打赏

参与人数 3家元 +60 收起 理由
jf201006 + 20 謝謝分享
玛德陛下 + 20 謝謝分享
springvirus + 20 謝謝分享

查看全部打赏

发表于 2023-1-4 10:37:14 | 显示全部楼层
这个就非常专业了。
回复 支持 反对

使用道具 举报

发表于 2023-1-4 11:41:05 | 显示全部楼层
会写代码的就是牛,期待分享成品效果
回复 支持 反对

使用道具 举报

发表于 2023-1-4 12:46:22 | 显示全部楼层
这个主频多少啊?一直没看到哪儿有写
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-4 15:49:57 | 显示全部楼层
本帖最后由 慕名而来 于 2023-1-4 15:55 编辑

不知道为什么电脑端无法上传图片了,点击“选择图片上传”没有任何反应。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-4 15:52:19 | 显示全部楼层
chenghelin 发表于 2023-1-4 12:46
这个主频多少啊?一直没看到哪儿有写

多谢指正,已经添加了注释,单片机工作频率为24MHz。
回复 支持 反对

使用道具 举报

发表于 2023-1-4 16:58:39 | 显示全部楼层
慕名而来 发表于 2023-1-4 15:49
不知道为什么电脑端无法上传图片了,点击“选择图片上传”没有任何反应。
...

图片太大了,要改小尺寸。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-5 10:06:07 | 显示全部楼层
zdp2379 发表于 2023-1-4 16:58
图片太大了,要改小尺寸。

我只是想把电脑桌面上存放的图片上传到帖子里,“选择文件上传”这个按键就没作用,还没有进行到判断图片大小的步骤。如果你也是在电脑上登陆的话也请帮我测试一下先谢了。
回复 支持 反对

使用道具 举报

发表于 2023-1-5 11:31:19 | 显示全部楼层
看着你们的stc都到了,我还想着再玩玩stc,结果给发了顺丰到付,看来只能接着玩stm esp了
回复 支持 反对

使用道具 举报

发表于 2023-1-5 12:15:50 | 显示全部楼层
飞向狙沙 发表于 2023-1-5 11:31
看着你们的stc都到了,我还想着再玩玩stc,结果给发了顺丰到付,看来只能接着玩stm esp了 ...

到付可以拒绝吗?
回复 支持 反对

使用道具 举报

发表于 2023-1-5 16:06:35 | 显示全部楼层
beiling 发表于 2023-1-5 12:15
到付可以拒绝吗?

可以,直接跟快递员说拒收就行
回复 支持 反对

使用道具 举报

发表于 2023-1-5 16:38:53 | 显示全部楼层
收藏一下  大佬的杰作
回复 支持 反对

使用道具 举报

发表于 2023-1-6 09:52:35 | 显示全部楼层
本帖最后由 zdp2379 于 2023-1-6 09:55 编辑
慕名而来 发表于 2023-1-5 10:06
我只是想把电脑桌面上存放的图片上传到帖子里,“选择文件上传”这个按键就没作用,还没有进行到判断图片 ...

用电脑验证操作过了,选择文件上传是可以正常操作的,就是大的图片上传成功但不显示,小的图片没问题。可能是你电脑浏览器还是其它原因吧!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-6 10:50:25 | 显示全部楼层
飞向狙沙 发表于 2023-1-5 11:31
看着你们的stc都到了,我还想着再玩玩stc,结果给发了顺丰到付,看来只能接着玩stm esp了 ...

我是十月末申请的很快就到了,眼下估计受疫情影响吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-6 10:51:49 | 显示全部楼层
zdp2379 发表于 2023-1-6 09:52
用电脑验证操作过了,选择文件上传是可以正常操作的,就是大的图片上传成功但不显示,小的图片没问题。可 ...

非常感谢,看来是我的电脑、网络有问题了,抽空找人帮我看看电脑有啥问题了。
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2023-1-6 16:02:42 | 显示全部楼层
chenghelin 发表于 2023-1-4 12:46
这个主频多少啊?一直没看到哪儿有写

STC32G12K128-35I的主频可以设置到35MHZ,速度快,抗干扰强!最新出的管脚兼容的        
STC32G8K64-Beta-LQFP48,下载速度可以达到42MHZ哦!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-6 19:42:04 | 显示全部楼层
zdp2379 发表于 2023-1-6 09:52
用电脑验证操作过了,选择文件上传是可以正常操作的,就是大的图片上传成功但不显示,小的图片没问题。可 ...

百度了方法,调整了浏览器中网络的安全级别后可以上传文件了。

3333.jpg
将那个滑块拉下来,调整为“中”可以上传文件了。
回复 支持 反对

使用道具 举报

发表于 2023-4-6 13:13:01 | 显示全部楼层
STC的新款 MCU  全部加了 RTC 和 DMA 了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-18 21:50 , Processed in 0.280801 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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