STM32+ST7789+RX8025T+DS18B20+EC11+GT30L32S4W组成的时钟
完整的stm32为主控的实时时钟项目
最近宅在家里把以前买的240*240液晶拿出来把玩了一下,做了个小时钟。
几点说明如下:
1:TFT液晶屏采用ST7789驱动,分辨率240*240,采用硬件SPI通讯。
2:文字显示采用GT30L32S4W字库芯片,与液晶屏使用同一个SPI通讯。
3:RX8025T采用软件模拟IIC方式通讯,时间刷新采用中断方式。
4:EC11编码开关为20档20脉冲,采用外部中断方式检测转动方向。
5:项目创建使用MDK4.73,stm32使用标准外设驱动库3.5版本。
6:按EC11中间键后进入调整模式,旋转EC11更改数值。
硬件构成
1:显示器件采用ST7789驱动的240*240IPS屏幕。
2:实时时钟芯片采用带温度补偿的RX8025T。
3:使用EC11旋转编码开关调整时间,中间键按下后进入调整。
4:温度检测使用DS18B20单总线温度传感器。
5:文字显示使用GT30L32S4W字库芯片。
6:主控芯片使用STM32F103C8T6。
成品效果
没有设计复杂的GUI界面,仅使用了基本的绘图功能能及文字显示。洞洞板手工搭接电路板,一切连接线以好走通为原则,每个器件所连接的IO口都是就近选择,所以也就不给出具体电路图纸了,自己看程序吧,这里需要注意一下,因为使用了PB3、PB4,所以只能使用SW下载和调试,或者串口下载代码。
重点:JTAG已被禁用,只能SW调试下载。PB3、PB4被重映射了,我自己是用的串口下载。
显示效果
整体布局
基本绘图:点、线、矩形、圆、填充,很容易移植到GUI
主程序代码
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化
LED_Init(); //LED端口初始化
rx8025t_init(); //初始化RX8025T实时时钟
EC11_Init(); //EC11编码开关初始化
EXTIX_Init(); //外部中断初始化
DS18B20_Init(); //DS18B20温度采集初始化
SPI_LCD_Init(); //LCD初始化
Display_GUItest(); //图形测试
get_rtc_time(&RTC_Time); //先获取一次时间用于初始显示
Display_Asc_String('4',20,30,GREEN,BLACK,"20"); //固定显示的部分
Display_GB2312_String('2',53,28,RED,BLACK, "年");
Display_GB2312_String('2',87,28,YELLOW,BLACK, "月");
Display_GB2312_String('2',121,28,MAGENTA,BLACK, "日");
Display_GB2312_String('2',166,28,LIGHTGREEN,BLACK, "星期"); //15x16汉字
Display_Asc_String('6',96,52,GREEN,BLACK,": :");
Display_GB2312_String('3',32,110,BLUE,BLACK, "温度");
Display_GB2312_String('3',145,110,BLUE,BLACK, "℃"); //24x24汉字
Display_Asc_String('5',118,110,WHITE,BLACK,".");
display(0); //显示日期与时间
RX8025T_INTen(1); //开实时时钟中断,进入中断刷新显示
Time_Update=0; //时间更新标志复位
while(1)
{
if(ec11_key==0) //按键检测
{
delay_ms(30);
if(ec11_key==0)
{
while(ec11_key==0);
Time_CFG(); //开始调整时间
}
}
if(Time_Update) //由RX8025T芯片的中断刷新此标志
{
get_rtc_time(&RTC_Time); //获取当前时间
display(0); //显示时间
display_tem(); //显示温度
LED0=!LED0; //DS0闪烁
Time_Update=0; //时间更新标志复位
}
}
}
完整程序下载
下载链接: STM32-RX8025T时钟.zip.