اسکن صفحه کلید 4*4 با وقفه به همرا دیبانس قابل تنظیم:
برنامه با کامپایلر AVR GCC در محیط AVR STUDIO5 نوشتم ، توضیحات رو هم به صورت کامند ارائه کردم ، نحوه اتصال LCD , KEYPAD هم در کامندها توضیح دادم البته یه عکس از اتصالات سخت افزاری دیگه اش با مگا 16 با همین تنظیمات در زیر قرار دادم .
فایلهای برنامه : TATLI AVR3.rar
برنامه :
عکس از سخت افزار جانبی با مگا 16 :
برنامه با کامپایلر 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 :

دیدگاه