|
本帖最后由 慕名而来 于 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
- #include"TFT_LCD.h"
- #include"delay.h"
- #include"font.h"
- //-----------------------------------------------------
- //LcmFlag作用:参数传输完成后等待返回中断标志
- //中断标志位LCMIFIF变高电平时LCMIFSTA=1、中断函数中清除中断LCMIFSTA=0标志、LcmFlag=0
- void LCD_WR_REG(u8 Reg)
- {
- LCD_CS=0; //打开片选信号CS=0,低电平有效;
- LCD_RS=0; //选择模式:0--命令,1--数据;
- DL=Reg; //写低8位数据由P0口输入
- LCD_WR=0; //打开写使能(低电平有效),在此期间数据被写入;
- LCD_WR=1; //关闭写使能;
- LCD_CS=1; //关闭片选信号!!
- }
- //----8位数据发送函数---------------------------------
- void LCD_WR_DATA(u8 Dat)
- {
- LCD_CS=0; //打开片选信号CS=0,低电平有效;
- LCD_RS=1; //选择模式:0--命令,1--数据;
- DL=Dat; //写低8位数据由P0口输入
- LCD_WR=0; //打开写使能(低电平有效),在此期间数据被写入;
- LCD_WR=1; //关闭写使能;
- LCD_CS=1; //关闭片选信号!!
- }
- //----------------------------------------------------
- void LCD_WR_DATA16(u16 Dat)
- {
- LCD_CS=0; //打开片选信号CS=0,低电平有效;
- LCD_RS=1; //选择为数据模式:0--命令,1--数据;
- DL=Dat; //写低8位数据由P0口输入
- DH=Dat>>8; //写高8位数据由P2口输入
- LCD_WR=0; //打开写使能(低电平有效),在此期间数据被写入;
- LCD_WR=1; //关闭写使能;
- LCD_CS=1; //关闭片选信号!!
- }
- //====窗口尺寸定义函数=========================================
- void LCD_SetWindows(u16 xStar,u16 yStar,u16 xEnd,u16 yEnd)
- {
- LCD_WR_REG(0x2a);
- LCD_WR_DATA((u8)(xStar>>8));
- LCD_WR_DATA((u8)(0x00FF&xStar));
- LCD_WR_DATA((u8)(xEnd>>8));
- LCD_WR_DATA((u8)(0x00FF&xEnd));
- LCD_WR_REG(0x2b);
- LCD_WR_DATA((u8)(yStar>>8));
- LCD_WR_DATA((u8)(0x00FF&yStar));
- LCD_WR_DATA((u8)(yEnd>>8));
- LCD_WR_DATA((u8)(0x00FF&yEnd));
- LCD_WR_REG(0x2c); //开始写入GRAM
- }
- //----全屏涂色函数(清屏)--------------------------------------
- void ClearScreen(u16 bColor)
- {
- u32 i;
- LCD_SetWindows(0,0,800-1,480-1); //给出起始与终止坐标
- for(i=0; i<384000; i++) //写入800*480个像素点
- {
- LCD_WR_DATA16(bColor);//每个像素两个字节
- }
- }
- //----写48*48汉字函数------------------------------------------
- void hanzi_48(u16 x,u16 y,u8 c[2],u16 fColor,u16 bColor)
- {
- u16 i,j,k,m;
- LCD_SetWindows(x,y,x+48-1,y+48-1);
- for(k=0; k<17; k++)
- {
- if((GB_48[k].Index[0]==c[0])&&(GB_48[k].Index[1]==c[1]))
- {
- for(i=0; i<288; i++)
- {
- m=GB_48[k].Msk[i];
- for(j=0; j<8; j++)
- {
- if((m&0x80)==0x80)
- {
- LCD_WR_DATA16(fColor);
- }
- else
- {
- LCD_WR_DATA16(bColor);
- }
- m<<=1;
- }
- }
- }
- }
- }
- //----96宽128高字型显示函数-------------------------------------
- void Put32_64(u16 x,u16 y,u8 shuzi,u16 fColor,u16 bColor)
- {
- u8 j,m;
- u16 i;
- LCD_SetWindows(x,y,x+32-1,y+64-1);
- for(i=0; i<256; i++)
- {
- m=shuzi_32[shuzi][i];
- for(j=0; j<8; j++)
- {
- if((m&0x80)==0x80)
- {
- LCD_WR_DATA16(fColor);
- }
- else
- {
- LCD_WR_DATA16(bColor);
- }
- m<<=1;
- }
- }
- }
- //----96宽128高字型显示函数-------------------------------------
- void Put64_128(u16 x, u16 y, u8 shuzi, u16 fColor,u16 bColor)
- {
- u8 j,m;
- u16 i;
- LCD_SetWindows(x,y,x+64-1, y+128-1);
- for(i=0; i<1024; i++)
- {
- m=shuzi_64[shuzi][i];
- for(j=0; j<8; j++)
- {
- if((m&0x80)==0x80)
- {
- LCD_WR_DATA16(fColor);
- }
- else
- {
- LCD_WR_DATA16(bColor);
- }
- m<<=1;
- }
- }
- }
复制代码
RTC.c
- #include "RTC.h"
- #include "TFT_LCD.h"
- u8 xingqi[8][2] = {" ", "一", "二", "三", "四", "五", "六", "日",};
- bit B1S_Flag;
- //----RTC初始化函数------------------------------------------------
- //YEAR、MONTH、DAY、HOUR、MIN、SEC 这些变量名称已在头文件中定义了
- void RTC_config(void)
- {
- INIYEAR = 22; //Y:2021
- INIMONTH = 12; //M:12
- INIDAY = 31; //D:31
- INIHOUR = 23; //H:23
- INIMIN = 59; //M:59
- INISEC = 50; //S:50
- INISSEC = 0; //S/128:0
- //IRC32KCR = 0x80 ; //启动内部32K晶振,
- //while (!(IRC32KCR & 1)); //等待时钟稳定
- //RTCCFG |= 0x03; //选择内部32K时钟源,触发RTC寄存器初始化
- X32KCR = 0x80 + 0x40; //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
- while (!(X32KCR & 1)); //等待时钟稳定
- RTCCFG = 0x01; //选择外部32K时钟源,触发RTC寄存器初始化
- RTCIF = 0x00; //清除所有RTC中断标志(可以清0、写1无效)
- //RTCIEN = 0x04; //中断使能, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
- RTCCR = 0x01; //RTC使能
- while(RTCCFG & 0x01); //等待初始化完成,需要在 "RTC使能" 之后判断.
- }
- //====星期与日期绑定显示、调整函数====================
- void set_week(u8 mo, u8 ye, u8 da)
- {
- u8 wk;
- if(mo < 0x03)
- {
- mo += 12;
- ye -= 1;
- }
- wk = (ye + ye / 4 + 5 + (26 * (mo + 1)) / 10 + da - 41) % 7;
- if(wk < 0) wk = wk + 7;
- if((wk > 0) && (wk <= 7))
- hanzi_48(700, 15, xingqi[wk], YELLOW, BLUE);
- }
- //----秒点儿闪烁函数-------------------------------------
- void dasply_SEC()
- {
- //if(SEC%2==0)//亮1s熄1s
- if(SSEC<64)//利用1/128S数据使秒点儿亮1/2s熄1/2s
- Put64_128(368,150,10,YELLOW, BLUE);//显示:
- else
- Put64_128(368,150,11,YELLOW, BLUE);//无显示
- if(SEC==0)
- B1S_Flag=1;//60s更新显示数据一次、刷新一次显示
- }
- //--------------------------------------------------------------------
- void dasply_word()
- {
- hanzi_48(96, 15, "年",YELLOW, BLUE);
- hanzi_48(206,15, "月",YELLOW, BLUE);
- hanzi_48(318,15, "日",YELLOW, BLUE);
- hanzi_48(600,15, "星",YELLOW, BLUE);
- hanzi_48(650,15, "期",YELLOW, BLUE);
- }
- //-------------------------------------------------
- void dasply_time()
- {
- u8 hi;
- hi=HOUR;
- Put32_64(30, 5, (u8)(YEAR / 10), YELLOW, BLUE);
- Put32_64(62, 5, (u8)(YEAR % 10), YELLOW, BLUE);
- Put32_64(142, 5, (u8)( MONTH / 10), YELLOW, BLUE);
- Put32_64(174, 5, (u8)( MONTH % 10), YELLOW, BLUE);
- Put32_64(254, 5, (u8)(DAY / 10), YELLOW, BLUE);
- Put32_64(286, 5, (u8)(DAY % 10), YELLOW, BLUE);
- set_week(MONTH, YEAR, DAY); //显示星期
- //------------------------------------------
- if(hi>0&&hi<=12)
- {
- hi=HOUR; //午前
- }
- if(hi>12)
- {
- hi=HOUR%12; //午后
- }
- if(hi==0)
- {
- hi=12; //零点显示12点
- }
- if((u8)(hi/10)==0)
- Put64_128(240, 150, 11, YELLOW, BLUE);
- else
- Put64_128(240, 150, (u8)(hi/10), YELLOW, BLUE);
- Put64_128(304, 150, (u8)(hi%10), YELLOW, BLUE);
- Put64_128(432, 150, (u8)(MIN/10), YELLOW, BLUE);
- Put64_128(496, 150, (u8)(MIN%10), YELLOW, BLUE);
- }
复制代码
主函数
- #include "STC32G.h"
- #include "TFT_LCD.h"
- #include "delay.h"
- #include "SSD1963.h"
- #include "RTC.h"
- //==========================================================================
- void main(void)
- {
- WTST = 0; //设置程序指令延时参数、赋值为0为等待0个时钟、可将CPU执行指令的速度设置为最快
- EAXFR = 1; //相当于P_SW2 |= 0x80(使能扩展寄存器(XFR)访问)
- CKCON = 0; //提高访问XRAM速度
- EXTRAM = 1; //使能外部扩展寄存器(xdata)的操作
- P0M0 = 0xff; //P0推挽输出
- P0M1 = 0x00;
- P1M0 = 0x00; //P1准双向口
- P1M1 = 0x00;
- P2M0 = 0xff; //P2推挽输出
- P2M1 = 0x00;
- P3M0 = 0x1c; //P3.4、p3.3、p3.2推挽输出
- P3M1 = 0x00;
- P4M0 = 0x3c; //P4-2.3.4.5推挽输出
- P4M1 = 0x00;
- //LCM_Config(); //LCM接口初始化
- RTC_config(); //RTC时钟初始化
- EA = 1;
- LCD_Init(); //LCM初始化
- ClearScreen(BLUE); //设置屏显底色(BLACK WHITE BLUE)
- dasply_word(); //显示桌面汉字
- dasply_time(); //预显示时间
- while(1)
- {
- dasply_SEC();
- if(B1S_Flag)
- {
- B1S_Flag=0; //1分钟更新一次显示
- dasply_word();
- dasply_time();
- }
- }
- }
复制代码
网站电脑端仍然无法上传图片。
注:
1.烧录代码时设置内部时钟频率为24MHz!在此感谢 @chenghelin 坛友的提醒!
2.RTC时基采用外部晶振,方法为:使用RX8025T将pin7与pin6(VDD)连接,引出pin3脚直接连接单片机的P1.7引脚,另外在引出VDD,VSS连接3.3V电源即可。
本帖工程代码分享:
LCD_CLOCK.zip
(144.5 KB, 下载次数: 0)
三个帖子的工程代码网盘分享:
链接: https://pan.baidu.com/s/111p7KUHsQhJ5iuJkGINDFA 提取码: 2jmk
|
打赏
-
查看全部打赏
|