打印
[51单片机]

初学单片机,做了个爆闪灯,同志们给参谋下吧,怎么优化

[复制链接]
2585|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lidaji0|  楼主 | 2013-11-8 22:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lidaji0 于 2013-11-8 22:36 编辑

功能就是:LED0、1和LED2、3分别为左右两组,模式就是左闪闪右闪闪,同闪闪,快慢
上菜,大家给看看怎么整能合理点
/*-----------------------------------------------
  
------------------------------------------------*/
#include<reg52.h>
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit LED6=P1^6;
sbit LED7=P1^7;
sbit KEY1=P0^0;
sbit KEY2=P0^1;
sbit KEY3=P0^2;
sbit KEY4=P0^3;
sbit KEY5=P0^4;
sbit KEY6=P0^5;
sbit KEY7=P0^6;
sbit KEY8=P0^7;
unsigned char i;  
unsigned char j;
unsigned char mode;
void Delay(unsigned int t);
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
unsigned char KeyScan(void);
void Init_LED(void);
void Init_Timer0(void);


/*------------------------------------------------
                  
------------------------------------------------*/
void main (void)
{
                 
unsigned char keyPress=0;
mode=0;
Init_LED();
Init_Timer0();
while (1)         
  {
  P0=0xFF;
  keyPress=KeyScan();
  if(keyPress!=0){
    switch(keyPress){
     
    case 1:
     mode=0;
     break;
    case 2:
     mode=1;
     break;
    case 3:
     mode=2;
     break;
    case 4:
     mode=3;
     break;
    case 5:
     mode=4;
     break;
    case 6:
     mode=5;
     break;
    case 7:
     mode=6;
     break;
    case 8:
     if(mode<6){
      mode+=1;
     }else{mode=0;}
     break;
    default :
     break;   
    }
  }

}
}
/*------------------------------------------------

------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
void DelayMs(unsigned char t)
{
     
while(t--)
{
     
     DelayUs2x(245);
  DelayUs2x(245);
}
}

/*------------------------------------------------
                  
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;      
TH0=(65536-20000)/256;      
TL0=(65536-20000)%256;
EA=1;            
ET0=1;         
TR0=1;         
}
/*------------------------------------------------
               
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{

switch(mode){
   case 0:
  TH0=(65536-20000)/256;      
   TL0=(65536-20000)%256;
  if(j<2){
   j++;
  }else{j=0;}
  if(j==0){
     if(i<11){i++;}else{i=0;}
     if(i<6){   
    LED2=1;
    LED3=1;
    LED0=!LED0;
    LED1=!LED1;
   }else{   
    LED0=1;
    LED1=1;
    LED2=!LED2;
    LED3=!LED3;
   }
  }
  
  
  break;
case 1:
  TH0=(65536-20000)/256;      
   TL0=(65536-20000)%256;
  if(j<4){
   j++;
  }else{j=0;}
  if(j==0){
     if(i<11){i++;}else{i=0;}
     if(i<6){   
    LED2=1;
    LED3=1;
    LED0=!LED0;
    LED1=!LED1;
   }else{   
    LED0=1;
    LED1=1;
    LED2=!LED2;
    LED3=!LED3;
   }
  }
  break;
case 2:
  TH0=(65536-20000)/256;      
   TL0=(65536-20000)%256;
  if(j<2){
   j++;
  }else{j=0;}
  if(j==0){
     if(i<11){i++;}else{i=0;}
     if(i<6){   
   
    LED0=!LED0;
    LED1=!LED1;
    LED2=!LED2;
    LED3=!LED3;
   }else{   
    LED0=1;
    LED1=1;
    LED2=1;
    LED3=1;
   }
  }
  break;
case 3:
  TH0=(65536-20000)/256;      
   TL0=(65536-20000)%256;
  if(j<2){
   j++;
  }else{j=0;}
  if(j==0){
     if(i<24){i++;}else{i=0;}
     if(i<6){   
    LED2=1;
    LED3=1;
    LED0=!LED0;
    LED1=!LED1;
   }else if(i<12){   
    LED0=1;
    LED1=1;
    LED2=1;
    LED3=1;
   }else if(i<18){
    LED0=1;
    LED1=1;
    LED2=!LED2;
    LED3=!LED3;
   }else{
    LED0=1;
    LED1=1;
    LED2=1;
    LED3=1;
   }
  }
  break;
case 4:
   TH0=(65536-20000)/256;      
   TL0=(65536-20000)%256;
  if(j<4){
   j++;
  }else{j=0;}
  if(j==0){
     if(i<24){i++;}else{i=0;}
     if(i<6){   
    LED2=1;
    LED3=1;
    LED0=!LED0;
    LED1=!LED1;
   }else if(i<12){   
    LED0=1;
    LED1=1;
    LED2=1;
    LED3=1;
   }else if(i<18){
    LED0=1;
    LED1=1;
    LED2=!LED2;
    LED3=!LED3;
   }else{
    LED0=1;
    LED1=1;
    LED2=1;
    LED3=1;
   }
  }
  break;
case 5:
  TH0=(65536-20000)/256;      
   TL0=(65536-20000)%256;
  if(j<4){
   j++;
  }else{j=0;}
  if(j==0){
     if(i<11){i++;}else{i=0;}
     if(i<6){   
   
    LED0=!LED0;
    LED1=!LED1;
    LED2=!LED2;
    LED3=!LED3;
   }else{   
    LED0=1;
    LED1=1;
    LED2=1;
    LED3=1;
   }
  }
  break;
case 6:
  break;
  }
}
void Init_LED(void)
{
P1=0xFF;
}
unsigned char KeyScan(void)
{
/********************************************************/  
if(!KEY1)
     {
   DelayMs(10);
      if(!KEY1)     
   {
         while(!KEY1);
      return 1;
   }
  }else if(!KEY2)  
     {
   DelayMs(10);
      if(!KEY2)     
   {
         while(!KEY2);
   return 2;
   }
  }else if(!KEY3)  
     {
   DelayMs(10);
      if(!KEY3)     
   {
         while(!KEY3);
      return 3;
   }
  }else if(!KEY4)  
     {
   DelayMs(10);
      if(!KEY4)     
   {
         while(!KEY4);
      return 4;
   }
  }else if(!KEY5)  
     {
   DelayMs(10);
      if(!KEY5)     
   {
         while(!KEY5);
      return 5;
   }
  }else if(!KEY6)
     {
   DelayMs(10);
      if(!KEY6)     
   {
         while(!KEY6);
      return 6;
   }
  }else if(!KEY7)  
     {
   DelayMs(10);
      if(!KEY7)     
   {
         while(!KEY7);
      return 7;
   }
  }else if(!KEY8)
     {
   DelayMs(10);
      if(!KEY8)   
   {
         while(!KEY8);
      return 8;
   }
  }else{return 0;}
     
}

相关帖子

沙发
From_the_UESTC| | 2013-11-8 23:13 | 只看该作者
注释都没有,懒得看。乍一看,觉得你的按键程序写得好复杂。明明你p0口做独立按键,直接一次性把p0口读回来,看是不是0xff,然后。。。。。
干嘛要一位一位的去读?

使用特权

评论回复
板凳
www5911839| | 2013-11-8 23:15 | 只看该作者

使用特权

评论回复
地板
Imakey| | 2013-11-9 00:42 | 只看该作者
贴流程图靠谱~~这样没什么人看的

使用特权

评论回复
5
zkybuaa| | 2013-11-9 08:00 | 只看该作者
粗略看了下,p0=0xFF是用来读端口时写1的吧?放在子函数keyscan里会更好些,这样能保证读端口时,端口锁存器始终是高电平。放在主函数里,会存在隐患。

使用特权

评论回复
6
黄小俊| | 2013-11-9 14:16 | 只看该作者
为什么要用位操作呢。直接就一排灯一起操作。。

使用特权

评论回复
7
绝地反击| | 2013-11-9 17:38 | 只看该作者

使用特权

评论回复
8
shell.albert| | 2013-11-9 20:30 | 只看该作者
哈哈,初生牛鵇不怕虎。
不过,这么一条一条的写,会强化**的。

使用特权

评论回复
9
zhouwj7| | 2013-11-9 21:25 | 只看该作者
好歹给个注释啊~~~

使用特权

评论回复
10
tang221986| | 2013-11-11 11:49 | 只看该作者
个人觉得思想和原理感觉比较重要,至于实现方式可以多看看大神的优质代码,求优质代码学习学习

使用特权

评论回复
11
51armfpga| | 2013-11-11 11:59 | 只看该作者
可以采用查表的方式,楼主可以试试

使用特权

评论回复
12
xyz549040622| | 2013-11-11 13:14 | 只看该作者
丫的,看的头晕、、、

使用特权

评论回复
13
lidaji0|  楼主 | 2013-11-13 13:00 | 只看该作者
我改改

使用特权

评论回复
14
大漠烟尘| | 2013-12-10 16:17 | 只看该作者
太复杂 为什么不做个数组形式

使用特权

评论回复
15
Yisuin| | 2013-12-10 20:03 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

79

帖子

0

粉丝