[AVR单片机] 大家帮我看看,都纠缠一星期了

[复制链接]
1758|7
 楼主| liuhuonihao 发表于 2014-8-2 16:38 | 显示全部楼层 |阅读模式
8个LED从左到右依次点亮,全部点亮8个LED后持续1秒钟8个LED全灭,然后从右到左,移动点亮2个LED,当最左边的2个LED点亮时完成一次循环,1秒钟后重新开始循环。
按下一个按钮,循环停止,再按一次,接着开始循环。
按下一个按钮,改变循环的速度,再按一次,回到原来的速度。
我的程序:
#include <iom16v.h>
#include <macros.h>
unsigned char DISP_NUM;                //电亮的位数,一共8位
unsigned char DISP_NUM2;
unsigned char num=0,num1=0;
void Delay_us(unsigned int time)
{
while(time--);
}

void Delay_ms(unsigned int time)
{
while(time--)
        {
        Delay_us(1000);
        }
}
void led(unsigned int speed)
{
  for(DISP_NUM=0;DISP_NUM<8;DISP_NUM++)        //循环点亮
         {
       PORTA&=~(1<<DISP_NUM);
           Delay_ms(speed);       
       
         }  
           Delay_ms(1000);  
           PORTA=0XFF;
        for(DISP_NUM2=0;DISP_NUM2<8;DISP_NUM2=DISP_NUM2+2)        //循环两个
         {
       PORTA&=~(0xC0>>DISP_NUM2);
           Delay_ms(speed);
           PORTA|=(0xC0>>DISP_NUM2);          
         }
             Delay_ms(1000);
}  

void main(void)
{
DDRA=0XFF;                                                                                        
PORTA=0XFF;
  DDRC=0X00;                                                                                        
PORTC=0XFF;
while(1)
{
    if((PINC&(1<<PC0))==0)           
          {
             num++;
                 while(!(PINC&(1<<PC0)));
          }
                 if(num%2==1)
                 {
                   led(200);
                   if((PINC&(1<<PC1))==0) break;
                 }
                 else {PORTA=0xff;}
        if((PINC&(1<<PC1))==0)
        {
           num1++;
           while(!(PINC&(1<<PC1)));       
        }
           if(num1%2==1)
           {
              led(1000);
           }
        else  if(num1%2==0)
                {
                   led(200);
                }
}
}
longmaodo 发表于 2014-8-4 13:18 | 显示全部楼层
if((PINC&(1<<PC1))==0) break; 这里的break会跳出最近的一个while 或者 for循环  你这个貌似会跳出while(1)
。。。。。。
longmaodo 发表于 2014-8-4 13:25 | 显示全部楼层
建议你先看看C语言设计规范  你这代码可读性有点差  和你上面说的那些要求相差太多了 你可以先画个流程图,再开始编程。
LBS18 发表于 2014-11-1 11:08 | 显示全部楼层
看着也有点晕!
dxj520ly 发表于 2014-11-11 16:13 | 显示全部楼层
无法看啊:@
johnpage 发表于 2014-11-11 22:44 | 显示全部楼层
建議要註明問題點,程式上可能有很多問題,哪一個是真正困擾的地方。
腳位應該先定義清楚,避免程式使用錯誤的腳位,而產生大家都不知道的問題點。
johnpage 发表于 2014-11-13 22:06 | 显示全部楼层
  1. /*
  2. * EX1031112.cpp
  3. *
  4. * Created: 2014/11/12 下午 09:14:16
  5. *  Author: Axon
  6. */

  7. #ifndef F_CPU
  8.         #define F_CPU 16000000UL
  9. #endif

  10. #include <avr/io.h>
  11. #include <util/delay.h>

  12. void my_delay_ms( unsigned int delay)
  13. {
  14.         while(delay--)
  15.         {
  16.                 _delay_ms(1);
  17.         }
  18. }

  19. int main(void)
  20. {
  21.         // 宣告變數
  22.         enum { STATE0, HOLD0, STATE1, HOLD1, PAUSE, CHANGSPEED};
  23.         enum { SPEED0 = 100, SPEED1 = 100};
  24.         int STATE;
  25.         int OLDSTATE;
  26.         int SPEED;
  27.         bool LoopButtonFlag;
  28.         //bool PauseButtonFlag;

  29.                
  30.         // 初始化IO
  31.         DDRA = 0xFF;                        // 定義Port A為輸出阜,並初始化 LED 燈全滅
  32.         PORTA = 0xFF;
  33.         DDRC = 0x00;                        // 定義Port C為輸入阜
  34.         STATE = STATE0;                        // 初始化狀態
  35.         SPEED = SPEED0;
  36.         LoopButtonFlag = false;
  37.         //PauseButtonFlag = false;                       
  38.     while(1)
  39.     {
  40.         switch(STATE)
  41.                 {
  42.                         case STATE0:
  43.                                 PORTA = (PORTA >> 1) & 0x7F;
  44.                                 my_delay_ms(SPEED);
  45.                                 if( PORTA == 0x00)                                // 是否達轉態條件
  46.                                         STATE = HOLD0;
  47.                                 break;
  48.                         case HOLD0:
  49.                                 my_delay_ms(100);
  50.                                 PORTA = 0xFF;
  51.                                 STATE = STATE1;
  52.                                 break;
  53.                         case STATE1:
  54.                                 PORTA = (PORTA << 2) & 0xFC;
  55.                                 my_delay_ms(SPEED);
  56.                                 if( PORTA == 0x00)                                // 是否達轉態條件
  57.                                 STATE = HOLD1;
  58.                                 break;
  59.                         case HOLD1:
  60.                                 my_delay_ms(100);
  61.                                 PORTA = 0xFF;
  62.                                 STATE = STATE0;
  63.                                 break;
  64.                         case PAUSE:
  65.                                 break;
  66.                         case CHANGSPEED:
  67.                                 break;
  68.                 }
  69.                
  70.                                 // 檢查按鍵
  71.                                 if( PINC0 == 0)
  72.                                 LoopButtonFlag = true;
  73.                                 if( LoopButtonFlag == true && PINC0 == 1)
  74.                                 {
  75.                                         if( STATE == PAUSE)
  76.                                         {
  77.                                                 STATE = OLDSTATE;
  78.                                         }
  79.                                         else
  80.                                         {
  81.                                                 OLDSTATE = STATE;
  82.                                                 STATE = PAUSE;
  83.                                         }
  84.                                         LoopButtonFlag = false;
  85.                                 }
  86.     }
  87. }
hyhmh 发表于 2014-11-19 08:42 | 显示全部楼层
楼主的程序没有实质应用意义。
建议:直接用定时器来完成,每一显示状态分解为步骤,用按键输入和当前状态来确定下一状态。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

31

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部