اطلاعیه

Collapse
No announcement yet.

اسکن keypad با استفاده از وقفه

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

    اسکن keypad با استفاده از وقفه

    سلام دوستان..................
    توی یکی از appnote های اتمل یه مدار اسکن صفحه کلید با استفاده از وقفه بود که به نظرم خیلی مفید میومد اما مشکلش این بود که با زبان اسمبلی نوشته شده بود بنابراین منم دست به کار شدم تونستم با c , کدویژن کدشو بنویسم کد کامل به همراه فایل پروتئوس و روش استفاده از اونو میتونید از وبسایت خودم دانلود کنید.امیدوارم مفید باشه.
    /************************************************** ***
    This program was produced by the
    Codevision V2.04.4a Advanced
    © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com

    Project :scan keypad with used interrupt
    Version : 1
    Date : 5/15/2010
    Author : alireza.najafi
    Company :www.dspworld.gigfa.com
    Comments:


    Chip type : ATmega16
    Program type : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/
    #include <mega16.h>
    #include <delay.h>
    #include <lcd.h>
    #include <stdio.h>
    #include <ctype.h>
    #asm
    .equ __lcd_port=0x15 ;PORTC
    #endasm


    unsigned char data_lcd[10];
    unsigned char w;

    unsigned char codef[4][4]={{'7','8','9',&#039 ;/'},{'4','5','6' ,'*'},{'1','2',&#039 ;3','-'},{'c','0','=' ,'+'}};
    unsigned char scan_key(void)
    {
    unsigned char i,data;
    unsigned char num_key;
    PORTB=0X01;

    for(i=0;i<4;i++)
    {
    data=(PINB)&(0xf0);
    if(data==0x10)
    num_key=codef[0][i];
    if(data==0x20)
    num_key=codef[1][i];
    if(data==0x40)
    num_key=codef[2][i];
    if(data==0x80)
    num_key=codef[3][i];
    delay_ms(30);
    PORTB=PORTB<<1;

    }


    PORTB=0x0f;
    return num_key;}

    void main(){
    ;
    lcd_init(16);
    lcd_clear();

    DDRC=0Xff;
    DDRB=0X0f;
    DDRD=0XF0;

    MCUCR=0X0c;
    GICR=0X80;
    GIFR=0X80;
    PORTB=0x0f;



    #asm("sei&quot
    while(1){

    }}
    interrupt [3] void scan(){

    w=scan_key();

    if(w!=0xff&isdigit(w)){
    w=w-48;


    lcd_clear();
    sprintf(data_lcd,"key:%d",w);

    lcd_puts(data_lcd);

    }
    else if(w=='c&#039
    lcd_clear();
    else{
    lcd_clear();
    sprintf(data_lcd,"key:%c",w);

    lcd_puts(data_lcd); }
    GIFR=0X80;
    }

    http://www.eca.ir/forum2/index.php/topic,10159.0.html
    Engineering is the art of making what you want from things you can get.
    اموزش DSP ...........................
    http://www.eca.ir/forum2/index.php?topic=29824.0
    http://www.eca.ir/forum2/index.php?topic=32324.0

    #2
    اسکن دو keypad با استفاده از وقفه ونمایش ان بر دو &#1587

    حالا یه سوال من دارم.
    من دوتا کی پد رو وصل کردم به atmega30و می خوام روی دوسگمنت نمایشش بدم. درواقع سوال من اینه هرکدوم از صفحه کلیدها که فشرده شد سگمت اول پورت رو نشون بده و سگمت دوم مقدار زده شده کلید رو.
    اما هیچی نشون نمیده تازه می خوام از اینتراپت استفاده کنم. :read:
    برنامشو می گذارم یه نگا کنید.تو کدویژن تازه کارم!!!!!! :icon_razz:
    /************************************************** ***
    ************************************************** ***/
    #include <mega32.h>
    #include<delay.h>
    unsigned char key ,butnum,num,j;
    flash unsigned char keytbl[16]={0xee, 0xed, 0xeb, 0xe7,
    0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb, 0xb7, 0x7e,
    0x7d, 0x7b, 0x77};
    flash char digits[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,
    0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71} ;

    // Declare your global variables here

    void main(void)
    {

    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTA=0x00;
    DDRA=0x00;

    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0x00;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0xff;
    PORTC=keytbl[0];
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    #asm("sei&quot
    while (1)
    {
    GICR=0b01000000;
    MCUCR=0b00000010;
    DDRB=0x0f;
    PORTB=0xf0;
    delay_us(5);
    key = PINB;
    DDRB = 0xf0;
    PORTB = 0x0f;
    delay_us(5);
    key = key | PINC;
    delay_ms(10);
    if (key != 0xff)
    {
    for (butnum=0; butnum<16; butnum++)
    {
    if (keytbl[butnum]==key)
    break;
    }
    if (butnum==16) butnum=0;
    else butnum++;
    }
    else butnum=0;
    PORTC=num[0x0b];
    delay_ms(5);
    }
    interrupt [2] void keytbl(void)
    {DDRC=0x0f;
    PORTC=0xf0;
    delay_us(5);
    key=key|PINA;
    delay_ms(10);
    if(key!=0xff)
    {for(butnum=0;butnum<16;butnum++)
    {
    if(keytbl[butnum]==key)
    break;}
    if(butnum==16)
    butnum=0;
    else
    butnum++;
    }
    else { butnum=0;
    PORTC=num[0x0a];
    delay_ms(5);
    j=key;
    PORTC=keytbl[key]|0x80;

    delay_ms(5);



    };
    }

    دیدگاه


      #3
      Keypad با استفاده از وقفه

      با سلام خدمت دوستان من برنامه key pad 4*4 با bascom با استفاده از وقفه رو میخواستم کسی از دوستان هست راهنمایی کنه به چه صورت هست ممنون میشم

      دیدگاه


        #4
        پاسخ : Keypad با استفاده از وقفه

        نوشته اصلی توسط tofan_2050
        با سلام خدمت دوستان من برنامه key pad 4*4 با bascom با استفاده از وقفه رو میخواستم کسی از دوستان هست راهنمایی کنه به چه صورت هست ممنون میشم
        دوستان من هم این رو لازم دارم. کسی می تونه به زبان بسکام رو اینجا بزاره؟؟

        دیدگاه


          #5
          پاسخ : Keypad با استفاده از وقفه

          نوشته اصلی توسط ho_612
          دوستان من هم این رو لازم دارم. کسی می تونه به زبان بسکام رو اینجا بزاره؟؟
          میتونی از این تایپیک بگیریش
          http://www.eca.ir/forum2/index.php?topic=53189.0

          دیدگاه


            #6
            پاسخ : اسکن keypad با استفاده از وقفه

            کدوم تاپیک ؟؟

            دیدگاه


              #7
              پاسخ : اسکن keypad با استفاده از وقفه

              نوشته اصلی توسط ho_612
              کدوم تاپیک ؟؟
              http://www.eca.ir/forum2/index.php?topic=53189.0

              دیدگاه


                #8
                پاسخ : اسکن keypad با استفاده از وقفه

                آیا من باید یک کیبرد 4*4 بسازم؟؟
                من کیپد دارم. مسئله اینجاست که وقتی از دستور
                Keybord = Getkbd()
                استفاده میشه باید میکرو دائم کیپد رو چک کنه و مشغول این دستور میشه.
                من می خوام میکرو کار دیگه ای انجام بده و هر وقت که کی برد استفاده شد مشغول عملکرد کی برد بشه.

                دیدگاه


                  #9
                  پاسخ : اسکن keypad با استفاده از وقفه

                  درضمن آقا tofan_2050
                  شما آخر تاپیک گفتید که :
                  ""با این مدار و این نوع برنامه نویسی که جواب نپرفتم ولی به روش دیگه با استفاده از وقفه جواب گرفتم ""
                  با چه روشی ؟؟

                  دیدگاه


                    #10
                    پاسخ : اسکن keypad با استفاده از وقفه

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

                    من این مدارو تست کردم به صورت عملی چون خودم به همچین مداری تو پروژه نیاز داشتم
                    فایل پروتوس رو هم گذاشتم میتونید تست کنید

                    دیدگاه


                      #11
                      پاسخ : اسکن keypad با بسکام

                      سلام من کامپیوتر می خونم و از الکترونیک زیاد سر در نمیارم.پایان نامه ام درمورد ساخت قفل رمز دیجیتاله .الان یک کد اسکن صفحه کلید دارم برا کیپد 4*4 اما نمی دونم جدول lookup رو چطوری بنویسم که اعداد درست نمایش داده بشه میشه کمکم کنید.اساس جدول lookup رو نمی دونم

                      7 8 9 ÷
                      4 5 6 *

                      1 2 3 -
                      ON/C 0 = +

                      کیپد به شکل بالاست اما با کد من به شکل زیر هست:
                      0 1 2 3
                      4 5 6 7
                      8 9 10 11
                      12 13 14 15

                      اینم کد :
                      $regfile = "m32def.dat"
                      $crystal = 8000000
                      Config Lcdpin = Pin , Db4 = Pinb.4 , Db5 = Pinb.5 , Db6 = Pinb.6 , Db7 = Pinb.7 , Rs = Pinb.2 , E = Pinb.3
                      Config Lcd = 16 * 2
                      Config Portc = Input
                      Config Portb = Output
                      Dim Asd As Byte
                      Dim A As Byte
                      Waitms 1

                      Enable Interrupts
                      Enable Int0
                      Config Int0 = Rising
                      On Int0 Int11
                      Do
                      Loop
                      End

                      Int11:
                      A = Pinc
                      A = A And &B00001111
                      Home
                      Lcd A
                      Return
                      حالا جدول lookup رو کجاش بذارم و چطوری ؟ مرسی
                      کمکمممممممممممممممممممممممممممممممممممممممم کنید لطفا

                      دیدگاه

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