اسکن صفحه کلید 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 :



دیدگاه