اطلاعیه

Collapse
No announcement yet.

مشکل با برنامه صفحه کلید 4*4 در زبان c

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

    مشکل با برنامه صفحه کلید 4*4 در زبان c

    راستش من حدود پنج سال پیش با اسمبلی برنامه صفحه کلید رو به شکل زیر نوشتم که الان هم تستش کردم به خوبی کار میکنه
    برنامه هم به این صورته که با فشردن هر کلید که به پورت D میکرو وصله یک عدد متناظر روی پورت B نشون داده میشه
    منطق برنامه اینطوریه که ستونها رو خروجی و سطرها رو ورودی تعریف کرده و ابتدا مقدار پورت D رو برابر FF میدیم و سپس به ترتیب با صفر کردن ستون ها , یک به یک سطرها رو چک می کنیم و هر سطری که صفر بود عدد مربوطه رو نشون میدیم.
    اما همین برنامه رو توی c که پیاده می کنم (با کدویژن) اصلا جواب نمیده و با فشردن کلیدها هیچ اتفاقی نمی افته
    لطفا کمکم کنید .

    برنامه اسمبلی:

    کد:
    /*
     * test30.asm
     *
     *  Created: 12/6/2013 5:41:33 PM
     *   Author: Home
     */ 
     .include "m32def.inc"
     .org 00
     ldi r16,high(ramend)
     out sph,r16
     ldi r16,low(ramend)
     out spl,r16
     ldi r17,0xff
     out ddrb,r17
     ldi r16,0x0f
     out ddrd,r16
     ldi r16,0xff
     main: 
     out portd,r16
     cbi portd,0
     nop
     sbic pind,4
     rjmp l1
     ldi r17,0b00000000
     out portb,r17
     call ring
     l1:
     sbic pind,5
     rjmp l2
     ldi r17,4
     out portb,r17
     call ring
     rjmp main
      l2:
     sbic pind,6
     rjmp l3
     ldi r17,8
     out portb,r17
     call ring
     rjmp main
     l3:
     sbic pind,7
     rjmp l4
     ldi r17,12
     out portb,r17
     call ring
     rjmp main
     l4:
     out portd,r16
     cbi portd,1
     nop
     sbic pind,4
     rjmp l5
     ldi r17,1
     out portb,r17
     call ring
     rjmp main
     l5:
     sbic pind,5
     rjmp l6
     ldi r17,5
     out portb,r17
     call ring
     rjmp main
     l6:
     sbic pind,6
     rjmp l7
     ldi r17,9
     out portb,r17
     call ring
     rjmp main
     l7:
     sbic pind,7
     rjmp l8
     ldi r17,13
     out portb,r17
     call ring
     rjmp main
     l8:
     out portd,r16
     cbi portd,2
     nop
     sbic pind,4
     rjmp l9
     ldi r17,2
     out portb,r17
     call ring
     rjmp main
     l9:
     sbic pind,5
     rjmp l10
     ldi r17,6
     out portb,r17
     call ring
     rjmp main
     l10:
     sbic pind,6
     rjmp l11
     ldi r17,10
     out portb,r17
     call ring
     rjmp main
     l11:
     sbic pind,7
     rjmp l12
     ldi r17,14
     out portb,r17
     call ring
     rjmp main
    l12:
    out portd,r16
     cbi portd,3
     nop
     sbic pind,4
     rjmp l13
     ldi r17,3
     out portb,r17
     call ring
     rjmp main
     l13:
     sbic pind,5
     rjmp l14
     ldi r17,7
     out portb,r17
     call ring
     rjmp main
     l14:
     sbic pind,6
     rjmp l15
     ldi r17,11
     out portb,r17
     call ring
     rjmp main
     l15:
     sbic pind,7
     rjmp main
     ldi r17,15
     out portb,r17
     call ring
     rjmp main
    
     ring:
     sbi portb,5
     call delay
     call delay
     cbi portb,5
     call delay
     call delay
     dec r17
     brne ring
     ret
    
     delay:
     ldi r20,250
     l18:ldi r21,200
     l17:nop
     nop
     nop
     nop
     nop
     dec r21
     brne l17
     dec r20 
     brne l18
     ret
    برنامه c :

    کد:
    #include <mega32a.h>  
    #include <delay.h>
    #include <stdio.h>
    
    
    
    void main(void)
    {
          DDRB=0xff; 
          DDRD = 0x0f; 
          PORTD=0xff;
         
    while (1)        
          { 
          PORTD=0B11111110; 
          delay_us(20); 
          if (PORTD4==0){
          PORTB=0x00; 
          }
           if (PORTD5==0){
          PORTB=0x04;
          }
           if (PORTD6==0){
          PORTB=0x08;
          }
           if (PORTD7==0){
          PORTB=0x0c; 
          }  
          
          PORTD=0B11111101; 
          delay_us(20);
          
          if (PORTD4==0){
          PORTB=0x01; 
          }
           if (PORTD5==0){
          PORTB=0x05;
          }
           if (PORTD6==0){
          PORTB=0x09;
          }
           if (PORTD7==0){
          PORTB=0x0d; 
          }                    
           
          PORTD=0B11111011; 
          delay_us(20);
          
          if (PORTD4==0){
          PORTB=0x02; 
          }
           if (PORTD5==0){
          PORTB=0x06;
          }
           if (PORTD6==0){
          PORTB=0x0a;
          }
           if (PORTD7==0){
          PORTB=0x0e; 
          }
          
          PORTD=0B11110111; 
          delay_us(20);
          
          if (PORTD4==0){
          PORTB=0x03; 
          }
           if (PORTD5==0){
          PORTB=0x07;
          }
           if (PORTD6==0){
          PORTB=0x0b;
          }
           if (PORTD7==0){
          PORTB=0x0f; 
          }   
                    
          }
    }
    جدیدترین ویرایش توسط test001; ۱۳:۵۵ ۱۳۹۷/۱۱/۱۸.

    #2
    پاسخ : مشکل با برنامه صفحه کلید 4*4 در زبان c

    سلام وقت بخیر.
    نمیدونم چطور کدویژ« از کد شما ارور نگرفته اما وقتی میخوای وضعیت یک پین که وروردی تنظیم شده رو چک کنید باید از رجیستر PIN استفاده کنید و به عنوان مثال اگه پین 1 از پورت A برابر 1 شده بود رو اینطوری مینویسیم:
    کد:
    if(PINA.1==1)
    {
    .
    .
    .
    }
    برنامه که شما نوشتی اگه با یک حلقه for اون رو بنویسی ساده تر و بهتر میشه، این یک نمونه رو نگاه کنید:
    کد:
    #include <mega32.h>
    #include <delay.h>
    #include <stdio.h>
    #include <alcd.h>
    
    char lcd[16];
    char s[4][4]={
    {0,4,8,12},
    {1,5,9,13},
    {2,6,10,14},
    {3,7,11,15}};
    char i;
    int a;
    
    void main()
    {
     DDRD=0x0f;
     lcd_init(16);
     lcd_clear();
     lcd_gotoxy(0,0);
     lcd_putsf("hi");
     while(1)
     {
       for(i=0;i<=3;i++)
       {
          PORTD=1<<i;
          delay_ms(10);
          a=PIND&0xf0;
          
          if(a==0x10)
          {
            sprintf(lcd,"Scan:%d  ",s[0][i]);
            lcd_gotoxy(0,0);
            lcd_puts(lcd);
          }  
          
          if(a==0x20)
          {
            sprintf(lcd,"Scan:%d  ",s[1][i]);
            lcd_gotoxy(0,0);
            lcd_puts(lcd);
          } 
          
          if(a==0x40)
          {
            sprintf(lcd,"Scan:%d  ",s[2][i]);
            lcd_gotoxy(0,0);
            lcd_puts(lcd);
          }               
          
          if(a==0x80)
          {
            sprintf(lcd,"Scan:%d  ",s[3][i]);
            lcd_gotoxy(0,0);
            lcd_puts(lcd);
          }
       }      
     }      
    }
    موفق باشید
    توی کانال یوتیوب من قراراه طراحی انواع بردهای الکترونیکی مثل بردهای تک لایه، دو لایه یا به طور کلی بردهای چند لایه، بردهای مبتنی بر میکروکنترلر، بردهای صنعتی، بردهای الکترونیک قدرت و بردهای فرکانس بالارو یاد بگیریم.
    همینطور کدنویسی انواع میکروکنترلرهای 8 بینی مثل میکروکنترلرهای خانواده AVR-STM8، میکروکنترلرهای میبتی بر معماری ARM مثل STM32 و پردازنده های مخصوص اینترنت اشیاء مثل ESP32-ESP8266 و DSPها یاد میگیریم.
    https://www.youtube.com/@aKaReZa75​

    دیدگاه


      #3
      پاسخ : مشکل با برنامه صفحه کلید 4*4 در زبان c

      نوشته اصلی توسط akaReza نمایش پست ها
      سلام وقت بخیر.
      نمیدونم چطور کدویژ« از کد شما ارور نگرفته اما وقتی میخوای وضعیت یک پین که وروردی تنظیم شده رو چک کنید باید از رجیستر PIN استفاده کنید و به عنوان مثال اگه پین 1 از پورت A برابر 1 شده بود رو اینطوری مینویسیم:
      کد:
      if(PINA.1==1)
      {
      .
      .
      .
      }
      برنامه که شما نوشتی اگه با یک حلقه for اون رو بنویسی ساده تر و بهتر میشه، این یک نمونه رو نگاه کنید:
      کد:
      #include <mega32.h>
      #include <delay.h>
      #include <stdio.h>
      #include <alcd.h>
      
      char lcd[16];
      char s[4][4]={
      {0,4,8,12},
      {1,5,9,13},
      {2,6,10,14},
      {3,7,11,15}};
      char i;
      int a;
      
      void main()
      {
       DDRD=0x0f;
       lcd_init(16);
       lcd_clear();
       lcd_gotoxy(0,0);
       lcd_putsf("hi");
       while(1)
       {
         for(i=0;i<=3;i++)
         {
            PORTD=1<<i;
            delay_ms(10);
            a=PIND&0xf0;
            
            if(a==0x10)
            {
              sprintf(lcd,"Scan:%d  ",s[0][i]);
              lcd_gotoxy(0,0);
              lcd_puts(lcd);
            }  
            
            if(a==0x20)
            {
              sprintf(lcd,"Scan:%d  ",s[1][i]);
              lcd_gotoxy(0,0);
              lcd_puts(lcd);
            } 
            
            if(a==0x40)
            {
              sprintf(lcd,"Scan:%d  ",s[2][i]);
              lcd_gotoxy(0,0);
              lcd_puts(lcd);
            }               
            
            if(a==0x80)
            {
              sprintf(lcd,"Scan:%d  ",s[3][i]);
              lcd_gotoxy(0,0);
              lcd_puts(lcd);
            }
         }      
       }      
      }
      موفق باشید
      ممنون از جوابتون
      دقیقا درست گفته بودید ولی من قبل از اینکه از PIND.4 استفاده کنم از PIND4 استفاده کردم و برنامه کار نکرد ولی کامپایلر هم هیچ ایرادی نگرفت و عجیب تر اینکه با اتمل استودیو هم تستش کردم و ایراد نگرفت حالا سوال من اینه کهمثلا این PIND4 دقیقا توی کامپایلر نشونه چی هست که ارور نگرفته ؟

      دیدگاه


        #4
        پاسخ : مشکل با برنامه صفحه کلید 4*4 در زبان c

        نوشته اصلی توسط test001 نمایش پست ها
        ممنون از جوابتون
        دقیقا درست گفته بودید ولی من قبل از اینکه از PIND.4 استفاده کنم از PIND4 استفاده کردم و برنامه کار نکرد ولی کامپایلر هم هیچ ایرادی نگرفت و عجیب تر اینکه با اتمل استودیو هم تستش کردم و ایراد نگرفت حالا سوال من اینه کهمثلا این PIND4 دقیقا توی کامپایلر نشونه چی هست که ارور نگرفته ؟
        سلام
        اگر اشتباه نکنم، PIND4 در اتمل استدیو معادل عدد 4 هستش

        دیدگاه

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