1、三、 LCD及触摸屏此次设计采用的是电阻屏ILI9341液晶触摸屏。整个程序是基于触摸屏上不同的坐标来写的,触摸屏的分辨率是240*320。LCD主要用来设定一些固定的参数比如范围,还有字符和字符背景颜色等常规设置。加入了对时钟部分指针显示的指针部分的角度消除等一些问题。四、 程序图片处理首先确认实用的该图片的分辨率应该是多少,这一点非常重要,否则在LCD上就是图片乱码。确认之后将图片先修改成规定的分辨率,再根据Image2Lcd软件得到相应的程序代码,添加到Fonts.c中。三、 软件设计流程图 五、结论与感想这次课设我选择的题目是可编程电子闹钟,一开始觉得这个题目挺容易的,认为它类似于VB
2、这种可视化编程,但是可随着设计的深入,越发的感到力不从心。还好最终经过大量的查阅资料完成了题目的要求。既是对自己专业知识的实践补充,也是一次对ARM开发板的全新认识。首先是对课设的前期准备不充分,首先针对课设要求进行逐条分析。此题目要求显示实时时间,这个要求可以用RTC和RCC(系统时间)来完成。它所有的操作都要基于面板,也就是触摸屏操作。所以对触摸屏必须有一个清醒的认识,触摸屏的型号是ILI9341,分辨率是240*320(这个尤为重要),它设置开始点必须设置结束点和其他型号在这点上有重大区分。这些是必须在写程序之前都要得到的准确参数,但是由于第一次接触这种开发板,刚开始一头雾水,什么图片放
3、进去都是乱码,文字也是横的。下一次再设计时这些就成为了宝贵的经验。其次是对于程序的书写和理解还有很多的问题。此次题目的重点是写一个闹钟程序,个人认为首先要搞懂程序的逻辑,闹钟是以7天为一个循环,程序什么时候确认它停是一个很关键的问题。开发板提供的光盘上有一个综合程序,里面有包含闹钟的一部分程序,有一定的参考价值。但是由于对程序认识的浅薄,看了几天都没有得出它的完整逻辑。随后去图书馆查看STM32和ARM的有关书籍才逐渐懂得一些,并且了解到一些程序的书写格式。这些知识相信在我以后的设计中会非常受用的。最后我想对此次课设做一个总结,ARM开发板是一款非常实用的学习STM32的开发板。运用液晶屏上的
4、坐标加上不同的程序可以设计许多的应用,不单单是闹钟一种。通过这次课程设计也让我体会到51单片机和STM32的许多不同之处,相比于51,STM32确实有一些实用的改进。当我再一次拿到题目时可以考虑的做法也不仅仅局限于51一种,对我明年的毕业设计也是一种很大帮助。 附件:闹钟程序(逻辑部分)/显示主界面void Display_Allarm_Main(void) u8 i=0; LCD_Clear_Display(Vertical_LCD,BLACK);/清屏 LCD_Display_Window(Vertical_LCD,0,0,240,29,DARKGREEN); LCD_Display_Nu
5、m_Chinese_Char_Number_16_16(Vertical_LCD,10,6,创建闹钟,4,:,NO_Number,WHITE,RED,Fill_OFF); LCD_Display_Window(Vertical_LCD,195,14,18,2,WHITE); LCD_Display_Window(Vertical_LCD,203,6,2,18,WHITE); LCD_Display_Window(Vertical_LCD,0,29,240,2,BLUE); for(i=1;i=Display_Allarm_Num;i+) Display_Allarm_Interface(i);
6、 void Add_Allarm(void) Interface_Type=Add_Allarm_Type; Display_Set_Allarm_Interface();/添加闹钟界面 if(Success_Set=1)/表示成功添加 Set_Allarm_Hour=Set_Allarm_Hour_Temp; Set_Allarm_Min=Set_Allarm_Min_Temp; /把当前设置的一周中星期几闹铃的值更新到数组中去 for(i=0;7; Set_Allarm_Weeki=Set_Allarm_Week_Tempi; Set_Allarm_Loop=Set_Allarm_Loop
7、_Temp; Display_Allarm_Num+;/显示的闹钟数量增加一个 All_Allarm_HourDisplay_Allarm_Num-1=Set_Allarm_Hour;/把当前设置的闹钟的小时值更新到所有闹钟时间的数组中对应位置 All_Allarm_MinDisplay_Allarm_Num-1=Set_Allarm_Min;/把当前设置的闹钟的分值更新到所有闹钟时间分钟的数组中对应位置 All_Allarm_WeekDisplay_Allarm_Num-1i=Set_Allarm_Weeki; /更新当前设置的闹钟的重复与否参数写入数组中 All_Allarm_LoopDi
8、splay_Allarm_Num-1=Set_Allarm_Loop; /由于成功添加了闹钟之后默认这个闹钟是打开的,因此需要更新所有闹钟状态的数组值,针对那种不重复的数组如果全部都闹过了以后自动将这个闹钟关闭了,再次开启这个闹钟又会开始闹铃 /当然在打开设置里面打开了的话就会将每天的已经闹过闹铃数组清0 All_Allarm_STADisplay_Allarm_Num-1=1; /针对有效的闹钟进行查询,当天最接近报警时间的值,作为准备闹铃的时间 Find_Nearest_Time_Allarm();/ /更新主界面/ Display_Allarm_Main(); Success_Set=0
9、; / else/表示没有成功添加闹钟/ / /编辑闹钟void Set_Allarm(void) Interface_Type=Set_Allarm_Type;/设置闹钟界面 if(Success_Set=1)/表示成功设置闹钟 All_Allarm_HourSet_Allarm_Number-1=Set_Allarm_Hour; All_Allarm_MinSet_Allarm_Number-1=Set_Allarm_Min; All_Allarm_WeekSet_Allarm_Number-1i=Set_Allarm_Weeki; if(All_Allarm_STASet_Allarm_
10、Number-1=1) if(All_Allarm_WeekSet_Allarm_Number-1calendar.week=1)/编辑闹钟的话如果当天有闹钟已经闹了编辑过后又要让他重新可以闹 Already_AllarmSet_Allarm_Number-1calendar.week=0; All_Allarm_LoopSet_Allarm_Number-1=Set_Allarm_Loop;void Delete_Allarm_Funtion(void) u8 j=0; u8 Temp=0; /当前删除的闹钟编号之后的闹钟全部清0 for(j=0;jDisplay_Allarm_Num;j+
11、) Already_Allarmji=0; Display_Allarm_Num-; Temp=Delete_Allarm_Number; for(Delete_Allarm_Number=Temp;Delete_Allarm_Number(Set_Allarm_Hour*60+Set_Allarm_Min) Already_AllarmDelete_Allarm_Number-1i=1; else if(i Already_AllarmDisplay_Allarm_Num-1i=1; else if(i else if(i=calendar.week)/由于打开和关闭了闹钟要重新搜索出距离当
12、前时间最近的闹钟/针对有效的闹钟进行查询,当天最接近报警时间的值,作为准备闹铃的时间void Find_Nearest_Time_Allarm(void) RTC_Get(); Prepare_Allarm_Time=2000;/将准备闹铃的时间设置为最大值 if(All_Allarm_STAi=1)/查询到当前闹钟是打开 for(j=0; if(j! Already_Allarmij=1;(All_Allarm_Houri*60+All_Allarm_Mini) Already_Allarmij=1; if(j else if(j=calendar.week) if(All_Allarm_Weekicalendar.week=1)/查询当前星期是否对应有闹钟 if(Already_Allarmicalendar.week!=1)/表示查询到这个闹钟今天还没闹过,并且今天是有闹钟的 if(All_Allarm_Houri*60+All_Allarm_HouriPrepare_Allarm_Time)/取出最接近当前时间的报警时间值 Prepare_Allarm_Time=All_Allarm_Houri*60+All_Allarm_Mini; Allarm_Number=i;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1