# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > AVR >  اسکن صفحه کلید ماتریسی و نمایش روی سون سگمنت

## asal71

با سلام
برنامه زیر صفحه کلید 4*4 همراه با سون سگمت هست که بخش هایی که به رنگ قرمز هست رو خودم به برنامه اضافه کردم البته طبق گفته های استاد برای کار کردن سون سگمنت برنامه
که البته کار هم نمیکنه
میشه اشکال برنامه رو بگیرید
ممنون از همکاریتون#include<mega16.h>
#include<delay.h>
#define maxkeys 16
unsigned char key,butnum;
flash unsigned char keytb1[16]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xb  d,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
void main(void)
    {
        DDRB=0xFF;
        PORTB=0xFF;
       
        while(1)
            {
                DDRC=0x0F;
                PORTC=0xF0;
                delay_us(5);
                key=PINC;
                DDRC=0xF0;
                PORTC=0x0F;
                delay_us(5);
                key=key|PINC;
               
                 if(PINC.0==1&&PINC.4==1)
                {
                butnum=1;
                }           
                 if(PINC.0==1&&PINC.5==1)
                {
                butnum=1;
                }
                 if(PINC.0==1&&PINC.6==1)
                {
                butnum=1;
                }
                 if(PINC.0==1&&PINC.7==1)
                {
                butnum=1;
                }
                 if(PINC.1==1&&PINC.4==1)
                {
                butnum=1;
                }
                 if(PINC.1==1&&PINC.5==1)
                {
                butnum=1;
                }
                 if(PINC.1==1&&PINC.6==1)
                {
                butnum=1;
                }
                 if(PINC.1==1&&PINC.7==1)
                {
                butnum=1;
                } 
                 if(PINC.2==1&&PINC.4==1)
                {
                butnum=1;
                }
                 if(PINC.2==1&&PINC.5==1)
                {
                butnum=1;
                }
                 if(PINC.2==1&&PINC.6==1)
                {
                butnum=1;
                }
                 if(PINC.2==1&&PINC.7==1)
                {
                butnum=1;
                }                    
                 if(PINC.3==1&&PINC.4==1)
                {
                butnum=1;
                }
                 if(PINC.3==1&&PINC.5==1)
                {
                butnum=1;
                }
                 if(PINC.3==1&&PINC.6==1)
                {
                butnum=1;
                }
                 if(PINC.3==1&&PINC.7==1)
                {
                butnum=1;
                }
               
                if(key|=0xFF)
                {  
                    for(butnum=0;butnum<maxkeys;butnum++)
                        {
                            if(keytb1[butnum]==key)
                       
                            break;
                        }        
                    if(butnum==maxkeys)  butnum=0;
                      else butnum++;      
                }                
               else butnum=0;
               PORTB=~butnum;  
               
            }
    }

----------


## amir_mhdi

من از برنامتون خیلی سر در نیاوردم اما شما همه جا متغیر butnum رو 1 کردین که ظاهرا اشتباهه.

موفق باشید.

----------


## asal71

> من از برنامتون خیلی سر در نیاوردم اما شما همه جا متغیر butnum رو 1 کردین که ظاهرا اشتباهه.
> 
> موفق باشید.


بله 
خودم در دقیقه نود فهمیدم اشکال کارم چیه
باید یه متغیر دیگه در نظر میگرفتم و اون رو در حلقه هایی که ایجاد کردم قرار میدادم و در اخر اون رو به پورت B میفرستادم
در حلقه ها هم با توجه به اینکه حلقه مال کدوم کلید بود مقدار اون کلید رو میفرستادم براش

البته بازم یه گاهی برای برخی کلیدها مقادیر رو اشتباه نشون میداد
نمیدونم چرا :متفکر:

----------


## god of war

به نظرم خیلی سخت نوشتید برنامتونو
راه های خیلی راحت تری هم برای پیمایش کی پد هست 
من خودم از این روش اعداد رو سون سگمنت نمایش میدم


      k=4;
        for(i=0;i<4;i++)
        {
            PORTB=row[i];
            if(i==3)
            {
                if(PINB.4==0)
                {
                    while(PINB.4==0)
                    {
                    }
                        count=1;
                        k=0;
                }  
                else
                {
                    while(PINB.5==0)
                    {
                        num=0;
                        k=0;
                    }
                }
            }
            else
            {
                while(PINB.4==0)
                {
                    k=1;
                    num=i*3+k;
                    PORTA=table[num];
                }
                while(PINB.5==0)
                {
                    k=2;
                    num=i*3+k;
                    PORTA=table[num];
                }
                while(PINB.6==0)
                {
                    k=3;
                    num=i*3+k;
                    PORTA=table[num];
                }   
            }

----------


## فاطمه احم

> به نظرم خیلی سخت نوشتید برنامتونو
> راه های خیلی راحت تری هم برای پیمایش کی پد هست 
> من خودم از این روش اعداد رو سون سگمنت نمایش میدم
> 
> 
>       k=4;
>         for(i=0;i<4;i++)
>         {
>             PORTB=row[i];
> ...


 میشه لطفا همین برنامه اسکن کی پد روی سون سگمنت رو به زبان بیسیک بنویسید

----------


## فاطمه احم

سلام یه برنامه تو بسکام میخوام  ماشین حساب با کی پد ۴*۴ با دریافت عدد دو رقمی

----------

