交通灯程序的闪,很有趣的一段程序,第一第二句省了200B
{
rtimer_flag=timer_flag & 64;
rtimer_flag=rtimer_flag/2;
if(data_rtled*100-timer_flag<750 && data_rtled*100-timer_flag>250 && rtimer_flag==0)
{
switch(direction)
{
case 1: turnleft(data_down); break;
case 2: gostraight(data_down); break;//某方向绿灭; break;
case 3: turnright(data_down); break;
}
}
else if(data_rtled*100-timer_flag<300)
{
switch(direction)
{
case 1: turnleft(data_yelow); break;
case 2: gostraight(data_yelow); break; //绿灭亮黄; break;
case 3: turnright(data_yelow); break;
}
}
else
switch(direction)
{
case 1: turnleft(data_normal); break;
case 2: gostraight(data_normal); break; //绿亮; break;
case 3: turnright(data_normal); break;
}
}
关键词: 交通 有趣 有趣
void takertimerflag(uchar direction,uchar data_rtled,uchar data_down,uchar data_yelow,uchar data_normal)
//uchar direction 方向,1左转,2直行,3右转
//uchar data_rtled 时间,相位的停留时间(这是太阳能移动交通灯的相位时间共4个相位16个模式)
//uchar data_down, IO口控制灭的数据 为0x__
//uchar data_yelow, IO口控制绿灭红灭亮黄的数据 为0x__
//uchar data_normal ,IO口控制正常绿灯亮的数据 为0x__
{rtimer_flag=timer_flag & 64;
//timer_flag是个定时器自加标志10ms自加1,rtimer_flag是一个变量uchar型------>x<64的数按位与64都得0,64<=x<128的数按位与64都得64,128<=x<128+64的数按位与64都得0, 128+64<=x<256的数按位与64都得64, 256<=x<256+64的数按位与64都得0,256+64<=x<256+128的数按位与64都得64,、、、、、、、依次以时间间隔为64在0与64两个数之间切换循环
rtimer_flag=rtimer_flag/2;//由上步可知此处的值是以时间间隔为64,在0和32之间切换if(data_rtled*100-timer_flag<750 && data_rtled*100-timer_flag>250 && rtimer_flag==0)
//如果相位运行时间低于设定时间7.5s并且大于2.5s时 每64*10ms进入一次
{switch(direction)
{
case 1: turnleft(data_down); break;
case 2: gostraight(data_down); break;//某方向绿灭; break;
case 3: turnright(data_down); break;
}
}
else if(data_rtled*100-timer_flag<300)
{
switch(direction)
{
case 1: turnleft(data_yelow); break;
case 2: gostraight(data_yelow); break; //绿灭亮黄; break;
case 3: turnright(data_yelow); break;
}
}
else
switch(direction)
{
case 1: turnleft(data_normal); break;
case 2: gostraight(data_normal); break; //绿亮; break;
case 3: turnright(data_normal); break;
}
}
程序的重点在于用&代替了%, 就是
rtimer_flag=timer_flag/64;-----------------------------以时间间隔为64 做奇偶变换
rtimer_flag=rtimer_flag%2;由上步导致此处--------在时间间隔为64做0 1 变换
这是在完整的太阳能移动交通灯里拿出来的闪的程序,我不知道别人怎么写的,我是这样写了。。。这程序第一次写了7K,第二次用指针简化成4K,其中有掉电保存和LED的显示,和一个相位时间的设置。这么大的程序主要是数码管用错了,用成共阳的(多花费了大约300B),还有就是16个模式。。这是程序的大头。这对于51的初学者是个拿来练手的好程序。有兴趣的朋友可以回帖问我拿这个程序完整的功能要求。
以上是目前所知道的个人看法。关于& 代替% 网上有很多介绍,大家自己体会。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |