通过实例了解单片机---FTF胸卡官方程序简析(1)---led_matrix

[复制链接]
2962|1
 楼主| ken.79 发表于 2008-11-13 15:11 | 显示全部楼层 |阅读模式
FTF(飞思卡尔技术论坛)大会ID胸卡上嵌入了MCF51JM128MMA7260QT三轴加速器、MC34673锂电池充电芯片,MPR084电容式触摸传感器以及5*16矩阵LED屏幕。<br />并提供了示例代码。并且12月底前提交自己的设计,有机会得到5000美刀奖励:)呵呵<br />好事情啊,大家有个同一的硬件平台,又有统一的示例代码,何不一起分析一下这个示例代码?单片机的学习过程也无非如此吧?对于喜欢深入研究的fans来说,示例代码还有一个USB&nbsp;bootloader哦,嗯,貌似好像还缺少一个RTOS。嗬嗬,不急不急,先把这几个事情搞定再玩RTOS不迟---还是uC/OS?nonono,uC/os群众基础很好了,不如挑个新鲜的大家一起来分拆&组合一下。:)<br />好了,说干就干吧,先从代码下手。俺的计划是这样,大家可以一起来做:<br />先易后难<br />Step&nbsp;1)应用层各部分分开来看----&nbsp;按c文件一个一个来看<br /><br />step&nbsp;2)再看看是怎么让各部分协同工作的---说实话,这个题目纯属看着麻烦实际不难,呵呵。第一步搞定了,这一步属于顺理成章。<br /><br />STEP&nbsp;3)&nbsp;恩,到这里程序好像差不多了,那么回过头来看看freescale单片机的内部吧,RTC啊,睡眠啊,外设啊。。。。<br /><br />STEP&nbsp;4)顺利的话,到现在好像完全可以玩这个板子了:)不急不急,BOOTLAODER里面还有些道道,也看看吧。看起来这部分不是太那么简单呢!那就先看c语言相关的。其他放后。<br /><br />step&nbsp;5)可能,也许,或者在上一步里有很多悬而又悬的问题,恩,这些问题好像不只是和c语言有关,呵呵,看看编译器相关吧。可以的话顺便总起来看看bootloader的运行。查不太多了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还没到这一步,怎么知道到时候会什么样子,妄语妄语,罪过罪过。随机应变是千古不变的真理,倒是见机行事。呵呵<br />先来led_matrix.c<br />
 楼主| ken.79 发表于 2008-11-13 16:35 | 显示全部楼层

step 1-- for led_matrix.c

网站<br />http://china.canyourbadgedothis.com/<br />资源丰富,IAR资源http://www.iar.com/website1/1.0.1.0/1128/1/index.php?<br />因为对使用IAR的设计有额外奖励,就以IAR的代码来看喽:)<br /><br />unsigned&nbsp;long&nbsp;*MessageAddress&nbsp;=&nbsp;(unsigned&nbsp;long&nbsp;*)0x0001FC00;&nbsp;&nbsp;//指向内部Flash&nbsp;存储led屏幕显示文字<br />unsigned&nbsp;long&nbsp;*SpeedAddress&nbsp;=&nbsp;(unsigned&nbsp;long&nbsp;*)0x0001FD00;&nbsp;&nbsp;&nbsp;//用来存放滚屏速度值<br /><br />const&nbsp;char&nbsp;SelectChar[]&nbsp;=&nbsp;//&nbsp;把&nbsp;1,2,3....转换成&nbsp;a,b,c的查找表<br />const&nbsp;unsigned&nbsp;char&nbsp;FontTable&nbsp;[][5]&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//字符点阵5*5.<br /><br />几个函数雷同,拿一个上来足矣,摘void&nbsp;LEDScroll(char&nbsp;*dataPtr)出来吧<br />void&nbsp;LEDScroll(char&nbsp;*dataPtr)<br />{<br />&nbsp;&nbsp;int&nbsp;c,&nbsp;i,&nbsp;j,&nbsp;message_length;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;fb&nbsp;[MAX_MSG_LENGTH];&nbsp;//fb的意思是frame&nbsp;buffer<br />/*&nbsp;MAX_MSG_LENGTH&nbsp;是啥子东东?<br />#define&nbsp;MAX_MSG_LENGTH&nbsp;&nbsp;(MAX_CHAR_LENGTH&nbsp;*&nbsp;(5&nbsp;+&nbsp;1))&nbsp;+&nbsp;(2&nbsp;*&nbsp;COLUMNS)<br />哦,原来是把MAX_CHAR_LENGTH换算为点数,为什么(5+1)?&nbsp;是因为字符和字符之间写程序的人加了一个空列,不然太挤了。为什么还要(2&nbsp;*&nbsp;COLUMNS)?首先COLUMNS是LED屏幕的列数,清除了吧,是给显示添头加尾。<br />*/<br />&nbsp;&nbsp;char&nbsp;scroll_delay;&nbsp;&nbsp;&nbsp;///来控制滚动速度的<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;message_length=0;&nbsp;&nbsp;&nbsp;//统计显示的字符个数<br /><br />&nbsp;&nbsp;/*&nbsp;Set&nbsp;up&nbsp;Array&nbsp;*/<br />/*以下到&nbsp;Line&nbsp;271&nbsp;注释非常详细,不用解释&nbsp;*/<br />&nbsp;/*&nbsp;Display&nbsp;Message&nbsp;*/<br />&nbsp;<br />&nbsp;&nbsp;/*&nbsp;Turn&nbsp;on&nbsp;RTC&nbsp;Clock&nbsp;*/<br />&nbsp;&nbsp;SCGC2_RTC=1;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;/*&nbsp;Turn&nbsp;on&nbsp;RTC&nbsp;Interrupt&nbsp;*/<br />&nbsp;&nbsp;rtc_init(8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RTC中断初始化,主要是把中断时间设置在1ms,为什么是一毫秒?参考JM128Reference&nbsp;Manual&nbsp;&nbsp;Table&nbsp;17-6.&nbsp;Prescaler&nbsp;Period&nbsp;附近<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(SlideLeftDown())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果是左侧按扭从E1按到E4---滑动和一个一个按都行,看看SlideleftDown的定义<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTAD&nbsp;=&nbsp;0x00;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;scroll_delay&nbsp;=&nbsp;*SpeedAddress;&nbsp;&nbsp;&nbsp;//去速度值,其实就是调节每个画面停留的次数<br /><br />while&nbsp;(--scroll_delay)&nbsp;&nbsp;&nbsp;//重复计数<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(c&nbsp;=&nbsp;0;&nbsp;c&nbsp;&lt&nbsp;COLUMNS;&nbsp;c++)&nbsp;&nbsp;&nbsp;//显示一整屏&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(c&nbsp;&lt&nbsp;COLUMNS/2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//看硬件原理图,portE控制左半屏,portD控制有半屏<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTAD&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;全灭<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTED&nbsp;=&nbsp;~(1&nbsp;&lt&lt&nbsp;c);&nbsp;&nbsp;&nbsp;//&nbsp;开一列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTDD&nbsp;=&nbsp;0xFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//右半屏休息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTAD&nbsp;=&nbsp;fb[i+c];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示一列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//轮到右半屏了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTAD&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTDD&nbsp;=&nbsp;~(1&nbsp;&lt&lt&nbsp;c&nbsp;-&nbsp;(COLUMNS/2));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTED&nbsp;=&nbsp;0xFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTAD&nbsp;=&nbsp;fb[i+c];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Enter&nbsp;stop&nbsp;mode&nbsp;and&nbsp;wait&nbsp;for&nbsp;RTC&nbsp;wakeup&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;进入睡眠模式,等待RTC唤醒&nbsp;---&nbsp;翻译的还可以吧,呵呵。顺便说一句,这里进入的应该是Stop&nbsp;3&nbsp;--&nbsp;没有看配置,猜的,肯定不是stop2,呵呵,有兴趣可以看JM128Reference&nbsp;manual关于工作模式部分。<br /><br />#ifdef&nbsp;__IAR_SYSTEMS_ICC__<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__stop(0x2000);<br />#else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm&nbsp;(stop&nbsp;#0x2000);&nbsp;&nbsp;//点亮了,休息一会,得延时一下,不然led显示不出来,呵呵,睡上大约1个ms.嗯?一个ms?&nbsp;因为睡了以后要等着rtc产生中断。<br />&nbsp;&nbsp;&nbsp;&nbsp;stop&nbsp;#0x2000,这条指令的意思是进入睡眠模式,把0x2000这个立即数放到状态寄存器SR.参考文档《CFPRM》<br />#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />很简单吧?<br /><br /><br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部