اطلاعیه

Collapse
No announcement yet.

صفحه کلید و میکرو

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

    صفحه کلید و میکرو

    سلام
    من یه LCD 16*2 دارم که میخوام با صفحه کلید 4*4 وقتی دکمه های scroll رو میزنم 3خط رو نشون بده
    یعنی اول خودش بدون اینکه دکمه ای رو بزنم و خودکار، 2خط اول رو نشون بده، بعد که دکمه ی Down رو زدم خط دوم و سوم رو نشون بده و اگه بعدش دکمه ی Up رو زدم دوباره 2خط اول رو نشون بده
    میشه بگین چکار کنم؟! قسمت آخر پایان نامه م هستش، لطفا کسی بلده کمکم کنه :cry:

    #2
    پاسخ : صفحه کلید و میکرو

    لطفا بگین که خودتون چقدرشو میتونین بنویسین که ما تو قسمتایی که شما مشکل دارین کمکتون کنیم ...
    Share OR Die

    دیدگاه


      #3
      پاسخ : صفحه کلید و میکرو

      نوشته اصلی توسط Mahdi.N
      لطفا بگین که خودتون چقدرشو میتونین بنویسین که ما تو قسمتایی که شما مشکل دارین کمکتون کنیم ...
      من میخوام یه اس ام اس رو که رو LCD نشون بدم، خط اول شماره ، خط بعدی ساعت و خط سوم متن اس ام اس باشه، دریافت اس ام اس میشه ، اما میخوام مثل موبایل که اگه تو صفحه جا نشه، با دکمه های بالا و پایین کل اس ام اس رو میخونیم، این سه خط رو ببینم، البته اولین بار که اس ام اس میاد خودش بدون دکمه خط 1 و 2 رو نشون بده بعد ما بالا پایینش کنیم با دکمه های 'u' و 'd'
      اینم دستورهای اولیه که میدونستم برای صفحه کلید باید نوشت فقط علامت سوالها رو بلد نبودم

      کد:
      unsigned char scan_key(void);
      unsigned char code[4][4]={{1,4,7,'s'},{2,5,8,0},{3,6,9,'m'},{'c','u','d','e'}};
      char buffer_lcd[10];
      void main(void)
      {
      unsigned char key ;
      PORTA=0x0f;
      DDRA=0xf0;
        while(1)
       {  
      key=scan_key(); 
      if(key!=0xff)
      {
      ?????
       }  
       }
      unsigned char scan_key(void)
      {
          unsigned char i,data, num_key, temp;
          num_key=0xff;
          temp=0x70;
          for(i=0;i<4;i++)
          {
              PORTA=temp;
              delay_ms(5);
              data=PINA & 0x0f;
              if (data==0x07)
                  num_key=code[0][i];
              if (data==0x0B)
                  num_key=code[1][i];
              if (data==0x0D)
                  num_key=code[2][i];
              if (data==0x0E)
                  num_key=code[3][i]; 
              temp=((temp>>=1) | 0x80) & 0xF0;
          }
          return num_key;
      }

      دیدگاه


        #4
        پاسخ : صفحه کلید و میکرو

        خب فرض می کنیم شما خوندن sms از حافظه ی ماژولتون و همچنین خوندن کیپد رو بلدین ...

        میتونین متنی که روی هر خط نمایش داده میشه رو تو یه رشته ذخیره کنید و وقتی دکمه ی پایین فشرده میشه با دستور lcd_gotoxy(,) میتونی متن جدید رو تو هر خطی که میخوای نمایش بدی ...

        اگه لازمه بگو بیشتر توضیح بدم ...
        Share OR Die

        دیدگاه


          #5
          پاسخ : صفحه کلید و میکرو

          نوشته اصلی توسط Mahdi.N
          خب فرض می کنیم شما خوندن sms از حافظه ی ماژولتون و همچنین خوندن کیپد رو بلدین ...

          میتونین متنی که روی هر خط نمایش داده میشه رو تو یه رشته ذخیره کنید و وقتی دکمه ی پایین فشرده میشه با دستور lcd_gotoxy(,) میتونی متن جدید رو تو هر خطی که میخوای نمایش بدی ...

          اگه لازمه بگو بیشتر توضیح بدم ...
          بله اگه بگین دقیقا برای استفاده از کلیدها چه کدی بنوسم؟؟؟
          فرض کنیم 3تا رشته داریم واسه چاپ
          کدهاشو چطور بذارم؟؟
          اینو نمیدونم :cry:

          دیدگاه


            #6
            پاسخ : صفحه کلید و میکرو

            در حالت اول :
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_puts(str1);
            lcd_gotoxy(0,1);
            lcd_puts(str2);
            اگر کلید پایین فشرده بشه :
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_puts(str2);
            lcd_gotoxy(0,1);
            lcd_puts(str3);

            چطوره ؟ بازم توضیح بدم ؟
            Share OR Die

            دیدگاه


              #7
              پاسخ : صفحه کلید و میکرو

              نوشته اصلی توسط Mahdi.N
              در حالت اول :
              lcd_clear();
              lcd_gotoxy(0,0);
              lcd_puts(str1);
              lcd_gotoxy(0,1);
              lcd_puts(str2);
              اگر کلید پایین فشرده بشه :
              lcd_clear();
              lcd_gotoxy(0,0);
              lcd_puts(str2);
              lcd_gotoxy(0,1);
              lcd_puts(str3);

              چطوره ؟ بازم توضیح بدم ؟
              ممنونم، اما مشکلم اینجاست که همین قسمتهای فارسی که نوشتین حالت اول یا اگه دکمه ی پایین فشرده بشه رو نمیدونم با IF بنویسم یا چیزه دیگه و مثلا تو شرط if چی بنویسم که بفهمه منظورم فشردن دکمه پایینه؟
              بعد هم اگه بعد پایین آمدن بخوام با دکمه بالا برم حالت اول باید چی بذارم؟
              مشکلم تو نوشتن کدهای صفحه کلیده

              دیدگاه


                #8
                پاسخ : صفحه کلید و میکرو

                اخه اول بحث فرض کردیم که شما کیپد رو خودتون میخونید ... میخونید؟
                فرض کنیم اسم تابع خوندن کیپد get_kbd() باشه ...
                فرض کنیم این تابع موقعی که اون کلید scrol رو میخونه عدد x رو برمیگردونه ...

                lcd_clear();
                lcd_gotoxy(0,0);
                lcd_puts(str1);
                lcd_gotoxy(0,1);
                lcd_puts(str2);
                if(x==get_kbd())
                {
                lcd_clear();
                lcd_gotoxy(0,0);
                lcd_puts(str2);
                lcd_gotoxy(0,1);
                lcd_puts(str3);
                }
                Share OR Die

                دیدگاه


                  #9
                  پاسخ : صفحه کلید و میکرو

                  نوشته اصلی توسط Mahdi.N
                  اخه اول بحث فرض کردیم که شما کیپد رو خودتون میخونید ... میخونید؟
                  فرض کنیم اسم تابع خوندن کیپد get_kbd() باشه ...
                  فرض کنیم این تابع موقعی که اون کلید scrol رو میخونه عدد x رو برمیگردونه ...

                  lcd_clear();
                  lcd_gotoxy(0,0);
                  lcd_puts(str1);
                  lcd_gotoxy(0,1);
                  lcd_puts(str2);
                  if(x==get_kbd())
                  {
                  lcd_clear();
                  lcd_gotoxy(0,0);
                  lcd_puts(str2);
                  lcd_gotoxy(0,1);
                  lcd_puts(str3);
                  }
                  مرسی
                  الان که میکروم سوخت فردا صبح امتحان میکنم خبرشو تا ظهر بهتون میدم
                  ولی باور کنین خیلی خنگ نیستم، فقط اولا تا حالا با صفحه کلید کار نکردم، کدهایی هم که نوشتم تا الان براش رو براتون تو اول بحث فرستادم، دوما هم 1شنبه - 2شنبه دفاع دارم
                  همین قسمتش مونده، ذهنم درگیره همه جا هست تمرکز ندارم :sad:
                  فردا امیدوارم تا ظهر سر یزنین که اگه نشد کمکم کنین
                  ببخشید خیلی زحمتتون دادن تا اینجا

                  دیدگاه


                    #10
                    پاسخ : صفحه کلید و میکرو

                    من اگه جای شما بودم یخورده از اساتید وقت می گرفتم چون فقط ساخت پروژه که نیست ... تستش هم طول میکشه ...

                    حالا از این حرفا بگذریم ...
                    برنامه و مداری رو که بستین بزارین رو سایت تا من کاملش کنم ...

                    ببخشید حواسم نبود ... الان میرم کد ها رو یه نگاهی می کنم ...
                    Share OR Die

                    دیدگاه


                      #11
                      پاسخ : صفحه کلید و میکرو

                      نوشته اصلی توسط Mahdi.N
                      خانوم اقبالی اخه من هر چی فکر می کنم نمیشه ادم بتونه با ماژولی که sms میده کار کنه اما نتونه lcd رو بنویسه ... حالا بی خیال ، امید وارم که از تعجبم ناراحت نشین ...
                      من اگه جای شما بودم یخورده از اساتید وقت می گرفتم چون فقط ساخت پروژه که نیست ... تستش هم طول میکشه ...

                      حالا از این حرفا بگذریم ...
                      برنامه و مداری رو که بستین بزارین رو سایت تا من کاملش کنم ...
                      والا بگم باور نمیکنین که من تا قبل این پروژه اصلا AVR کار نکرده بودم برای همین خیلی سخت گذشت بخصوص اینکه هم فاز فرستنده داشت هم گیرنده، اما الان اون قسمتهایی که نوشتم میشه گفت واقعا یاد گرفتمشون :smile:
                      صفحه کلید هم یک قسمتش رو یکی از اساتیدم کمکم کردن اما ادامه ش رو خودم باید تنها انجام میدادم که میگم زمان ندارم خیلی هم نگرانم
                      تو این وضع میکروم هم سوخت :cry:
                      من برنامه ی گیرنده رو براتون تا اینجا که کار میکنه (البته بجز این قسمتش که امشب ازتون پرسیدم) میذارم
                      کد:
                      #include <mega32.h>
                      #include <lcd.h>
                      #include <delay.h> 
                      #include <stdio.h>
                      #include <string.h>
                      // Alphanumeric LCD Module functions
                      #asm
                        .equ __lcd_port=0x15 ;PORTC
                      #endasm
                      
                      
                      #define RXB8 1
                      #define TXB8 0
                      #define UPE 2
                      #define OVR 3
                      #define FE 4
                      #define UDRE 5
                      #define RXC 7
                      
                      #define FRAMING_ERROR (1<<FE)
                      #define PARITY_ERROR (1<<UPE)
                      #define DATA_OVERRUN (1<<OVR)
                      #define DATA_REGISTER_EMPTY (1<<UDRE)
                      #define RX_COMPLETE (1<<RXC)
                      
                      
                      unsigned char scan_key(void);
                      unsigned char code[4][4]={{1,4,7,'s'},{2,5,8,0},{3,6,9,'m'},{'c','u','d','e'}};
                      char buffer_lcd[10];
                      
                      /// USART Receiver buffer
                      #define RX_BUFFER_SIZE 250   
                      char rx_buffer[RX_BUFFER_SIZE]; 
                      
                      #if RX_BUFFER_SIZE<256
                      unsigned char rx_counter=0;
                      #else
                      unsigned int rx_counter=0;
                      #endif
                      char *ptr,*ptr1,*ptr2,*ptr3,i,j,t,k[2]; 
                      int temp1=0, hightemp=30, lowtemp=28, diftemp1=0,diftemp2=0,number=0, keytemp=0,highkey=0, lowkey=0, enter=0;
                      char Enter=10, double_quote=34 , Ctrlz=26;  
                      
                      interrupt [USART_RXC] void usart_rx_isr(void)
                      {                             
                      char status,data;
                      status=UCSRA; 
                      data=UDR;  
                      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
                        {
                        rx_buffer[rx_counter]=data;           
                        if (rx_counter<RX_BUFFER_SIZE)rx_counter++;    
                        if (rx_counter==RX_BUFFER_SIZE) rx_counter=0;   
                      
                      
                        };
                      }
                      
                      
                      
                      // Standard Input/Output functions
                      
                      
                      // Timer 1 overflow interrupt service routine
                      interrupt [TIM1_OVF] void timer1_ovf_isr(void)  
                      {
                      // Place your code here                          
                       TCNT1H=0xff;   
                      TCNT1L=0x6f;          
                      // Place your code here
                      }
                      
                      // Declare your global variables here
                      
                      void main(void)
                      {
                      unsigned char key ;
                      // 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=0x0f;
                      DDRA=0xf0;
                      
                      // 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=0x00;
                      
                      // 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: 10.800 kHz
                      // Mode: Normal top=FFFFh
                      // OC1A output: Discon.
                      // OC1B output: Discon.
                      // Noise Canceler: Off
                      // Input Capture on Falling Edge
                      // Timer 1 Overflow Interrupt: On
                      // Input Capture Interrupt: Off
                      // Compare A Match Interrupt: Off
                      // Compare B Match Interrupt: Off
                      TCCR1A=0x00;
                      TCCR1B=0x05;
                      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=0x04;
                      
                      // USART initialization
                      // Communication Parameters: 8 Data, 1 Stop, No Parity
                      // USART Receiver: On
                      // USART Transmitter: On
                      // USART Mode: Asynchronous
                      // USART Baud rate: 115200
                      UCSRA=0x00;
                      UCSRB=0x98;
                      UCSRC=0x86;
                      UBRRH=0x00;
                      UBRRL=0x05;
                      
                      // Analog Comparator initialization
                      // Analog Comparator: Off
                      // Analog Comparator Input Capture by Timer/Counter 1: Off
                      ACSR=0x80;
                      SFIOR=0x00;
                      
                      // LCD module initialization
                      lcd_init(16);
                      
                      // Global enable interrupts
                      #asm("sei")
                      
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      printf("ATE0%C%c",13,10);  
                      lcd_putsf("Get sms...");
                       
                       while(1)
                       {   
                           key=scan_key(); 
                          if(key!=0xff)
                          {
                            
                          switch(key)
                          {
                          case 'm':
                          lcd_clear(); 
                          diftemp1=1;
                          lcd_clear();
                          lcd_gotoxy(0,0);
                          lcd_putsf(" ^ for HighTemp=");
                          lcd_gotoxy(0,1);
                          lcd_putsf(" v for LowTemp=");
                          break;
                          case 'u':
                           lcd_clear(); 
                          if(diftemp1==1)
                          {
                           diftemp1=0;
                           diftemp2=1;
                           hightemp=1;
                           lowtemp=0;
                           lcd_clear();
                          lcd_gotoxy(0,0);
                          lcd_putsf("HighTemp=");
                          }
                          break;
                          case 'd':
                          lcd_clear(); 
                          if(diftemp1==1)
                          {
                           hightemp=0;
                           lowtemp=1;
                           diftemp1=0;
                           diftemp2=1;
                           lcd_clear();
                          lcd_gotoxy(0,0);
                          lcd_putsf(" LowTemp="); 
                          }
                          break;
                          
                          case 's':
                          break;
                          
                          case 'c':
                          lcd_clear();
                          break;
                          
                          case 'e':
                          if(enter==1)
                          {
                          if(hightemp==1) {lcd_gotoxy(0,0); sprintf(buffer_lcd,"HighTemp is %d",keytemp); lcd_puts(buffer_lcd), lcd_gotoxy(0,1); lcd_putsf("save successfully");hightemp=0;lowtemp=0;
                          printf("at%c%c",10,13);
                          printf("At+CMGF=1%c%c",10,13);
                          delay_ms(500);
                          printf("at+cmgs=%c093....%c%c%c",double_quote,double_quote,10,13);
                          delay_ms(100);
                          printf("H=%d%c",keytemp,Ctrlz); }
                          
                          if(lowtemp==1) {lcd_gotoxy(0,0); sprintf(buffer_lcd,"LowTemp is %d",keytemp); lcd_puts(buffer_lcd), lcd_gotoxy(0,1); lcd_putsf("save successfully");hightemp=0;lowtemp=0; 
                          printf("at%c%c",10,13);
                          printf("At+CMGF=1%c%c",10,13);
                          delay_ms(500);
                          printf("at+cmgs=%c093.....1%c%c%c",double_quote,double_quote,10,13);
                          delay_ms(100);
                          printf("L=%d%c",keytemp,Ctrlz) ;}
                          
                          enter=0;
                          
                          }
                          break;
                          
                          default:
                          if(number==0) { lcd_gotoxy(9,0); number=1; sprintf(buffer_lcd,"%d",key); lcd_puts(buffer_lcd); keytemp=key*10; enter=1;}
                          else { lcd_gotoxy(10,0); number=0; sprintf(buffer_lcd,"%d",key); lcd_puts(buffer_lcd);keytemp=key+keytemp; enter=1;}
                          
                           
                          }
                          }
                          
                          delay_ms(1000);
                       	  printf("AT+CMGR=%c%c%c",'1',13,10);
                       	  rx_counter=0;
                          delay_ms(2000);
                       	  ptr=strstrf(rx_buffer,"+CMGR:");
                        	if(ptr!=0)
                        	{    
                        	  ptr1=strstrf(ptr,","); 
                      	    lcd_clear();
                      	    lcd_gotoxy(0,0);
                            for (j=0;j<13 ;j++ ) // baray namayeshe shomare
                            { 
                      	      lcd_putchar(*(ptr1+2+j));  
                            }
                              
                            ptr1=strstrf(ptr,",");
                      	    ptr1=strstrf(ptr1+1,",");
                      	    lcd_putchar('\n');
                            for (i=0; i<14 ; i++ )  // baray namayeshe tarikh va saat
                      	    {
                      	      lcd_putchar(*(ptr1+6+i));
                            } 
                      	    ptr1=strstrf(ptr,"\n");
                      	    if(ptr1!=0)
                      	    {
                              ptr2=strstrf(ptr1+1,"\r");
                              if(ptr2!=0)
                              {  
                                lcd_clear();
                                lcd_putchar('\n');
                                while(ptr1+1<ptr2) // baraye namayeshe matne sms
                                {
                                  ptr1++;
                                  lcd_putchar(*ptr1); 
                                }
                              }
                            }
                          }
                          printf("AT+CMGD=%c%c%c",'1',13,10);
                       }
                       }
                      unsigned char scan_key(void)
                      {
                          unsigned char i,data, num_key, temp;
                          num_key=0xff;
                          temp=0x70;
                          for(i=0;i<4;i++)
                          {
                              PORTA=temp;
                              delay_ms(5);
                              data=PINA & 0x0f;
                              if (data==0x07)
                                  num_key=code[0][i];
                              if (data==0x0B)
                                  num_key=code[1][i];
                              if (data==0x0D)
                                  num_key=code[2][i];
                              if (data==0x0E)
                                  num_key=code[3][i]; 
                              temp=((temp>>=1) | 0x80) & 0xF0;
                          }
                          return num_key;
                      }

                      دیدگاه


                        #12
                        پاسخ : صفحه کلید و میکرو

                        خب اینجوری بهتر شد ... من الان بررسیش می کنم و تغییرات لازم رو روش میدم ... اگه خوابم نبره امشب اماده میشه ...
                        البته اینم بگم که میکرو ها هم به این راختیا نمیسوزن ... حداقل تو این چند سالی که دارم با میکرو ها کار می کنم بهم ثابت شده ...
                        اگه خواستین بنویسین که چه اتفاقی برای میکروتون افتاده شاید بتونم کمکی کنم ...
                        Share OR Die

                        دیدگاه


                          #13
                          پاسخ : صفحه کلید و میکرو

                          نوشته اصلی توسط Mahdi.N
                          خب اینجوری بهتر شد ... من الان بررسیش می کنم و تغییرات لازم رو روش میدم ... اگه خوابم نبره امشب اماده میشه ...
                          البته اینم بگم که میکرو ها هم به این راختیا نمیسوزن ... حداقل تو این چند سالی که دارم با میکرو ها کار می کنم بهم ثابت شده ...
                          اگه خواستین بنویسین که چه اتفاقی برای میکروتون افتاده شاید بتونم کمکی کنم ...
                          وای دستتون درد نکنه خیلی لطف میکنین
                          من که تو این چند ماه 4-5 تایی سوزوندم :redface:
                          من تا ظهر فردا هم باز خبرشو بهتون میدم، فردا اول وقت میرم یه میکرو میگیرم و رو برنامه کار میکنم
                          اما امروز مثبت منفی منبع یه لحظه به هم خورد بعد lcd مربع مربع نشون داد، فکر کردم lcd سوخته اما lcd رو تو مدار دیگه گذاشتم دیدم سالمه
                          رو میکرو برنامه فرستنده رو پروگرم کردم دیدم واقعا سوخته

                          دیدگاه


                            #14
                            پاسخ : صفحه کلید و میکرو

                            برنامه رو یه نگاهی کردم ...
                            مشکلی که هست اینه که من نمیدونم تو رشته هایی که برای خط اول ، دوم ، سوم و... باید داشته باشم چی باید ذخیره کنم ...
                            میتونید شبیه سازیه برنامه رو هم رو سایت بزارین ؟ تا بع چه عدد یا کاراکتری رو برمیگردونه ؟
                            Share OR Die

                            دیدگاه


                              #15
                              پاسخ : صفحه کلید و میکرو

                              نوشته اصلی توسط Mahdi.N
                              برنامه رو یه نگاهی کردم ...
                              مشکلی که هست اینه که من نمیدونم تو رشته هایی که برای خط اول ، دوم ، سوم و... باید داشته باشم چی باید ذخیره کنم ...
                              میتونید شبیه سازیه برنامه رو هم رو سایت بزارین ؟
                              شرمنده من نشد شبیه سازی کنم چون تو پورتئوس جای gsm نمیدونستم چی بذارم
                              خط اول شماره فرستنده اس ام اس، مثلا: 989123456789+
                              خط دوم تاریخ و ساعت : 1354 ,28/05
                              خط سوم هم متن اس ام اس : Temp=28

                              دیدگاه

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