- /*******************************************************************************************************
- 即时一键流水灯(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();
- }
- }
- }
复制代码
|