标题:
非中断编写的一键即时流水灯
[打印本页]
作者:
hutians
时间:
2015-2-10 17:44
标题:
非中断编写的一键即时流水灯
/*******************************************************************************************************
即时一键流水灯(89C52,程序优化)
在老师出的一道简单的题中,却出现了程序上的一些小毛病。看似小的毛病实则在大程序
中产生不可估量的后果,如下是对延时中出现的问题的解决办法:
一键流水灯要求即时响应,按下键盘立即响应,没有延时!在我修改之前的里,延时函数
中没有按键检测,从而导致了在按下按键后不能即时响应(需要等到延时完成之后才能响应)。
另外由于疏忽在key0()函数中漏掉了松手检测,导致了一次按键多次选择。更改后的程序由于
在延时中增加了键盘检测,所以只要有键按下,即使延时函数正在运行也会立即跳出。
键:key~P3^0 P2用于控制流水灯
心得:在写程序时要有严密的思维,在完成某个程序后要适当给程序一些优化,尽量使程
序更为精简。更重要的是要细心发现程序中一些不可见的弊端,这样可以降低程序出错的机率。
写程序时要养成好的习惯,使写出的程序看起来言简意赅,不容易遗漏!
********************************************************************************************************/
#include"reg52.h"
sbit key = P3^0;
typedef unsigned int uint;
char i,count=0,flag;
char code tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
0x03,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,
0x07,0x0e,0x1c,0x38,0x70,0xe0,0xc0,0x80
};
int delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=120;y>0;y--);
if(key==0) return 0;
}
return 0;
}
void mode_1()
{
switch(count)
{
case 0: flag = 25; break; //不显示
case 1: flag = 0; break; //从数组的第0个单元开始
case 2: flag = 8; break; //从数组的第8个单元开始
case 3: flag = 16; break; //从数组的第16个单元开始
}
}
void key0() //键盘扫描
{
if(key==0)
{
delay(10);
if(key==0)
{
count++; //若键盘有值则加1
if(count==4) count = 0;
mode_1();
i = 7; //用于跳出循环
while(!key); //松手检测
}
}
}
void main()
{
char temp;
flag = 25;
while(1)
{
temp = flag;
for(i=0;i<8;i++)
{
if(flag==25) P2 = 0x00;
else
P2 = tab[temp++];
delay(300);
key0();
}
}
}
复制代码
作者:
51gxl
时间:
2017-11-23 10:00
不错的思路,延时程序里加检测。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1