اطلاعیه

Collapse
No announcement yet.

چند برنامه به زبان C برای اسکن صفحه کلید!

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

    #16
    پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

    سلام باز هم سپاس
    تقریبا نفهمیدم در مورد برنامه نویسی پیشنهادتون چی بود شاید چون آخر وقته فردا صبح دوباره می خونمش! :agree:(فعلا لازم نیست که توضیح بدید سوالی بود می پرسم :redface
    مدار قبلی و آخرین برنامه که گفتم وقفه در آن غیر فعال شده و پس از خواندن کلید دوباره فعال می شود مشکل سرعت داشت و همچنان گاهی با یکبار فشردن یک کلید دو بار وقفه رخ میداد و اگر قرار بود تاخیر در روتین وقفه افزایش یابد معقول نبود، بنابراین سخت افزار و نرم افزار رو طوری تغییر دادم که وقفه حساس به سطح صفر باشد و این دیگه مشکلات قبلی رو نداره! :agree:
    البته اگه فردا دوباره نیام سراغش و چیزه دیگه ای شده باشه!!
    بفرمائید،اینم فایل پروتئوس و کدویژن:
    http://www.persiangig.com/pages/down...d_lowlevel.rar
    همیشه بزرگوار تر از آن باشید که برنجید
    و نجیب تر از آن باشید که برنجانید!

    دیدگاه


      #17
      پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

      ببینید منظور من یه همچین چیزیه :

      #include<ioavr.h>
      #include<intrinsics.h>
      #include "lcd.h"
      #include "delay.h"
      #include "stdio.h"
      __flash char digit[17]=
      {'\0','0','1',' 2','3','4','5', '6','7','8','9& #039;,'A','B','C',&# 039;D','E','F'};
      unsigned char key,i;
      __C_task void main(void)
      {

      TCNT1H=0x3C;
      TCNT1L=0xB0;
      TIMSK=0x04;
      GICR|=0x40;
      MCUCR=0x03;
      MCUCSR=0x00;
      GIFR=0x40;
      DDRA=0X0F;
      PORTA=0X0F;
      __enable_interrupt();
      lcd_init(LCD_DISP_ON);
      lcd_clrscr();
      lcd_home();
      lcd_puts("Enter your pass"
      _delay_ms(2000);
      lcd_clrscr();
      while(1){
      };
      }
      /***********INT0*******************/
      #pragma vector= INT0_vect
      __interrupt void EXT_INT0(void)
      {

      unsigned char count;
      GICR=0x00;
      GIFR=0x00;
      TCCR1B=0X02;
      PORTA=0X01;
      i=0;
      for(count=1;count<5;count++){
      if(PINA&(1<<PINA4))key=(count*4-3);
      if(PINA&(1<<PINA5))key=(count*4-2);
      if(PINA&(1<<PINA6))key=(count*4-1);
      if(PINA&(1<<PINA7))key=(count*4);
      if(PORTA<0X80)PORTA<<=1;
      }
      PORTA=0X0F;
      lcd_putc(digit[key]);
      }
      /* Timer1 overflow interrupt service routine*/
      #pragma vector= TIMER1_OVF_vect
      __interrupt void TIMER1_OVF(void)
      {
      unsigned char debounce=20;
      /* Reinitialize Timer1 value for 50ms*/
      TCNT1H=0x3CB0 >> 8;
      TCNT1L=0x3CB0 & 0xff;
      /********* check debounce ************/
      if(++i==debounce){
      GICR|=0x40;
      GIFR=0x40;
      PORTA=0X00;
      }
      if(i==(debounce+1)){
      PORTA=0X0F;
      i=0;
      TCCR1B=0x00;/* Clock value: Timer 0 Stopped*/
      }
      }


      خوب حالا اینطوری ما یک دیبانس یک ثانیه در زمان فشار داده شدن هر کلید خواهیم داشت یعنی اینکه اگر یک کلید فشرده بشه اون کلید داخل روتین وقفه خارجی صفر اسکن میشه و تا 1 ثانیه ی بعد هم هیچ عمل اسکن که در واقع ریشه در اجرای وقفه خارجی صفر داره انجام نمیشه به این ترتیب اگر کلید برای مدت بیش از 1 ثانیه فشرده بمونه هر یک ثانیه اون کلید اسکن و در صفحه نمایش نشون داده میشه که البته میتونیم با تغییر مقدار DEBOUNCE از 50 میلی ثانیه تا 255*50 میلی ثانیه دیبانس داشته باشیم

      دیدگاه


        #18
        پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

        :biggrin:
        ممنون آره جالبه تستش می کنم و میگم در عمل چه طوره! :mrgreen:
        اما یه سوال: خب وقتی وقفه خارجی رخ داده وقفه غیر فعال شده و تایمر فعال شده، دو تا شرط نوشتید در وقفه سرریز تایمر: یکی وقتی به تعداد 20 بار وقفه رخ داد وقفه خارجی فعال و پورت صفر، یکی هم وقتی 21 بار وقفه رخ داد پورت رو مقدار دهی می کنید و i رو صفر و تایمر غیر فعال، سوال اینه که چرا دوتا شرط نوشتید چرا توی همون شرط اول پورت رو مقدار دهی، i رو صفر و تایمر رو غیر فعال نکردید؟ :mrgreen:
        با سپاس
        همیشه بزرگوار تر از آن باشید که برنجید
        و نجیب تر از آن باشید که برنجانید!

        دیدگاه


          #19
          پاسخ : چند برنامه به زبان C برای اسکن صفحه کلید!

          عنوان اصلی رو به : چند برنامه به زبان C برای اسکن صفحه کلید تغییر دادم. :mrgreen:
          اگر از دوستان کسی راههای ساده تر و موثرتری سراغ داره لطف کنه بگه ببینیم آخرش کدوم یکی بهتر از آب در میاد :mrgreen:
          از همتون ممنونم
          همیشه بزرگوار تر از آن باشید که برنجید
          و نجیب تر از آن باشید که برنجانید!

          دیدگاه


            #20
            پاسخ : چند برنامه به زبان C برای اسکن صفحه کلید!

            سلام
            من اینو به زبان Keil پیدا کردم
            ببین چطوره ؟
            من هنوز سراغ سی نرفتم تو راهم :biggrin:
            http://www.4shared.com/file/JnklhQ1w/key_int.html
            خدایا مرا آن ده که آن به

            دیدگاه


              #21
              پاسخ : چند برنامه به زبان C برای اسکن صفحه کلید!

              خوب کار دیگه ای که میشه انجام داد که البته بستگی به شما داره که چجور انتظاری از برنامه دارید آیا می خواهید که مثلا هر وقت که یک کلید فشرده شد عمل اسکن انجام بشه با یک دیبانس خاص و یا اینکه عمل اسکن هموراه انجام بشه با یک دیبانس خاص خوب اولی رو که گفتم اما برای دومی می تونیم بیایم توی یکی از روتین های سریز تایمر که احتمالا توی برنامه تون ازش استفاده کردید یک متغیر تعریف کنیم و افزایش پله پله اون رو در هر بار وقوع وقفه چک کنیم که مثلا اگر به 20 رسید بیاد عمل اسکن رو توی همون روتین سریز انجام بده و اون متغیر رو هم برابر با صفر کنه اینجوری هر N ثانیه ( با توجه به مدت زمان لازم برای رخ دادن یک وقفه سریز و حدی که برای اون متغیر تعریف کرید ) عمل اسکن انجام میشه که اون N ثانیه در واقع حکم دیبانس نرم افزاری رو برای ما خواهد داشت اگه خواستین یک نمونه کد هم می نویسم براش

              نوشته اصلی توسط جعفری
              اما یه سوال: خب وقتی وقفه خارجی رخ داده وقفه غیر فعال شده و تایمر فعال شده، دو تا شرط نوشتید در وقفه سرریز تایمر: یکی وقتی به تعداد 20 بار وقفه رخ داد وقفه خارجی فعال و پورت صفر، یکی هم وقتی 21 بار وقفه رخ داد پورت رو مقدار دهی می کنید و i رو صفر و تایمر غیر فعال، سوال اینه که چرا دوتا شرط نوشتید چرا توی همون شرط اول پورت رو مقدار دهی، i رو صفر و تایمر رو غیر فعال نکردید؟ :mrgreen:
              خوب ببینید مثلا شما وقتی که یکی از کلید های صفحه کلید کامپیوتر رو برای یک مدتی نگه میدارید بعد از گذشت یک مدت زمان خاص که همون دیبانس باشه اسکن صفحه کلید تکرار و اون کاراکتر چاپ میشه خوب از اونجا که توی برنامه من وقفه رو حساس به لبه بالا رونده کردم و حداقل پهنای پالس برای اینکه میکرو اون رو تشخیص بده یک چیزی حدود 50 نانو ثانیه هست من اومدم گفتم برای اینکه اون اتفاقی که در مورد کلید فشرده شده در صفحه کلید کیبورد میوفته ما باید یک لبه بالا رونده با پهنای پالسی قابل تشخیص و مطمئن برای میکرو امدم گفم که بعد از 20 بار اول بیایم پورت رو صفر کنیم یعنی بیایم پالس رو بکشیم پایین و در بار بعدی که وقفه صورت میگیره دوباره پالس رو بکشیم بالا و یک لبه بالا رونده ایجاد کینم تا میکرو اون رو تشخیص بده و عمل اسکن رو دوباره تکرار کنه !
              امیدوارم منظورم رو درست رسونده باشم البته احتمالا برنامه ای که نوشتم برای اینکار زیاد جالب نباشه اما خوب فعلا همین به نظرم رسید

              دیدگاه


                #22
                پاسخ : چند برنامه به زبان C برای اسکن صفحه کلید!

                سلام و سپاس
                اگه خواستین یک نمونه کد هم می نویسم براش
                آقا ممنون لازم نیست اینکارو کنید،متوجه منظورتون شدم. :agree:

                امدم گفم که بعد از 20 بار اول بیایم پورت رو صفر کنیم یعنی بیایم پالس رو بکشیم پایین و در بار بعدی که وقفه صورت میگیره دوباره پالس رو بکشیم بالا و یک لبه بالا رونده ایجاد کینم تا میکرو اون رو تشخیص بده و عمل اسکن رو دوباره تکرار کنه !
                اینو در ست نفهمیدم! :redface: شما لطف کنید نگید چرا اینکار رو کردید بفرمائید اگه اینکار رو نکنیم مشکلی پیش میاد؟ چه مشکلی؟ :redface:

                سپاس سپاس سپاس
                همیشه بزرگوار تر از آن باشید که برنجید
                و نجیب تر از آن باشید که برنجانید!

                دیدگاه


                  #23
                  پاسخ : چند برنامه به زبان C برای اسکن صفحه کلید!

                  سلام دوستان.
                  من یه سوال دریاره اسکن کیپد داشتم دیدم بهتره اینجا که اساتید فعالن بنویسم
                  من از روش اسکن کیبورد بدون استفاده از وقفه استفاده میکنم که تو پروتئوس درست کار میکنه اما وقتی رو میکرو میرم همون اولین شرطو اجرا میکنه در هموون خط اول .برنام رو هم میزارم.در ضمن من فقط تو مدار عملیم 4 تا مقاومت برای ستونهام که به ترتیب بهPC4 تا PC7 رو وصل کردم . دوستان لطفا کمک کنین:


                  #include <mega16.h>
                  #include <delay.h>
                  #include <stdio.h>
                  // Alphanumeric LCD Module functions
                  #include <alcd.h>
                  #include <stdlib.h>;
                  // Declare your global variables here
                  int kbd=16;
                  unsigned char vlcd[16];

                  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=0x0F;

                  // 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;


                  lcd_init(16);

                  while (1)
                  {
                  // Place your code here
                  do{
                  lcd_clear();
                  lcd_gotoxy(0,0);
                  lcd_putsf(" Press Key"
                  PORTC=0xFF;
                  PORTC.0=0;
                  if(PINC.4==0){kbd=1;goto lflow;}
                  if(PINC.5==0){kbd=2;goto lflow;}
                  if(PINC.6==0){kbd=3;goto lflow;}
                  if(PINC.7==0){kbd=12;goto lflow;}
                  //satre 2
                  PORTC=0xFF;
                  PORTC.1=0;
                  if(PINC.4==0){kbd=4;goto lflow;}
                  if(PINC.5==0){kbd=5;goto lflow;}
                  if(PINC.6==0){kbd=6;goto lflow;}
                  if(PINC.7==0){kbd=13;goto lflow;}
                  //satre 3
                  PORTC=0xFF;
                  PORTC.2=0;
                  if(PINC.4==0){kbd=7;goto lflow;}
                  if(PINC.5==0){kbd=8;goto lflow;}
                  if(PINC.6==0){kbd=9;goto lflow;}
                  if(PINC.7==0){kbd=14;goto lflow;}
                  //satre 4
                  PORTC=0xFF;
                  PORTC.3=0;
                  if(PINC.4==0){kbd=10;goto lflow;}
                  if(PINC.5==0){kbd=0;goto lflow;}
                  if(PINC.6==0){kbd=11;goto lflow;}
                  if(PINC.7==0){kbd=15;goto lflow;}

                  delay_ms(5);
                  }
                  while(1);

                  lflow:
                  lcd_clear();
                  sprintf(vlcd,">%4u",kbd);
                  lcd_gotoxy(0,0);
                  lcd_puts(vlcd);
                  delay_ms (1000);


                  }
                  }
                  mer30

                  دیدگاه

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