没有合适的资源?快使用搜索试试~ 我知道了~
通过利用程序实例的方式介绍了跑马灯变形记程序的变化及规范的写法
资源推荐
资源详情
资源评论
跑马灯变形记程序介绍(二)跑马灯变形记程序介绍(二)
通过利用程序实例的方式介绍了跑马灯变形记程序的变化及规范的写法
1)先从类型重定义说起,“#define uchar unsigned char”这样的语句,其意义恐仅是为了减少敲写“unsigned char”的时间,偷
懒之举罢了。类型重定义用意何其深远,区区“define”是万万授受不起的,可详见本书章节“被低估了的typedef”。在本系统
中,typedef还用不上,删之。
2)在main中,对于P1的操作如果用函数包起来,冠以一个恰当的函数名,再对P1这种“裸露端口”和“常量80”加上一个define宏
定义,那代码阅读起来就比较不会堵得慌了。
3)还有,字符间的空格,函数间的空白行,代码注释,这些也是良好程序的重要组成部分。
综上三点进行修改,我们的跑马灯才大概有一个雏形出来。如下:
#include #include /*********************************************************/ #defineLED_PORTP1/*led端口映射*/
#defineLIGHT_INTERVAL_TIME80/*unit:ms*/ /*********************************************************/
voiddelay_ms(unsignedintms)/*替换形参名和函数名*/ { unsignedchari; while(ms--)/*加空格*/ { for(i=0;i<255;i++);/*加空格*/ } }
/*****LED跑马灯(从右至左)********************************/ voidled_light_init(void) { LED_PORT=0xFE; }
voidled_light_right2left(void) { if(0x7F==LED_PORT)/*防止’==’与’=’的意外*/ { LED_PORT=0xFE; } else {
LED_PORT=_crol_(LED_PORT,1); } } /*********************************************************/ voidmain(void) { led_light_init();
while(1) { led_light_right2left(); delay_ms(LIGHT_INTERVAL_TIME); } } 代码2跑马灯的第一次变形
复制代码
上述代码中,定时器的延时存在两个问题。
(1) 延时程序精度不高。在不同mcu和不同的外部晶振,这个函数都需要修改。当这个系统开启了更多的中断时,这个函数精
度受到的影响就是随机性的。
(2) while+for的延时方法,属于一种“硬延时”,生生地耗掉mcu的运行资源。在实时性要求极高的嵌入式领域,这种做法显然
不合时宜。
综上,在本次进化,我们需要引进系统的定时器中断功能。它至少涉及两个函数。
/*****LED跑马灯(从右至左)***************************/ ………………. /**********************************************************/
#defineXTAL(36864000UL) #defineTIMER_1MS(XTAL/12UL/1000UL) /*--------------------------------*/
staticvolatileunsignedcharflag_80ms=0; staticvoidtimer1(void)interrupt3using1 { staticunsignedchartcnt=0; TCNT1+=(-
TIMER_1MS);/*为何如此写法,详见章节…*/ if(++tcnt>=LIGHT_INTERVAL_TIME) { tcnt=0; flag_80ms=1; } }
voidtimer_init(void) { TMOD=0x11;//timer016-bit,timer116-bit TCNT1=(-TIMER_1MS); TR1=1; IE|=0x0A;//????
ial0,enabletimer1,ex0,1 }
复制代码
/*********************************************************/ voidmain(void) { led_light_init(); timer_init(); while(1) { if(flag_80ms) {
flag_80ms=0; led_light_right2left(); } } } 代码3跑马灯的第二次变形
复制代码
加上定时器中断后,定时器的精度提高了,mcu的运算资源也极大的释放。然而,我们不得不设置了一个全局变
量“flag_80ms”,用来沟通main和定时中断,增加一个内部全局变量tcnt,用来累计1ms定时功能。此时,main.c文件里面的代
码乱像已显,为此,我们迫切需要第三次的变形。
资源评论
weixin_38660918
- 粉丝: 9
- 资源: 926
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功