اطلاعیه

Collapse
No announcement yet.

اسکن صفحه کلید 4*4 با وقفه به همرا دیبانس قابل تنظیم

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

    اسکن صفحه کلید 4*4 با وقفه به همرا دیبانس قابل تنظیم

    اسکن صفحه کلید 4*4 با وقفه به همرا دیبانس قابل تنظیم:

    برنامه با کامپایلر AVR GCC در محیط AVR STUDIO5 نوشتم ، توضیحات رو هم به صورت کامند ارائه کردم ، نحوه اتصال LCD , KEYPAD هم در کامندها توضیح دادم البته یه عکس از اتصالات سخت افزاری دیگه اش با مگا 16 با همین تنظیمات در زیر قرار دادم .

    فایلهای برنامه : TATLI AVR3.rar

    برنامه :

    کد:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include "lcd.h"
    
    /*
    CONFIGURATION IN LCD.H:
    #define LCD_PORT     PORTB    
    #define LCD_DATA0_PIN  0     
    #define LCD_DATA1_PIN  1     
    #define LCD_DATA2_PIN  2     
    #define LCD_DATA3_PIN  3      
    #define LCD_RS_PIN    4     
    #define LCD_RW_PIN    5      
    #define LCD_E_PIN    6      
    defult port for the LCD lines :PORTB  
    pin for RS : PB4
    pin for RW : PB5     
    pin for Enable : PB6 
    pin for DB4 : PB0
    pin for DB5 : PB1
    pin for DB6 : PB2
    pin for DB7 : PB3  
    */
    #define port_scan PORTC
    #define pin_scan PINC
    #define ddr_scan DDRC
    #define r1    0
    #define r2    1
    #define r3    2
    #define r4    3
    #define c1    4
    #define c2    5
    #define c3    6
    #define c4    7    
    /*
    defult port for the LCD lines :KEYPAD4*4  
    pin for R1 : PC0
    pin for R2 : PC1     
    pin for R3 : PC2 
    pin for R4 : PC3
    pin for C1 : PC4
    pin for C2 : PC5
    pin for C3 : PC6  
    pin for C4 : PC7  
    */
    
    #define debounce  20  /** initialize debounce: MIN:1 , MAX:0 , Default=20-->1s **/
    #
    
    char i=16,key;	
    
    void main(void)
    {
    	#pragma -O0
    	CLKPR=0x80;
    	CLKPR=0x00;
    	#pragma -Os
    	
      // Timer/Counter 1 initialization
    	// Clock source: System Clock
    	// Clock value: 1000.000 kHz
    	TCCR1B=(1<<CS11);
    	
    	TCNT1H=0x3C;   
      TCNT1L=0xB0;  
    	
    	TIMSK1=(1<<TOIE1);   // Timer/Counter 1 Interrupt(s) initialization
    	
    	
    	// External Interrupt(s) initialization
    	// INT0 Mode: Rising Edge
    	// INT0: On
      EICRA=(1<<ISC00)|(1<<ISC01);
    	EIMSK=(1<<INT0);
    	EIFR=(1<<INTF0);
    	
    	ddr_scan=(1<<r1)|(1<<r2)|(1<<r3)|(1<<r4);
      port_scan=(1<<r1)|(1<<r2)|(1<<r3)|(1<<r4);
    	
    	lcd_init(LCD_DISP_ON);					// Alphanumeric LCD initialization
    	lcd_clrscr();							//Clear display and set cursor to home position
    	lcd_gotoxy(16, 0);						//Set cursor to specified position
    	lcd_puts("WELCOME TO TATLI AVR");		//Display character at current cursor position
    
    	while(--i>-23) 
    	{
    	_delay_ms(500);
    	lcd_command(LCD_MOVE_DISP_RIGHT);		//shift display right 
    	} 
    	
    	lcd_clrscr();							//Clear display and set cursor to home position
    	lcd_gotoxy(0, 0);						//Set cursor to specified position
    	lcd_puts("INTER YOU'R KEYS");		//Display character at current cursor position
    	_delay_ms(2000);
    	lcd_clrscr();							//Clear display and set cursor to home position
    	
    	sei();
    	
    	while(1);
    	}	
    // External Interrupt 0 service routine					 	  						  
    ISR(INT0_vect){
    	 unsigned char count;
       char buffer;   
       
    	 port_scan=(1<<r1);
       i=0;
       
    /******keypad scan routin*************/   
    for(count=1;count<5;count++){
    if(pin_scan&(1<<c1))key=(count*4-3);
    if(pin_scan&(1<<c2))key=(count*4-2);
    if(pin_scan&(1<<c3))key=(count*4-1);
    if(pin_scan&(1<<c4))key=(count*4);
    if(port_scan<0X80)port_scan<<=1;
         }
    /*************************************/
    	 
    	 itoa( key-1 , buffer,16);
    	 lcd_puts(buffer); 
           
       port_scan&=~((1<<r1)|(1<<r2)|(1<<r3)|(1<<r4));
       TCCR1B=(1<<CS11);    /** Timer 1 on **/
    }
    // Timer1 overflow interrupt service routine
    ISR(TIMER1_OVF_vect){
    /* Reinitialize Timer1 value for 50ms*/
    TCNT1H=0x3C;
    TCNT1L=0xB0;
    
    /********* check debounce ************/
    if(++i==debounce){
       port_scan=(1<<r1)|(1<<r2)|(1<<r3)|(1<<r4);
       i=0;
       TCCR1B&=~(1<<CS11);   /** Timer 1 Stopped **/
    }
    }


    عکس از سخت افزار جانبی با مگا 16 :


    #2
    پاسخ : اسکن صفحه کلید 4*4 با وقفه به همرا دیبانس قابل تنظیم

    خوبه تایپیک های این قسمت زیاد بیننده نداره و الا تا الان کلی آبرومون رفته بودا!

    آقا من از کسانی که از این تایپیک های من توی این قسمت دیدن کردن معذرت میخوام چون بدون درنظر گرفتن اینکه سخت افزار دقیقا چی هست امدم برنامه گزاشتم حالا که سخت افزار رو دارم امدم برنامه ها رو تو عمل تست کنم دیدم عجب سوتی هایی دادم مثلا پورت c پنج تا پایه بیشتر نداره من امدم ازش برای اسکن صفحه کلید استفاده کردم و....
    به هر حال از این به بعد هر برنامه ای که میزارم حتما با سخت افزار تست میکنم خلاصه ما رو ببخشید دیگه

    خوب من برنامه این تایپیک رو اصلاح کردم و شماتیک اتصالاتش رو هم با پروتل کشیدم و دوباره پلود کردم .

    فایلهای برنامه و شماتیک : TATLI_AVR3_v2

    برنامه :


    کد:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include "lcd.h"
    
    /*
    CONFIGURATION IN LCD.H:
    #define LCD_PORT     PORTD    
    #define LCD_DATA0_PIN  0     
    #define LCD_DATA1_PIN  1     
    #define LCD_DATA2_PIN  2     
    #define LCD_DATA3_PIN  3      
    #define LCD_RS_PIN    4     
    #define LCD_RW_PIN    5      
    #define LCD_E_PIN    6      
    defult port for the LCD lines :PORTD
    pin for RS : PD4
    pin for RW : PD5     
    pin for Enable : PD6 
    pin for DB4 : PD0
    pin for DB5 : PD1
    pin for DB6 : PD2
    pin for DB7 : PD3  
    */
    #define port_scan PORTB
    #define pin_scan PINB
    #define ddr_scan DDRB
    #define r1    0
    #define r2    1
    #define r3    2
    #define r4    3
    #define c1    4
    #define c2    5
    #define c3    6
    #define c4    7    
    /*
    defult port for the KEYPAD4*4 lines : PORTB
    pin for R1 : PB0
    pin for R2 : PB1     
    pin for R3 : PB2 
    pin for R4 : PB3
    pin for C1 : PB4
    pin for C2 : PB5
    pin for C3 : PB6  
    pin for C4 : PB7  
    */
    
    #define debounce  20  /** initialize debounce: MIN:1 , MAX:0 , Default=20-->1s **/
    
    unsigned char i;
    
    
    void main(void)
    {
    
    	CLKPR=0x80;
    	CLKPR=0x00;	
      // Timer/Counter 1 initialization
    	// Clock source: System Clock
    	// Clock value: 1000.000 kHz	
    	TCNT1H=0x3C;   
      TCNT1L=0xB0;  
    	
    	TIMSK1=(1<<TOIE1);   // Timer/Counter 1 Interrupt(s) initialization
    	
    	
    	// External Interrupt(s) initialization
    	// INT0 Mode: Rising Edge
    	// INT0: On
      EICRB=(1<<ISC41)|(1<<ISC40);
    	EIMSK=(1<<INT4);
    	EIFR=(1<<INTF4);
    	
    	ddr_scan=(1<<r1)|(1<<r2)|(1<<r3)|(1<<r4);
      port_scan=(1<<r1)|(1<<r2)|(1<<r3)|(1<<r4);
    	
    	
    	lcd_init(LCD_DISP_ON);					// Alphanumeric LCD initialization
    	lcd_clrscr();							//Clear display and set cursor to home position
    	lcd_gotoxy(16, 0);						//Set cursor to specified position
    	lcd_puts("WELCOME TO TATLI AVR");		//Display character at current cursor position
    
    	while(++i<38) 
    	{
    	_delay_ms(500);
    	lcd_command(LCD_MOVE_DISP_LEFT);		//shift display right 
    	} 
    	
    	lcd_clrscr();							//Clear display and set cursor to home position
    	lcd_gotoxy(0, 0);						//Set cursor to specified position
    	lcd_puts("INTER YOU'R KEYS");		  //Display character at current cursor position
    	_delay_ms(2000);
    	lcd_clrscr();							//Clear display and set cursor to home position
    	
    	sei();
    	
    	while(1);
    	}	
    // External Interrupt 0 service routine					 	  						  
    ISR(INT4_vect){
    	 unsigned char count,key=0;
       char buffer[4];   
    	 
       EIMSK&=~(1<<INT4);	 		 
    	 port_scan=0X01;
       i=0;
       
    /******keypad scan routin*************/   
    for(count=1;count<5;count++){
    if(pin_scan&(1<<c1))key=(count*4-3);
    else if(pin_scan&(1<<c2))key=(count*4-2);
    else if(pin_scan&(1<<c3))key=(count*4-1);
    else if(pin_scan&(1<<c4))key=(count*4);
    if(port_scan<0X80)port_scan<<=1;
         }
    /*************************************/
    	 if(key!=0){
    	 itoa( key-1 , buffer,16);
    	 lcd_puts(buffer); 
    	 }	  
    	 
       port_scan&=~((1<<r1)|(1<<r2)|(1<<r3)|(1<<r4));
    	 TCCR1B=(1<<CS11);    /** Timer 1 on **/
    
    }
    // Timer1 overflow interrupt service routine
    ISR(TIMER1_OVF_vect){
    /* Reinitialize Timer1 value for 50ms*/
    TCNT1H=0x3C;
    TCNT1L=0xB0;
    
    /********* check debounce ************/
    if(++i==debounce){
       i=0;
    	 port_scan=(1<<r1)|(1<<r2)|(1<<r3)|(1<<r4);   
       TCCR1B&=~(1<<CS11);  /** Timer 1 Stopped **/	 
    	 EIMSK=(1<<INT4);
    }
    }


    شماتیک :

    دیدگاه

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