左右来回移动的流水灯
2016-01-28 12:13
267 查看
最近整理以前的程序代码,看到这个程序。这个程序好像是一个QQ群当时一个人问的一个问题,当时随手写了这个程序。这个程序运用到2个标志位,一个是左移标志位flag和右移标志位flag1。通过这两个标志位来决定移动的方向。硬件连接:51单片机的P0口连接一组LED灯,LED是下拉电阻。直接上代码:
今天把程序跑起来的时候发现2个问题。一、单片机上电后,第一个灯闪一下。找到原因是初始化aa并赋给P0后没有延时一段时间,加入延时后正常显示。二、在左移和右移的时候会出现紊乱的现象,找到原因是把计数器i和j的值都计数的8次,因为第一个灯初始化是亮的,应该往左移7位就8个灯全部点亮了,这个时候该往右移的,右移也只需要移动7位够了。因此把这个问题解决后就正常显示了。
这个小例子可以看出我们在写程序的时候,一定要把问题分析透彻了。
#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int void Delay10ms(uint); uchar aa; uchar flag,flag1; //flag设定循环左移标志,flag1设定循环右移的标志 void main() { uchar i,j; aa=0x01; P0 = aa; Delay10ms(100);//如果不加这个延时,第一个灯看到就闪一下 flag = 1; while(1) { if(flag) { for(i=0;i<7;i++) { aa = _crol_(aa,1); P0 = aa; Delay10ms(100); } flag = 0; flag1 = 1; } if(flag1) { for(j=7;j>0;j--) { aa = _cror_(aa,1); P0 = aa; Delay10ms(100); } flag1 = 0; flag = 1; } } } void Delay10ms(uint c) //误差 0us { uchar a, b; //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--// for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } }
今天把程序跑起来的时候发现2个问题。一、单片机上电后,第一个灯闪一下。找到原因是初始化aa并赋给P0后没有延时一段时间,加入延时后正常显示。二、在左移和右移的时候会出现紊乱的现象,找到原因是把计数器i和j的值都计数的8次,因为第一个灯初始化是亮的,应该往左移7位就8个灯全部点亮了,这个时候该往右移的,右移也只需要移动7位够了。因此把这个问题解决后就正常显示了。
这个小例子可以看出我们在写程序的时候,一定要把问题分析透彻了。
相关文章推荐
- 北京Uber优步司机奖励政策(1月28日)
- title属性中的内容包含大于号和小于号, 如何替换?
- C#入门到精通学习笔记01
- iOS学习之路-简易”IT之家“(UITableView)
- confluence5.6安装
- android主要有5中数据存储方式
- Squid缓存代理服务器安装过程
- Tomcat开机启动
- 批量修改文件名_20160128
- Codeforces Round #340 (Div. 2) E. XOR and Favorite Number
- 用python生成验证码图片
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(1月28日)
- prototype
- vs编译【输出】和【错误列表】
- Android实现流量统计和网速监控悬浮窗
- idea点击+号没有tomcat插件解决方法
- Java8大排序方法
- HDU 2048 2049 (错排,排列组合)
- TCP和UDP的异同点
- C均值算法(K-means)在opencv中实现图像分割(抠图)