打印
[AVR单片机]

大家帮我看看,都纠缠一星期了

[复制链接]
1112|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 | 只看该作者
看着也有点晕!

使用特权

评论回复
5
dxj520ly| | 2014-11-11 16:13 | 只看该作者
无法看啊:@

使用特权

评论回复
6
johnpage| | 2014-11-11 22:44 | 只看该作者
建議要註明問題點,程式上可能有很多問題,哪一個是真正困擾的地方。
腳位應該先定義清楚,避免程式使用錯誤的腳位,而產生大家都不知道的問題點。

使用特权

评论回复
7
johnpage| | 2014-11-13 22:06 | 只看该作者
/*
* EX1031112.cpp
*
* Created: 2014/11/12 下午 09:14:16
*  Author: Axon
*/

#ifndef F_CPU
        #define F_CPU 16000000UL
#endif

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

void my_delay_ms( unsigned int delay)
{
        while(delay--)
        {
                _delay_ms(1);
        }
}

int main(void)
{
        // 宣告變數
        enum { STATE0, HOLD0, STATE1, HOLD1, PAUSE, CHANGSPEED};
        enum { SPEED0 = 100, SPEED1 = 100};
        int STATE;
        int OLDSTATE;
        int SPEED;
        bool LoopButtonFlag;
        //bool PauseButtonFlag;

               
        // 初始化IO
        DDRA = 0xFF;                        // 定義Port A為輸出阜,並初始化 LED 燈全滅
        PORTA = 0xFF;
        DDRC = 0x00;                        // 定義Port C為輸入阜
        STATE = STATE0;                        // 初始化狀態
        SPEED = SPEED0;
        LoopButtonFlag = false;
        //PauseButtonFlag = false;                       
    while(1)
    {
        switch(STATE)
                {
                        case STATE0:
                                PORTA = (PORTA >> 1) & 0x7F;
                                my_delay_ms(SPEED);
                                if( PORTA == 0x00)                                // 是否達轉態條件
                                        STATE = HOLD0;
                                break;
                        case HOLD0:
                                my_delay_ms(100);
                                PORTA = 0xFF;
                                STATE = STATE1;
                                break;
                        case STATE1:
                                PORTA = (PORTA << 2) & 0xFC;
                                my_delay_ms(SPEED);
                                if( PORTA == 0x00)                                // 是否達轉態條件
                                STATE = HOLD1;
                                break;
                        case HOLD1:
                                my_delay_ms(100);
                                PORTA = 0xFF;
                                STATE = STATE0;
                                break;
                        case PAUSE:
                                break;
                        case CHANGSPEED:
                                break;
                }
               
                                // 檢查按鍵
                                if( PINC0 == 0)
                                LoopButtonFlag = true;
                                if( LoopButtonFlag == true && PINC0 == 1)
                                {
                                        if( STATE == PAUSE)
                                        {
                                                STATE = OLDSTATE;
                                        }
                                        else
                                        {
                                                OLDSTATE = STATE;
                                                STATE = PAUSE;
                                        }
                                        LoopButtonFlag = false;
                                }
    }
}

使用特权

评论回复
8
hyhmh| | 2014-11-19 08:42 | 只看该作者
楼主的程序没有实质应用意义。
建议:直接用定时器来完成,每一显示状态分解为步骤,用按键输入和当前状态来确定下一状态。

使用特权

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

本版积分规则

13

主题

31

帖子

0

粉丝