本帖最后由 gaoyang9992006 于 2023-4-23 09:21 编辑
#技术资源# #每日话题# #申请原创#
最近我在倒腾玩,用12832配合AT89S52单片机研究底层的显示驱动写法。
比如给一个点坐标显示一个点。后来想着建立缓存空间,发现51的内存太小,放不下。
然后写了一个锯齿波测试,发现了多个分支如果不用else是会出现意想不到的BUG。
正确的写法如下
- for(i=0;i<128;i++)
- {
- if(i<32)
- setPixel(i,i);
- else if(i<64)
- setPixel(i,63-i);
- else if(i<96)
- setPixel(i,i-64);
- else if(i<128)
- setPixel(i,127-i);
- }
我发现删除了所有的else后就会出现问题了,显示的断断续续不完整的波。。
对应代码与图像如下
- //锯齿波
- for(i=0;i<128;i++)
- {
- if(i<32)
- setPixel(i,i);
- if(i<64)
- setPixel(i,63-i);
- if(i<96)
- setPixel(i,i-64);
- if(i<128)
- setPixel(i,127-i);
- }
因此要准确使用else,避免多次执行代码。
总结:
当没有采用else的时候程序会通过每一个if判断多个条件是否满足,满足的都会执行对应代码。
例如:i==1
那么后面的四条语句其实都满足的,所以都会执行。
当增加了else,只执行满足判断条件的第一个,如果第一个if满足条件,else后面紧跟的if就不会判断了,更不会执行后面的语句了。如果if 不满足才会尝试后面的几个else,直到找到第一个满足条件的,执行后面的语句。
有时候脑子一糊涂啊,就容易理解错。
分享给大家。
为了更好的分享,再补充上显示正弦波的注意事项- //锯齿波
- for(i=0;i<128;i++)
- {
- if(i<32)
- setPixel(i,i);
- else if(i<64)
- setPixel(i,63-i);
- else if(i<96)
- setPixel(i,i-64);
- else if(i<128)
- setPixel(i,127-i);
- delay_ms(1);
- }
-
- //正弦波
- for(i=0;i<128;i++)
- {
- y=16.0+sin(i/32.0*3.14)*16.0;
- j=(unsigned int)(y);
- setPixel(i,j);
- delay_ms(2);
- }
请注意y为浮点型,那么参与计算的常量最好全部写成浮点数,否则会作为整形计算,导致小数都被省略,那么就会显示成一条直线了,不信的可以将32.0改成32看看。。。我这里就不再晒错误的图像了。
给大家看看以上代码显示出来的图像。
|