sinaset نوشته شده:سلام بر شما
باید این نکته رو می گفتید،که این کدهای مربوط به چه برنامه می باشد..
خط اول ، یه متغیر از نوع آرایه در حافظه فلش میکروکنترولر تعریف شده که 16 جزء نیز دارد.(که گفته شده کدهایی مربوط به کیبورد می باشند) در خط دوم نیز یک متغیر به نام key_code تعرف شده که مقدار ان نیز 16 داده شده ، در خط سوم نیز یک متغیر ارایه تعریف شده که 16 جزء نیز دارد .(و مقدار همگی صفر می باشد*که البته نیازی به چنین کاری نمی باشد!)
بطوری کلی ما در میکروکنترولر بیشتر کارهایمان را به کمک متغیرها انجام میدم،به عنوان مثال مقداری را می خوانیم،مقداری را می نویسیم،نتیجه یک محاسبه ی را درون متغیر قرار میدهیم و...
متغیرها در میکروکنترولرها، یا در حافظه فلش قرار میگرن یا در حافظه رم یا در حافظه eeprom قرار می گیرن. معمولا کارهای که حالت چرک نویسی دارن! در حافظه رم تعریف میشون! فرض کنید،می خواهید دو عدد رو دریافت کنید،سپس باهم دیگر جمعشان کنید و نتیجه را درون یک متغییر دیگر بگذارید و در نهایت ان را به روی LCD نمایش دهید. دراینجا اگر همه متغیرها درون رم تعریف شون،قطعا بهتره خواهد بود! چون نیازی به ذخیره سازی و .. نیست!
اما گاهی می خواهید یک سری اطلاعات،ذخیره شود و با قطع برق و .. از بین نرود و... متغیر را از نوع Flash یا eeprom تعریف می کنید.! چون حافظه دائمی هستن.
در کدهایی که در بالا داده اید،خط اول از حافظه فلش استفاده شده! و دو خط بعدی نیز از حافظه رم استفاده شده .
*دلیل استفاده از کدها می توان این باشد،که احتمالا برنامه نویس،یک سری کدهایی اماده گذاشته است،که هر وقت نیازی بود،حروف چاپ شود(براساس نوع ان) ، یک حروف چاپ شود، این کدها در واقع یک حروف در LCD می باشد که وقتی برای ان فرستاده شود،یک حرف بخصوص چاپ خواهد شد .
باتشکر.
یلام
ممنون از پاسختون
این کد هست
شاید با دیدن این کد بیشتر در مورد اون فهمید
منظورم کاربرد این سه خطی هست که فرمودید:
#include <mega128a.h>
#include <delay.h>
#include <alcd.h>
#include <stdlib.h>
#include <stdio.h>
flash unsigned char keyboard_codes[]={0XDE,0XE7,0XD7,0XB7,0XEB,0XDB,0XBB,0XED,0XDD,0XBD,0XEE,0XBE,0X77,0X7B,0X7D,0X7E};
volatile unsigned char key_code=16;
unsigned char lcd_str[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void main(void)
{
int temp_key_code,old_key_code=16;
// initialize timer
OCR0=124;
TCCR0=(1<<WGM01)|(1<< CS01);
TIMSK=(1<<OCIE0);
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: On
// INT2 Mode: Falling Edge
//GICR|=(0<<INT1) | (0<<INT0) | (1<<INT2);
//MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
//MCUCSR=(0<<ISC2);
//GIFR=(0<<INTF1) | (0<<INTF0) | (1<<INTF2);
lcd_init(20);
#asm("sei")
lcd_putsf("helo"); delay_ms(1000);lcd_clear();delay_ms(1000);
while(1)
{
temp_key_code=key_code;
if (temp_key_code!= old_key_code)
{
old_key_code=temp_key_code;
if (temp_key_code!=16)
{
itoa (temp_key_code , lcd_str);
lcd_puts(lcd_str);
}
}
}
}
//------------------------------------------------------------------------------------------------------------------
interrupt [TIM0_COMP] void timer0_compare_isr(void)
{
static unsigned char x20=0;
unsigned char temp , i;
if (++x20==20)
{
DDRC=(1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);
PORTC=(1<<PORTC7)|(1<<PORTC6)|(1<<PORTC5)|(1<<PORTC4);
delay_us(5); // delay for signal stablization
temp=(PINC & 0Xf0);
DDRC=(1<<DDC7)|(1<<DDC6)|(1<<DDC5)|(1<<DDC4);
PORTC=(1<<PORTC3)|(1<<PORTC2)|(1<<PORTC1)|(1<<PORTC0);
delay_us(5); // delay for signal stablization
temp |=(PINC & 0X0f);
for(i=0;i<16;i++)
{
if(temp==keyboard_codes
)
{
key_code=i;
break;
}
else key_code=16;
}
}
}