打印

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

[复制链接]
1911|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ken.79|  楼主 | 2008-11-13 15:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FTF(飞思卡尔技术论坛)大会ID胸卡上嵌入了MCF51JM128MMA7260QT三轴加速器、MC34673锂电池充电芯片,MPR084电容式触摸传感器以及5*16矩阵LED屏幕。
并提供了示例代码。并且12月底前提交自己的设计,有机会得到5000美刀奖励:)呵呵
好事情啊,大家有个同一的硬件平台,又有统一的示例代码,何不一起分析一下这个示例代码?单片机的学习过程也无非如此吧?对于喜欢深入研究的fans来说,示例代码还有一个USB bootloader哦,嗯,貌似好像还缺少一个RTOS。嗬嗬,不急不急,先把这几个事情搞定再玩RTOS不迟---还是uC/OS?nonono,uC/os群众基础很好了,不如挑个新鲜的大家一起来分拆&组合一下。:)
好了,说干就干吧,先从代码下手。俺的计划是这样,大家可以一起来做:
先易后难
Step 1)应用层各部分分开来看---- 按c文件一个一个来看

step 2)再看看是怎么让各部分协同工作的---说实话,这个题目纯属看着麻烦实际不难,呵呵。第一步搞定了,这一步属于顺理成章。

STEP 3) 恩,到这里程序好像差不多了,那么回过头来看看freescale单片机的内部吧,RTC啊,睡眠啊,外设啊。。。。

STEP 4)顺利的话,到现在好像完全可以玩这个板子了:)不急不急,BOOTLAODER里面还有些道道,也看看吧。看起来这部分不是太那么简单呢!那就先看c语言相关的。其他放后。

step 5)可能,也许,或者在上一步里有很多悬而又悬的问题,恩,这些问题好像不只是和c语言有关,呵呵,看看编译器相关吧。可以的话顺便总起来看看bootloader的运行。查不太多了。
       还没到这一步,怎么知道到时候会什么样子,妄语妄语,罪过罪过。随机应变是千古不变的真理,倒是见机行事。呵呵
先来led_matrix.c

相关帖子

沙发
ken.79|  楼主 | 2008-11-13 16:35 | 只看该作者

step 1-- for led_matrix.c

网站
http://china.canyourbadgedothis.com/
资源丰富,IAR资源http://www.iar.com/website1/1.0.1.0/1128/1/index.php?
因为对使用IAR的设计有额外奖励,就以IAR的代码来看喽:)

unsigned long *MessageAddress = (unsigned long *)0x0001FC00;  //指向内部Flash 存储led屏幕显示文字
unsigned long *SpeedAddress = (unsigned long *)0x0001FD00;   //用来存放滚屏速度值

const char SelectChar[] = // 把 1,2,3....转换成 a,b,c的查找表
const unsigned char FontTable [][5] =     //字符点阵5*5.

几个函数雷同,拿一个上来足矣,摘void LEDScroll(char *dataPtr)出来吧
void LEDScroll(char *dataPtr)
{
  int c, i, j, message_length;           
  unsigned char fb [MAX_MSG_LENGTH]; //fb的意思是frame buffer
/* MAX_MSG_LENGTH 是啥子东东?
#define MAX_MSG_LENGTH  (MAX_CHAR_LENGTH * (5 + 1)) + (2 * COLUMNS)
哦,原来是把MAX_CHAR_LENGTH换算为点数,为什么(5+1)? 是因为字符和字符之间写程序的人加了一个空列,不然太挤了。为什么还要(2 * COLUMNS)?首先COLUMNS是LED屏幕的列数,清除了吧,是给显示添头加尾。
*/
  char scroll_delay;   ///来控制滚动速度的
   
  message_length=0;   //统计显示的字符个数

  /* Set up Array */
/*以下到 Line 271 注释非常详细,不用解释 */
 /* Display Message */
 
  /* Turn on RTC Clock */
  SCGC2_RTC=1;   

  
  /* Turn on RTC Interrupt */
  rtc_init(8);                     //RTC中断初始化,主要是把中断时间设置在1ms,为什么是一毫秒?参考JM128Reference Manual  Table 17-6. Prescaler Period 附近

    if(SlideLeftDown())     //如果是左侧按扭从E1按到E4---滑动和一个一个按都行,看看SlideleftDown的定义
    {
      PTAD = 0x00;  
      break;
    }

 scroll_delay = *SpeedAddress;   //去速度值,其实就是调节每个画面停留的次数

while (--scroll_delay)   //重复计数
    {
      for (c = 0; c < COLUMNS; c++)   //显示一整屏 
      {
        if (c < COLUMNS/2)     //看硬件原理图,portE控制左半屏,portD控制有半屏
        {
            PTAD = 0x00;      // 全灭
            PTED = ~(1 << c);   // 开一列
            PTDD = 0xFF;        //右半屏休息
            PTAD = fb[i+c];     //显示一列
            
        }
        else         //轮到右半屏了。
        {
            PTAD = 0x00;              
            PTDD = ~(1 << c - (COLUMNS/2));
            PTED = 0xFF;
            PTAD = fb[i+c];
            
        }
                   
        // Enter stop mode and wait for RTC wakeup 
        // 进入睡眠模式,等待RTC唤醒 --- 翻译的还可以吧,呵呵。顺便说一句,这里进入的应该是Stop 3 -- 没有看配置,猜的,肯定不是stop2,呵呵,有兴趣可以看JM128Reference manual关于工作模式部分。

#ifdef __IAR_SYSTEMS_ICC__
        __stop(0x2000);
#else        
        asm (stop #0x2000);  //点亮了,休息一会,得延时一下,不然led显示不出来,呵呵,睡上大约1个ms.嗯?一个ms? 因为睡了以后要等着rtc产生中断。
    stop #0x2000,这条指令的意思是进入睡眠模式,把0x2000这个立即数放到状态寄存器SR.参考文档《CFPRM》
#endif        
      }
很简单吧?



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

16

帖子

0

粉丝