اطلاعیه

Collapse
No announcement yet.

رفع اشکال برنامه سی قفل میکرو

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    رفع اشکال برنامه سی قفل میکرو

    سلام این برنامه از خود انجمن دانلود شده

    منتها اشکالات زیادی داشت که احتمالا عمدا دربرنامه قرار داده بود

    یک سری از این مشکلات توسط خود دوستان انجمن حل شد

    اما الان فقط یک مشکل داره اونم رفرش ال سی دی می باشد که اگه دوستان زحمت بکشند مشکل رفع خواهد شد

    سطر دوم ال سی دی حالت کم رنگ و چشمکزن دارد اما سطر اول خوب است
    من مجبورم فرکانس میکرو 1 مگا بگیرم چون اگه مثلا 4 مگ بگیرم یا بیشتر اونوقت با یکبار زدن از کی پد اون چند شماره حساب میکنه
    اگه این مشکل که همگی مربوط به زمانند حل بشه دیگه برنامه مشکل نداره
    کد:
    #include <mega8.h>
     #include <delay.h>
    // Alphanumeric LCD Module functions
    #asm
      .equ __lcd_port=0x18 ;PORTB
    #endasm
    #include <lcd.h>
    
    // Declare your global variables here
    char keypad(void);
    char password_check(void);
    void new_password(void);
    #pragma warn-
    char eeprom password[5];
    char eeprom FirstUSE;
    #pragma warn+
    char password_att[5], password_temp[5],key=0,c,i=0,accept=0;
    void main(void)
    {
    
    PORTB=0x00;
    DDRB=0x00;
    
    PORTC=0x00;
    DDRC=0x00;
    
    PORTD=0x00;
    DDRD=0xf8;
    
    TCCR0=0x00;
    TCNT0=0x00;
    
    
    ACSR=0x80;
    SFIOR=0x00;
    
    // LCD module initialization
    lcd_init(16);
    
    
    // ***************************************Check First Use
    if(FirstUSE !=0x0A) 
    {
    password[0] =0x01;
    delay_ms(15);
    password[1] =0x01;
    delay_ms(15);
    password[2] =0x01;
    delay_ms(15);
    password[3] =0x01;
    delay_ms(15);
    FirstUSE = 0x0A;
    delay_ms(15);
    }
    
    PORTD=255;
    while (1)
       {   
       lcd_clear();
       lcd_putsf("Enter password *");
       lcd_gotoxy(0,1);
       lcd_putsf("Change password#");
       PORTD.3=1;
       PORTD.4=1;
       PORTD.5=1;
       PORTD.6=0;
       PORTD.7=0; 
       if(PIND.2==0)
        {
            delay_ms(20);
            if(PIND.2==0)
             {
                new_password();
             }
        }              
        if(PIND.0==0)
        {
            delay_ms(10);
            if(PIND.0==0)
             {
                password_check();
             }
        }              
       };
       }  
    
    ////////////////
    ////////////////
    char password_check()
    {    
        int temp=0; 
        lcd_clear();
        lcd_putsf("Enter password:"); 
        lcd_gotoxy(0,1); 
        for (i=0;i<4;i++)    
        {
            password_att[i]=keypad();
            lcd_putchar('*');
        }  
        for (i=0;i<4;i++)    
        {
            password_temp[i]=password[i];
        }   
        for (i=0;i<4;i++)    
        {  
          if (password_att[i]==password_temp[i])
            temp++;
        } 
        if(temp<4)
        {
            lcd_clear();
            lcd_putsf("invalid password!");
            temp=0;
            delay_ms(500);
            accept=0;
        }
        else if(temp==4) 
         {   
            lcd_clear();
            lcd_putsf("Password accepted!");
            PORTD.7=1;
            delay_ms(2500);
            accept=1; 
         }
        
        return accept;
        
    } 
    
    ////////////////
    ////////////////
    void new_password(void)
    {   
        int temp;
        lable:
        temp=0;
        lcd_clear(); 
        lcd_putsf("Enter old pass:");
        lcd_gotoxy(0,1); 
        for (i=0;i<4;i++)    
        {
            password_att[i]=keypad();
            lcd_putchar('*');
        }
        for (i=0;i<4;i++)    
        {
            password_temp[i]=password[i];
        }   
        for (i=0;i<4;i++)    
        {  
          if (password_att[i]==password_temp[i]) 
            temp++;
        } 
        if(temp>3) 
         {   
            lcd_clear();
            lcd_putsf("Enter new pass:"); 
            lcd_gotoxy(0,1); 
            for (i=0;i<4;i++)    
            {   
              password[i]=keypad();
              lcd_putchar('*');
            }
         } 
         else if(temp<4)
        {
            lcd_clear();
            lcd_putsf("invalid password!");
            temp=0;
            delay_ms(500);
            goto lable;
        }
    } 
    ////////////////
    ////////////////
    char keypad(void)
    {    
        char key_press=1;
        while(key_press) 
        {
        //////
        PORTD.3=0;
        PORTD.4=1;
        PORTD.5=1;
        PORTD.6=1; 
        if(PIND.0==0)
        {
            delay_ms(10);
            if(PIND.0==0)
            {
                key_press=0;
                key=1;
             }
        }    
        if(PIND.1==0)
        {
            delay_ms(10);
            if(PIND.1==0)
             {
                key_press=0;
                key=2;
             }
        }
        if(PIND.2==0)
        {
            delay_ms(10);
            if(PIND.2==0)
             {
                key_press=0;
                key=3;
             }
        } 
        
        /////
        PORTD.3=1;
        PORTD.4=0;
        PORTD.5=1;
        PORTD.6=1; 
        if(PIND.0==0)
        {    
            key_press=0;
            delay_ms(10);
            if(PIND.0==0)
             {
                key_press=0;
                key=4;
             }
        }
        if(PIND.1==0)
        {    
            key_press=0;
            delay_ms(10);
            if(PIND.1==0)
            {
                key_press=0;
                key=5;
             }
        }
        if(PIND.2==0)
        {        
            key_press=0;
            delay_ms(10);
            if(PIND.2==0)
            {
                key_press=0;
                key=6;
             }
        } 
        
        //////
        PORTD.3=1;
        PORTD.4=1;
        PORTD.5=0;
        PORTD.6=1; 
        if(PIND.0==0)
        {      
            key_press=0;
            delay_ms(10);
            if(PIND.0==0)
            {
                key_press=0;
                key=7;
             }
        }
        if(PIND.1==0)
        {      
            key_press=0;
            delay_ms(10);
            if(PIND.1==0)
            {
                key_press=0;
                key=8;
             }
        }
        if(PIND.2==0)
        {     
            key_press=0;
            delay_ms(10);
            if(PIND.2==0)
            {
                key_press=0;
                key=9;
             }
        }              
        
        //////
        PORTD.3=1;
        PORTD.4=1;
        PORTD.5=1;
        PORTD.6=0; 
        
        if(PIND.1==0)
        {
            key_press=0;
            delay_ms(10);
            if(PIND.1==0)
            {
                key_press=0;
                key=0;
             }
        }
         
        
        }  
        delay_ms(100);
        return key; 
    }
    ادمهای خوب تو eca خیلی پیدا میشه

    #2
    پاسخ : رفع اشکال برنامه سی قفل میکرو

    خب چرا از تایمر استفاده نمیکنی؟
    حتی RTOSها هم با تایمر کارهاشون رو انجام میدن. شما هر چقدر که می خوای فرکانس رو ببر بالا. از اون می تونی با پریسکیلر بازم همه چیز رو به تعادل برسونی. مثلا توی مد CTC تایمر رو فعال کن(هر کدومش) و وقفه شون رو هم فعال کن. توی روتین وقفه کی پد رو چک کن.

    دیدگاه

    لطفا صبر کنید...
    X