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