سلام دوستان..................
توی یکی از appnote های اتمل یه مدار اسکن صفحه کلید با استفاده از وقفه بود که به نظرم خیلی مفید میومد اما مشکلش این بود که با زبان اسمبلی نوشته شده بود بنابراین منم دست به کار شدم تونستم با c , کدویژن کدشو بنویسم کد کامل به همراه فایل پروتئوس و روش استفاده از اونو میتونید از وبسایت خودم دانلود کنید.امیدوارم مفید باشه.
توی یکی از appnote های اتمل یه مدار اسکن صفحه کلید با استفاده از وقفه بود که به نظرم خیلی مفید میومد اما مشکلش این بود که با زبان اسمبلی نوشته شده بود بنابراین منم دست به کار شدم تونستم با c , کدویژن کدشو بنویسم کد کامل به همراه فایل پروتئوس و روش استفاده از اونو میتونید از وبسایت خودم دانلود کنید.امیدوارم مفید باشه.
/************************************************** ***
This program was produced by the
Codevision V2.04.4a Advanced
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :scan keypad with used interrupt
Version : 1
Date : 5/15/2010
Author : alireza.najafi
Company :www.dspworld.gigfa.com
Comments:
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
************************************************** ***/
#include <mega16.h>
#include <delay.h>
#include <lcd.h>
#include <stdio.h>
#include <ctype.h>
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
unsigned char data_lcd[10];
unsigned char w;
unsigned char codef[4][4]={{'7','8','9',' ;/'},{'4','5','6' ,'*'},{'1','2',' ;3','-'},{'c','0','=' ,'+'}};
unsigned char scan_key(void)
{
unsigned char i,data;
unsigned char num_key;
PORTB=0X01;
for(i=0;i<4;i++)
{
data=(PINB)&(0xf0);
if(data==0x10)
num_key=codef[0][i];
if(data==0x20)
num_key=codef[1][i];
if(data==0x40)
num_key=codef[2][i];
if(data==0x80)
num_key=codef[3][i];
delay_ms(30);
PORTB=PORTB<<1;
}
PORTB=0x0f;
return num_key;}
void main(){
;
lcd_init(16);
lcd_clear();
DDRC=0Xff;
DDRB=0X0f;
DDRD=0XF0;
MCUCR=0X0c;
GICR=0X80;
GIFR=0X80;
PORTB=0x0f;
#asm("sei"
while(1){
}}
interrupt [3] void scan(){
w=scan_key();
if(w!=0xff&isdigit(w)){
w=w-48;
lcd_clear();
sprintf(data_lcd,"key:%d",w);
lcd_puts(data_lcd);
}
else if(w=='c'
lcd_clear();
else{
lcd_clear();
sprintf(data_lcd,"key:%c",w);
lcd_puts(data_lcd); }
GIFR=0X80;
}
This program was produced by the
Codevision V2.04.4a Advanced
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :scan keypad with used interrupt
Version : 1
Date : 5/15/2010
Author : alireza.najafi
Company :www.dspworld.gigfa.com
Comments:
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
************************************************** ***/
#include <mega16.h>
#include <delay.h>
#include <lcd.h>
#include <stdio.h>
#include <ctype.h>
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
unsigned char data_lcd[10];
unsigned char w;
unsigned char codef[4][4]={{'7','8','9',' ;/'},{'4','5','6' ,'*'},{'1','2',' ;3','-'},{'c','0','=' ,'+'}};
unsigned char scan_key(void)
{
unsigned char i,data;
unsigned char num_key;
PORTB=0X01;
for(i=0;i<4;i++)
{
data=(PINB)&(0xf0);
if(data==0x10)
num_key=codef[0][i];
if(data==0x20)
num_key=codef[1][i];
if(data==0x40)
num_key=codef[2][i];
if(data==0x80)
num_key=codef[3][i];
delay_ms(30);
PORTB=PORTB<<1;
}
PORTB=0x0f;
return num_key;}
void main(){
;
lcd_init(16);
lcd_clear();
DDRC=0Xff;
DDRB=0X0f;
DDRD=0XF0;
MCUCR=0X0c;
GICR=0X80;
GIFR=0X80;
PORTB=0x0f;
#asm("sei"

while(1){
}}
interrupt [3] void scan(){
w=scan_key();
if(w!=0xff&isdigit(w)){
w=w-48;
lcd_clear();
sprintf(data_lcd,"key:%d",w);
lcd_puts(data_lcd);
}
else if(w=='c'

lcd_clear();
else{
lcd_clear();
sprintf(data_lcd,"key:%c",w);
lcd_puts(data_lcd); }
GIFR=0X80;
}
دیدگاه