ايران ويج

نسخه‌ی کامل: کمک فوری فوری در مورد چند منظوره کردن
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
با عرض سلام خدمت دوستان
من یک پروژه آماده کرده ام که بصورت زیر است
یک سیستم ورود و خروج که دارای یک صفحه کلید ماتریسی برای گرفتن اطلاعات از کاربر و دارای یک ساعت که از DS1307 استفاده کرده ام و از max232 هم برای ارتباط با نرم افزاری که نوشته ام و از یک LCD2*16 برای نمایش اطلاعات
کل پروژه هم از لحاظ نرم افزاری و سخت افزاری آماده شده اما حالا یک مشکل دارم می خوام سیستم دو منظوره بشه یعنی سیستم همیشه ساعت را برای کاربر نشان بده و آن را خودکار Refresh کنه تا زمانی که بخواهیم کاربر اطلاعات ورود را وارد کنه یا بخواهد ساعت را تنظیم کنه در حال حاضر من برنامه را به گونه ای نوشته ام که اگر کاربر بخواهد ساعت را ببیند باید یک کلید را بزند و اگر بخواهد وارد شود باید کلید مربوطه به آن را بزند بطور کلی چگونه م تونم هم ساعت را نشان بدم به صورت اینکه 1 ثانیه یک بار refresh بشه و هم از کاربر اطلا عات بگیرم یا اینکه ساعت را بصورت refresh شده نمایش بدم تا زمانی که کاربر کلید های مربوطه به دیگر توابع را فشار بده
/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 2009/02/24
Author :
Company :
Comments:


Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
#include <i2c.h>
#include <ds1307.h> // DS1307 Real Time Clock
#include <lcd.h> // Alphanumeric LCD
#include <bcd.h>
#include <string.h>
#include <stdlib.h>
// Standard Input/Output functions
#include <stdio.h>
/**********************************************************************/
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define TX_NEWLINE

{transmitByte(0x0d); transmitByte(0x0a);}
#define xtal 4000000
#define baud 9600

/**********************************************************************/
unsigned char receiveByte(void);
void TimeSet();
void transmitByte(unsigned char);
void transmitString_F(const unsigned char*);
void transmitString(unsigned char*);
void Reset();
void Clk();
int GetKey();
char IntToChar(int IntVal);
int CheckSameArray(char * a,char * b,int len);
int LoginSession();
int ChangePasswordSession();
void GetTime(char * time);
void SendResetCmd();
void beep(int offon);
/**********************************************************************/
unsigned char hour,minute,second;
char lcd1[16],lcd2[16];
unsigned char year,month,day;
int State;
/**********************************************************************/

// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=0
.equ __scl_bit=1
#endasm
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
}
// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
}
// Declare your global variables here

void main(void)
{
// Declare your local variables here
int key;
int i;
char testStr;
char time[8];

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
PORTB=0x00;
DDRB=0x03;
// Port C initialization
// Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x80;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: On
// INT1 Mode: Low level
// INT2: On
// INT2 Mode: Falling Edge
GICR|=0xE0;
MCUCR=0x00;
MCUCSR=0x00;
GIFR=0xE0;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
//UBRRH=0x00;
//UBRRL=0x19;
UBRRH=(xtal/16/baud-1) >> 8;
UBRRL=(xtal/16/baud-1) & 0xFF;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// I2C Bus initialization
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: On
// Square wave frequency: 32768Hz
rtc_init(3,1,0);

// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm("sei")

lcd_clear();

/**********************************************************************/
lcd_putsf("com port is not active");
putchar('3');
putchar('D');
testStr=getchar();
if(testStr=='1'){
lcd_clear();
SendResetCmd();
}
/**********************************************************************/
while (1)
{
// Place your code here
key=GetKey();
switch(key){
case (12):{ //F1 neshan dadane sa@t
State=12;
delay_ms(200);
lcd_clear();
GetTime(time);
lcd_putchar(time[0]);
lcd_putchar(time[1]);
lcd_putchar(time[2]);
lcd_putchar(time[3]);
lcd_putchar(time[4]);
lcd_putchar(time[5]);
lcd_putchar(time[6]);
lcd_putchar(time[7]);
break;
}
case (13):{ //F2 vorood
State=13;
LoginSession();
break;
}
case (14):{ //F3 // taghyire password
State=14;
ChangePasswordSession();
break;
}
case (15):{ //F4 //tanzime zaman va tarikh
State=14;
lcd_clear();
TimeSet();
break;
}

}//end switch key
};
}

void Reset()
{

PORTB.1=1;

delay_us(10);
PORTB.1=0;

}

void Clk()
{PORTB.0=0;

delay_us(10);
PORTB.0=1;

}

int GetKey(){

int k,i;

while(1){
Reset();

for (i=1;i<28;i++){
PORTB.2=1;
Clk();
delay_ms(100);

Reset();
if (PINB.2==0){
return(1);
}
for (k=1;k<28;k++){
PORTB.2=1;
Clk();
if (PINB.2==0){
switch(k){
case(1): {

return(4);
}
case(2): {

return(7);
}
case(3): {

return(10);
}
case(8): {


return(2);
}
case(9): {

return(5);
}
case(10): {

return(8);
}
case(11): {

return(0);
}
case(16): {

return(3);
}
case(17): {

return(6);
}
case(18): {

return(9);
}
case(19): {

return(11);
}
case(24): {

return(12);
}
case(25): {

return(13);
}
case(26): {

return(14);
}
case(27): {

return(15);
}


}//switch(k){
}//if(PINB.2==0)
}//for (k=1;k<20;k++)

}// for (i=1;i<20;i++)
}// while(1)

}

char IntToChar(int IntVal){
return(IntVal+48);
}

//**************************************************
//Function to receive a single byte
//*************************************************
unsigned char receiveByte( void )
{

unsigned char data, status;



while(!(UCSRA & (1<<RXC)));
// Wait for incomming data



status = UCSRA;

data = UDR;


return(data);
}

//***************************************************
//Function to transmit a single byte
//***************************************************
void transmitByte( unsigned char data )
{

while ( !(UCSRA & (1<<UDRE)) )


;


/* Wait for empty transmit buffer */

UDR = data;


/* Start transmition */
}

//***************************************************
//Function to transmit a string in Flash
//***************************************************
void transmitString_F(const unsigned char* string)
{
while (*string)


transmitByte(*string++);
}

//***************************************************
//Function to transmit a string in RAM
//***************************************************
void transmitString(unsigned char* string)
{
while (*string)


transmitByte(*string++);
}

int LoginSession(){
int j,i,key,passlen,len;
char pl[1],u[5],p[8],s[20],sw[1],time[8];
unsigned char r;


lcd_clear();
lcd_putsf("username (5 char(1..9)): ");
s[0]='1';//login
for (i=1;i<6;i++){
key=GetKey();

if (key==12) goto exitl; //exit for time
if((key>=0) && (key<=9)){
s[i]=IntToChar(key);
lcd_gotoxy(7+i,1);
lcd_putchar(s[i]);
delay_ms(100);
}else{
i--;
continue;
}//end if key

}//end for u[i]
lcd_clear();
lcd_putsf("password:");
passlen=0;
for (i=7;i<15;i++){ // for for get password
key=GetKey();
if (key==12) goto exitl;//exit
if((key==11)&&(passlen>0)) break;
if((key>=0) && (key<=9)){
s[i]=IntToChar(key);
lcd_gotoxy(2+i,0);
lcd_putchar('*');
passlen++;
delay_ms(100);
}else{ /* loging state=1 username passlen password ex:1 12345 3 123 */
i--;
continue;
}//end if key
}//end for get password


s[6]=IntToChar(passlen);
rtc_get_time(&hour,&minute,&second);
GetTime(time);


i=6+passlen+1;
j=0; // for gharar dadane time
for (j=0;j<5;j++)
{
s[i]=time[j];
i++;
} //End for gharar dadane time
len=6+passlen+1+5;//login state+username=(6 char)+ passlen(1 char)+pass+time(5 char) //dar inja time bedoone sanie
s[0]='1';//login state ==1
s[1]='1'; //user name az 10000 shoroo mishavand
for (i=0;i<len;i++) // ferstadane dastoor be computer
putchar(s[i]);

putchar('D'); // ferestadane entehaye dastoor
lcd_clear();
lcd_putsf("please wait");
r=getchar();
if (r=='1'){
lcd_clear();
lcd_putsf("correct U and P.");

beep(1);
delay_ms(500);
beep(0);
delay_ms(100);
beep(1);
delay_ms(50);
beep(0);
}
else
if (r=='0'){
lcd_clear();
lcd_putsf("U or P is not valid");

beep(1);
delay_ms(1000);
beep(0);
delay_ms(500);
beep(1);
delay_ms(200);
beep(0);
}
else if (r=='2'){
lcd_clear();
lcd_putsf("Access denied.Time Error.");

beep(1);
delay_ms(1000);
beep(0);
delay_ms(500);
beep(1);
delay_ms(200);
beep(0);
}
exitl:
SendResetCmd();


}
int ChangePasswordSession(){
int j,i,key,passlen,len,newpasslen1,newpasslen2,swnewpass;
char s[24],newp1[8],newp2[8];
unsigned char r;


lcd_clear();
lcd_putsf("username (5 char(1..9)): ");
s[0]='2';//change password
for (i=1;i<6;i++){
key=GetKey();
if (key==12) goto exitc; //exit
if((key>=0) && (key<=9)){
s[i]=IntToChar(key);
lcd_gotoxy(7+i,1);
lcd_putchar(s[i]);
delay_ms(100);
}else{
i--;
continue;
}//end if key

}//end for u[i]
lcd_clear();
lcd_putsf("password:");
passlen=0;
for (i=7;i<15;i++){
key=GetKey();
if (key==12) goto exitc; //exit
if((key==11)&&(passlen>0)) break;
if((key>=0) && (key<=9)){
s[i]=IntToChar(key);
lcd_gotoxy(2+i,0);
lcd_putchar(IntToChar(key));
passlen++;
delay_ms(100);
}else{
i--;
continue;
}//end if
}//end for
s[6]=IntToChar(passlen);
swnewpass=0;
while(swnewpass!=1){//while for get new pass
lcd_clear();
lcd_putsf("new password:");
newpasslen1=0;
for (i=0;i<8;i++){
newp1[i]='a';
newp2[i]='a';
}
for (i=0;i<8;i++){
key=GetKey();
if (key==12) goto exitc; //exit
if((key==11)&&(newpasslen1>0)) break;
if((key>=0) && (key<=9)){
newp1[i]=IntToChar(key);
lcd_gotoxy(14+i,0);
lcd_putchar(IntToChar(key));
newpasslen1++;
delay_ms(100);
}else{
i--;
continue;
}//end if
}//end for

lcd_clear();
lcd_putsf("new password repeat:");
newpasslen2=0;
for (i=0;i<8;i++){
key=GetKey();
if (key==12) goto exitc; //exit
if((key==11)&&(newpasslen2>0)) break;
if((key>=0) && (key<=9)){
newp2[i]=IntToChar(key);
lcd_gotoxy(5+i,1);
lcd_putchar(IntToChar(key));
newpasslen2++;
delay_ms(100);
}
else{
i--;
continue;
}//end if
}//end for

if((newpasslen1!=newpasslen2)||(CheckSameArray(newp1,newp2,8)==0)) {
lcd_clear();
if (newpasslen1!=newpasslen2) {
lcd_putsf("Error Len P and Re.P.press f4");

beep(1);
delay_ms(1000);
beep(0);
delay_ms(500);
beep(1);
delay_ms(200);
beep(0);
}
else
{
lcd_putsf("Error same P and Re.P.press f4");

beep(1);
delay_ms(1000);
beep(0);
delay_ms(500);
beep(1);
delay_ms(200);
beep(0);


}
key=GetKey();
if (key==12) goto exitc; //exit
while((key!=15)&&(key!=12)) {
key=GetKey();
if (key==12) goto exitc; //exit
}

}
else swnewpass=1;

} //end while new pass
j=0;
for(i=(6+passlen+2);i<(((6+passlen+2))+newpasslen1);i++){
s[i]=newp1[j];
j++;
}

s[6+passlen+1]=IntToChar(newpasslen1);
len=1+5+1+passlen+1+newpasslen1; //login state+username=(6 char)+ passlen(1 char)+pass+newpasslen+newpass
lcd_clear();
s[0]='2';
s[1]='1';
for (i=0;i<len;i++)
putchar(s[i]);
putchar('D');
lcd_clear();
lcd_putsf("please wait");
r=getchar();
if (r=='1'){
lcd_clear();
lcd_putsf("Done");

beep(1);
delay_ms(500);
beep(0);
delay_ms(100);
beep(1);
delay_ms(50);
beep(0);
}
else
if (r=='0'){
lcd_clear();
lcd_putsf("Error.U or P is not valid");

beep(1);
delay_ms(1000);
beep(0);
delay_ms(500);
beep(1);
delay_ms(200);
beep(0);
}

exitc:
SendResetCmd();
}

int CheckSameArray(char * a,char * b,int len){
int i;
for (i=0;i<len;i++)
{
if(a[i]!=b[i]){
return 0 ;
}
}
return 1;

}
void TimeSet(){
int key;
int tmpyear,tmpmonth,tmpday,tmphour,tmpminute,tmpsecond;
rtc_get_time(&hour,&minute,&second);
rtc_get_date(&day,&month,&year);
tmpyear=year;
tmpmonth=month;
tmpday=day;
tmphour=hour;
tmpminute=minute;
tmpsecond=second;
sprintf(lcd1,"%02u:%02u:%02u",hour,minute,second);
sprintf(lcd2,"%02u/%02u/%02u",year,month,day);
while(1) {

sprintf(lcd1,"%02u:%02u:%02u",tmphour,tmpminute,tmpsecond);
sprintf(lcd2,"%02u/%02u/%02u",tmpyear,tmpmonth,tmpday);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(lcd1);
lcd_gotoxy(0,1);
lcd_puts(lcd2);
delay_ms(100);
key=GetKey();
if (key==12) goto exitts;
if( key==11) {
lcd_clear();
break;

}
switch(key){
case (1):{
tmpyear++;
if (tmpyear>=100) tmpyear=0;
break;
}
case (4):{
tmpmonth++;
if (tmpmonth>=13) tmpmonth=1;
break;
}
case (7):{
tmpday++;
if (tmpday>=32) tmpday=1;
break;
}
case (2):{
tmphour++;
if (tmphour>=24) tmphour=0;
break;
}
case (5):{
tmpminute++;
if (tmpminute>=60) tmpminute=0;
break;
}
case (8):{
tmpsecond++;
if (tmpsecond>=60) tmpsecond=0;
break;
}

}

}

year=tmpyear;
month=tmpmonth;
day=tmpday;
hour=tmphour;
minute=tmpminute;
second=tmpsecond;
rtc_set_time(hour,minute,second);
rtc_set_date(day,month,year);
exitts:

}

void GetTime(char * time)
{
unsigned char tmphour,tmpminute,tmpsecond;
int h1,h2,m1,m2,s1,s2;

rtc_get_time(&tmphour,&tmpminute,&tmpsecond);
h1=tmphour/10;
h2=tmphour-(h1*10);
m1=tmpminute/10;
m2=tmpminute-(m1*10);
s1=tmpsecond/10;
s2=tmpsecond-(s1*10);
time[0]=IntToChar(h1);
time[1]=IntToChar(h2);
time[2]=':';
time[3]=IntToChar(m1);
time[4]=IntToChar(m2);
time[5]=':';
time[6]=IntToChar(s1);
time[7]=IntToChar(s2);


}

void SendResetCmd(){
char *s="reset";
puts(s);
}

void beep(int offon){
PORTC.7=offon;

}
شرمنده من c بلد نیستم ولی دوستان بلدن. حتمآ کمکت میکنن.
اولا برنامه به این طولانی رو بهتر اتچ کنی که صفحه اینقدر اسکرول نخوره
متوجه نمی شم دقیقا کجا مشکل داری شما ساعت رو می خونی lcd رو می بری تو نقطه ای که می خوای ساعت رو نشون بدی بعد صفحه کلید رو می خونی اگه کاری باید انجام بشه انجام می دی و بعد می پری اول برنامه
فقط اگه تعداد کار هایی که باید انجام بشه خیلی کم باشه سرعت رفرش روی صفحه نمایش یکم بالا می ره که خوب نیست شما می تونی مثلا از یه فور استفاده کنی که هر مثلا ۵۰ بار یک دفه ساعت رو نشون بده
به این صورت که یه متغیر مثلا J رو با صفر پر می کنی هر بار که که می خوای ساعت رو نمایش بدی یکی اضافه کن اگه برابر ۵۰ بود ساعت ور نشون بده و صفرش کن و در غیر اینصورت برو برای خوندن کی برد و بقیه کار ها و دوباره از اول
تو برنامت هم تورفتگی رو رعایت کن بدون تو رفتگی ها خوندن برنامه کار سختیه
بهتر نیست یه تایمر مثلا تایمر دو رو با کریستال ساعت تنظیم کنی تا زمان وقفه اش هر یه ثانیه صورت بگیره و تو وقفه اش زمان رو نشون بدی !!!
(۰۱-تير-۱۳۸۸, ۱۰:۱۲:۰۶)ha_60 نوشته است: [ -> ]اولا برنامه به این طولانی رو بهتر اتچ کنی که صفحه اینقدر اسکرول نخوره
متوجه نمی شم دقیقا کجا مشکل داری شما ساعت رو می خونی lcd رو می بری تو نقطه ای که می خوای ساعت رو نشون بدی بعد صفحه کلید رو می خونی اگه کاری باید انجام بشه انجام می دی و بعد می پری اول برنامه
فقط اگه تعداد کار هایی که باید انجام بشه خیلی کم باشه سرعت رفرش روی صفحه نمایش یکم بالا می ره که خوب نیست شما می تونی مثلا از یه فور استفاده کنی که هر مثلا ۵۰ بار یک دفه ساعت رو نشون بده
به این صورت که یه متغیر مثلا J رو با صفر پر می کنی هر بار که که می خوای ساعت رو نمایش بدی یکی اضافه کن اگه برابر ۵۰ بود ساعت ور نشون بده و صفرش کن و در غیر اینصورت برو برای خوندن کی برد و بقیه کار ها و دوباره از اول
تو برنامت هم تورفتگی رو رعایت کن بدون تو رفتگی ها خوندن برنامه کار سختیه
تورفتگی رو رعایت کردم زمان کپی و چسباندن این اتفاق براش افتاده
(۰۱-تير-۱۳۸۸, ۱۰:۱۲:۰۶)ha_60 نوشته است: [ -> ]اولا برنامه به این طولانی رو بهتر اتچ کنی که صفحه اینقدر اسکرول نخوره
متوجه نمی شم دقیقا کجا مشکل داری شما ساعت رو می خونی lcd رو می بری تو نقطه ای که می خوای ساعت رو نشون بدی بعد صفحه کلید رو می خونی اگه کاری باید انجام بشه انجام می دی و بعد می پری اول برنامه
فقط اگه تعداد کار هایی که باید انجام بشه خیلی کم باشه سرعت رفرش روی صفحه نمایش یکم بالا می ره که خوب نیست شما می تونی مثلا از یه فور استفاده کنی که هر مثلا ۵۰ بار یک دفه ساعت رو نشون بده
به این صورت که یه متغیر مثلا J رو با صفر پر می کنی هر بار که که می خوای ساعت رو نمایش بدی یکی اضافه کن اگه برابر ۵۰ بود ساعت ور نشون بده و صفرش کن و در غیر اینصورت برو برای خوندن کی برد و بقیه کار ها و دوباره از اول
تو برنامت هم تورفتگی رو رعایت کن بدون تو رفتگی ها خوندن برنامه کار سختیه
آقا فرض کنید من بخواهم از کاربر اطلاعات را دریافت کنم روی خط 2 و 3 lcd (فرض lcd 3*20 است) و در همان حال در 1 ثانیه یکبار روی خط اول lcd زمان را نشان بدهم یا lcd همان 2*16 باشه هم از کاربر اطلاعات دریافت کنم و هم هر 1 ثانیه یکبار زمان را بر روی 4 تا 7segment نشان بدهم باید چکار کتم
و دقت کنید برنامه Getkey من دارای یک While بی نهایت است یعنی تا زمانی که کاربر کلیدی را فشار ندهد از آن خارج نمی شود و راهی برای تغییرش هم ندارم
مهندس ایرن برنامه رو یه نگاه کن :
http://forum.iranled.com/showthread.php?tid=9711

اینم یه برنانه نمونه با ده تا سون سگمنت که دما سنج - فرکانس متر - کورنومتر - ساعت - شمارش گر خودرو در پارکینگ - نمایش اعداد گردون هستش .
با یه دکمه حالت عوض می کنی و با دو تا دکمه دیگه مقادیر رو عوض می کنی !!
نقشه و توضیحات بیشتر بماند برای باعد امتحانات ؟!

کد php:
$regfile "m32def.dat" $crystal 8000000

Config Adc 
Single Prescaler Auto Reference Internal

Ddra.3 
Ddra.4 Ddra.5 Ddra.6 Ddra.7 0
Ddrc 
63 Ddrd 255 Ddrb = &B11111101

Dim B 
As Byte As Byte Sectic As Byte Ff As Byte
Dim Out_1 
As Byte Out_2 As Byte Out_3 As Byte Out_4 As Byte
Dim Out_5 
As Byte Out_6 As Byte Out_7 As Byte Out_8 As Byte
Dim Out_9 
As Byte Out_10 As Byte Fff As Byte Ww As Word
Dim Ol 
As Byte Frq As Long As Word As Long As Word As Word
Dim Cornometr_ms 
As Word Cornometr_s As Byte Cornometr_m As Byte Cornometr_h As Word
Dim Dama 
As Word Car As Word
Dim Cc 
As Byte Mm As Byte Ss As Byte

Config Timer2 
Timer Async On Prescale 1
On Timer2 Sectic 
Enable Interrupts Enable Timer2
Config Timer1 
Counter Edge Rising On Timer1 Ol Enable Timer1
Config Timer0 
Timer Prescale On Timer0 Scan Enable Timer0

Start Timer0 
Start Timer2 Gosub Res_data Gosub Sectic Sectic 126

'###############################################################################

Star:

Do
   Debounce Pina.3 , 1 , Set1
Loop

Set1:
   If F = 7 Then :
      F = 2 : Start Timer2
         L = Frq / 100000 : Out_8 = L + 1 : L = L * 100000 : Frq = Frq - L
         L = Frq / 10000 : Out_7 = L + 1 : L = L * 10000 : Frq = Frq - L
         L = Frq / 1000 : Out_6 = L + 1 : L = L * 1000 : Frq = Frq - L
         L = Frq / 100 : Out_5 = L + 1 : L = L * 100 : Frq = Frq - L
         L = Frq / 10 : Out_4 = L + 1 : L = L * 10 : Frq = Frq - L
         Out_3 = Frq + 1 : Out_10 = 11 : Out_9 = 12 : Out_2 = 13 : Out_1 = 14
   Elseif F = 2 Then :
      F = 3 : Stop Timer2 : Stop Timer1 : Gosub Res_data
      Do
         Debounce Pina.3 , 1 , Set2
         Debounce Pina.4 , 1 , Set3 , Gosub
         Debounce Pina.5 , 1 , Set4 , Gosub
      Loop
Set2:
         Stop Timer2 : Gosub Res_data : Goto Set1
Set3:
         Start Timer2 : Return
Set4:
         Stop Timer2
         For C = 0 To 50000
            If Pina.5 = 0 Then Return
         Next
         Gosub Res_data : Return
   Elseif F = 3 Then :

         F = 4 : Gosub Res_data : Start Timer2

   Elseif F = 4 Then :
       F = 5 : Stop Timer2 : Gosub Res_data
       Do
          Debounce Pina.3 , 1 , Set1
          Debounce Pina.4 , 1 , Set6 , Gosub
          Debounce Pina.5 , 1 , Set7 , Gosub
          Debounce Pina.6 , 1 , In_car , Gosub
          Debounce Pina.7 , 1 , Out_car , Gosub

       Loop
Set6:
          Incr Out_1
          If Out_1 > 10 Then :
             Out_1 = 1 : Incr Out_2
          End If
          If Out_2 > 10 Then :
             Out_2 = 1 : Incr Out_3
          End If
          If Out_3 > 10 Then :
             Out_3 = 1 : Incr Out_4
          End If
          If Out_4 > 10 Then :
             Out_4 = 1 : Incr Out_5
          End If
          If Out_5 > 10 Then :
             Out_5 = 1 : Incr Out_6
          End If
          If Out_6 > 10 Then :
             Out_6 = 1 : Incr Out_7
          End If
          If Out_7 > 10 Then :
             Out_7 = 1 : Incr Out_8
          End If
          If Out_8 > 10 Then :
             Out_8 = 1 : Incr Out_9
          End If
          If Out_9 > 10 Then :
             Out_9 = 1 : Incr Out_10
          End If
          If Out_10 > 10 Then Out_10 = 1

         For C = 0 To 30000
            If Pina.4 = 0 Then Return
         Next

         Do
          Incr Out_1
          If Out_1 > 10 Then :
             Out_1 = 1 : Incr Out_2
          End If
          If Out_2 > 10 Then :
             Out_2 = 1 : Incr Out_3
          End If
          If Out_3 > 10 Then :
             Out_3 = 1 : Incr Out_4
          End If
          If Out_4 > 10 Then :
             Out_4 = 1 : Incr Out_5
          End If
          If Out_5 > 10 Then :
             Out_5 = 1 : Incr Out_6
          End If
          If Out_6 > 10 Then :
             Out_6 = 1 : Incr Out_7
          End If
          If Out_7 > 10 Then :
             Out_7 = 1 : Incr Out_8
          End If
          If Out_8 > 10 Then :
             Out_8 = 1 : Incr Out_9
          End If
          If Out_9 > 10 Then :
             Out_9 = 1 : Incr Out_10
          End If
          If Out_10 > 10 Then Out_10 = 1

          If Pina.4 = 0 Then Return
          Waitms 50
          If Pina.4 = 0 Then Return
          Waitms 50
          If Pina.4 = 0 Then Return
         Loop


Set7:
         Decr Out_1
          If Out_1 = 0 Then :
             Out_1 = 10 : Decr Out_2
          End If
          If Out_2 = 0 Then :
             Out_2 = 10 : Decr Out_3
          End If
          If Out_3 = 0 Then :
             Out_3 = 10 : Decr Out_4
          End If
          If Out_4 = 0 Then :
             Out_4 = 10 : Decr Out_5
          End If
          If Out_5 = 0 Then :
             Out_5 = 10 : Decr Out_6
          End If
          If Out_6 = 0 Then :
             Out_6 = 10 : Decr Out_7
          End If
          If Out_7 = 0 Then :
             Out_7 = 10 : Decr Out_8
          End If
          If Out_8 = 0 Then :
             Out_8 = 10 : Decr Out_9
          End If
          If Out_9 = 0 Then :
             Out_9 = 10 : Decr Out_10
          End If
          If Out_10 = 0 Then Out_10 = 10

         For C = 0 To 30000
            If Pina.5 = 0 Then Return
         Next

         Do
          Decr Out_1
          If Out_1 = 0 Then :
             Out_1 = 10 : Decr Out_2
          End If
          If Out_2 = 0 Then :
             Out_2 = 10 : Decr Out_3
          End If
          If Out_3 = 0 Then :
             Out_3 = 10 : Decr Out_4
          End If
          If Out_4 = 0 Then :
             Out_4 = 10 : Decr Out_5
          End If
          If Out_5 = 0 Then :
             Out_5 = 10 : Decr Out_6
          End If
          If Out_6 = 0 Then :
             Out_6 = 10 : Decr Out_7
          End If
          If Out_7 = 0 Then :
             Out_7 = 10 : Decr Out_8
          End If
          If Out_8 = 0 Then :
             Out_8 = 10 : Decr Out_9
          End If
          If Out_9 = 0 Then :
             Out_9 = 10 : Decr Out_10
          End If
          If Out_10 = 0 Then Out_10 = 10

          If Pina.5 = 0 Then Return
          Waitms 50
          If Pina.5 = 0 Then Return
          Waitms 50
          If Pina.5 = 0 Then Return
         Loop

In_car:
         If Pina.7 = 0 Then :
            For W = 0 To 60000
               Debounce Pina.7 , 1 , In_car2
               If Pina.6 = 0 Then Return
            Next
            Return
         Else :
            Return
         End If
      In_car2:
         Gosub Set6 : Return
Out_car:

         If Pina.6 = 0 Then :
            For W = 0 To 60000
               Debounce Pina.6 , 1 , Out_car2
               If Pina.7 = 0 Then Return
            Next
            Return
         Else :
            Return
         End If
      Out_car2:
         Gosub Set7 : Return


   Elseif F = 5 Then :                                      '
DAMASANJ
         F 
Gosub Res_data Start Timer2

   
Elseif 6 Then :
         
Gosub Res_data Start Timer2
Saat
:
      
Ff Waitms 100

      
Do
         
Debounce Pina.3 Set_time
      Loop

Set_time
:
         For 
0 To 50000
            
If Pina.3 0 Then Goto Set1
         Next
         Ff 
1
         
Do
            
Debounce Pina.3 Set_mm
            Debounce Pina.4 
Incr_cc Gosub
            Debounce Pina.5 
Decr_cc Gosub
         Loop
Incr_cc
:
         
Incr Cc
         
If Cc 23 Then Cc 0
         C 
Cc Ww 10 Out_9 Ww Ww Ww 10 Ww Out_8 1
         
For 0 To 30000
            
If Pina.4 0 Then Return
         
Next
         
Do
            
Incr Cc
            
If Cc 23 Then Cc 0
            C 
Cc Ww 10 Out_9 Ww Ww Ww 10 Ww Out_8 1
            
If Pina.4 0 Then Return
            
Waitms 50
            
If Pina.4 0 Then Return
            
Waitms 50
            
If Pina.4 0 Then Return
         
Loop
Decr_cc
:
         
Decr Cc
         
If Cc 23 Then Cc 23
         C 
Cc Ww 10 Out_9 Ww Ww Ww 10 Ww Out_8 1
         
For 0 To 30000
            
If Pina.5 0 Then Return
         
Next
         
Do
            
Decr Cc
            
If Cc 23 Then Cc 23
            C 
Cc Ww 10 Out_9 Ww Ww Ww 10 Ww Out_8 1
            
If Pina.5 0 Then Return
            
Waitms 50
            
If Pina.5 0 Then Return
            
Waitms 50
            
If Pina.5 0 Then Return
         
Loop
Set_mm
:
         
Ff 2
         
Do
            
Debounce Pina.3 Saat
            Debounce Pina.4 
Incr_mm Gosub
            Debounce Pina.5 
Decr_mm Gosub
         Loop
Incr_mm
:
         
Incr Mm
         
If Mm 59 Then Mm 0
         C 
Mm Ww 10 Out_6 Ww Ww Ww 10 Ww Out_5 1
         
For 0 To 30000
            
If Pina.4 0 Then Return
         
Next
         
Do
            
Incr Mm
            
If Mm 59 Then Mm 0
            C 
Mm Ww 10 Out_6 Ww Ww Ww 10 Ww Out_5 1
            
If Pina.4 0 Then Return
            
Waitms 50
            
If Pina.4 0 Then Return
            
Waitms 50
            
If Pina.4 0 Then Return
         
Loop
Decr_mm
:
         
Decr Mm
         
If Mm 59 Then Mm 59
         C 
Mm Ww 10 Out_6 Ww Ww Ww 10 Ww Out_5 1
         
For 0 To 30000
            
If Pina.5 0 Then Return
         
Next
         
Do
            
Decr Mm
            
If Mm 59 Then Mm 59
            C 
Mm Ww 10 Out_6 Ww Ww Ww 10 Ww Out_5 1
            
If Pina.5 0 Then Return
            
Waitms 50
            
If Pina.5 0 Then Return
            
Waitms 50
            
If Pina.5 0 Then Return
         
Loop
   End 
If

Goto 
Star

Res_data
:
   
Out_1 Out_2 Out_3 Out_4 Out_5 Out_6 1
   Out_7 
Out_8 Out_9 Out_10 Sectic 255
   Cornometr_ms 
Cornometr_s Cornometr_m Cornometr_h 0
   
If 3 Then :
      
Out_4 16 Out_6 16 Out_8 16
   End 
If

Return

'###############################################################################

Sectic:
   Incr Sectic
   If F = 2 Then :
      If Sectic = 127 Then :
         Stop Timer1 : W = Timer1 : Timer1 = 0 : Start Timer1
         Frq = Ol * 65536 : Frq = Frq + W : Ol = 0 : If Frq > 999999 Then Frq = 999999
         L = Frq / 100000 : Out_8 = L + 1 : L = L * 100000 : Frq = Frq - L
         L = Frq / 10000 : Out_7 = L + 1 : L = L * 10000 : Frq = Frq - L
         L = Frq / 1000 : Out_6 = L + 1 : L = L * 1000 : Frq = Frq - L
         L = Frq / 100 : Out_5 = L + 1 : L = L * 100 : Frq = Frq - L
         L = Frq / 10 : Out_4 = L + 1 : L = L * 10 : Frq = Frq - L
         Out_3 = Frq + 1 : Out_10 = 11 : Out_9 = 12 : Out_2 = 13 : Out_1 = 14
      End If
   Elseif F = 3 Then :
      Cornometr_ms = Sectic * 8 : W = Cornometr_ms / 59
      Cornometr_ms = Cornometr_ms - W : If Cornometr_ms > 999 Then Cornometr_ms = 0
      If Sectic = 127 Then :
         Incr Cornometr_s
         If Cornometr_s > 59 Then :
            Cornometr_s = 0 : Incr Cornometr_m
         End If
         If Cornometr_m > 59 Then :
            Cornometr_m = 0 : Incr Cornometr_h
         End If
       End If
       E = Cornometr_ms : W = E / 100 : Out_3 = W + 1 : W = W * 100 : E = E - W
       W = E / 10 : Out_2 = W + 1 : W = W * 10 : E = E - W : Out_1 = E + 1

       E = Cornometr_s : W = E / 10 : Out_5 = W + 1 : W = W * 10 : E = E - W : Out_4 = E + 16
       E = Cornometr_m : W = E / 10 : Out_7 = W + 1 : W = W * 10 : E = E - W : Out_6 = E + 16
       E = Cornometr_h : W = E / 100 : Out_10 = W + 1 : W = W * 100 : E = E - W
       W = E / 9 : Out_9 = W + 1 : W = W * 10 : E = E - W : Out_8 = E + 16

   Elseif F = 4 Then :
         If Sectic = 127 Then :
            Incr Fff : If Fff = 21 Then Fff = 0
            Select Case Fff
               Case 0 :
                  Out_10 = 0 : Out_9 = 0 : Out_8 = 0 : Out_7 = 0 : Out_6 = 0
                  Out_5 = 0 : Out_4 = 0 : Out_3 = 0 : Out_2 = 0 : Out_1 = 0
               Case 1 :
                  Out_10 = 1 : Out_9 = 0 : Out_8 = 0 : Out_7 = 0 : Out_6 = 0
                  Out_5 = 0 : Out_4 = 0 : Out_3 = 0 : Out_2 = 0 : Out_1 = 0
               Case 2 :
                  Out_10 = 2 : Out_9 = 1 : Out_8 = 0 : Out_7 = 0 : Out_6 = 0
                  Out_5 = 0 : Out_4 = 0 : Out_3 = 0 : Out_2 = 0 : Out_1 = 0
               Case 3 :
                  Out_10 = 3 : Out_9 = 2 : Out_8 = 1 : Out_7 = 0 : Out_6 = 0
                  Out_5 = 0 : Out_4 = 0 : Out_3 = 0 : Out_2 = 0 : Out_1 = 0
               Case 4 :
                  Out_10 = 4 : Out_9 = 3 : Out_8 = 2 : Out_7 = 1 : Out_6 = 0
                  Out_5 = 0 : Out_4 = 0 : Out_3 = 0 : Out_2 = 0 : Out_1 = 0
               Case 5 :
                  Out_10 = 5 : Out_9 = 4 : Out_8 = 3 : Out_7 = 2 : Out_6 = 1
                  Out_5 = 0 : Out_4 = 0 : Out_3 = 0 : Out_2 = 0 : Out_1 = 0
               Case 6 :
                  Out_10 = 6 : Out_9 = 5 : Out_8 = 4 : Out_7 = 3 : Out_6 = 2
                  Out_5 = 1 : Out_4 = 0 : Out_3 = 0 : Out_2 = 0 : Out_1 = 0
               Case 7 :
                  Out_10 = 7 : Out_9 = 6 : Out_8 = 5 : Out_7 = 4 : Out_6 = 3
                  Out_5 = 2 : Out_4 = 1 : Out_3 = 0 : Out_2 = 0 : Out_1 = 0
               Case 8 :
                  Out_10 = 8 : Out_9 = 7 : Out_8 = 6 : Out_7 = 5 : Out_6 = 4
                  Out_5 = 3 : Out_4 = 2 : Out_3 = 1 : Out_2 = 0 : Out_1 = 0
               Case 9 :
                  Out_10 = 9 : Out_9 = 8 : Out_8 = 7 : Out_7 = 6 : Out_6 = 5
                  Out_5 = 4 : Out_4 = 3 : Out_3 = 2 : Out_2 = 1 : Out_1 = 0

               Case 10 :
                  Out_10 = 10 : Out_9 = 9 : Out_8 = 8 : Out_7 = 7 : Out_6 = 6
                  Out_5 = 5 : Out_4 = 4 : Out_3 = 3 : Out_2 = 2 : Out_1 = 1
               Case 11 :
                  Out_10 = 0 : Out_9 = 10 : Out_8 = 9 : Out_7 = 8 : Out_6 = 7
                  Out_5 = 6 : Out_4 = 5 : Out_3 = 4 : Out_2 = 3 : Out_1 = 2
               Case 12 :
                  Out_10 = 0 : Out_9 = 0 : Out_8 = 10 : Out_7 = 9 : Out_6 = 8
                  Out_5 = 7 : Out_4 = 6 : Out_3 = 5 : Out_2 = 4 : Out_1 = 3
               Case 13 :
                  Out_10 = 0 : Out_9 = 0 : Out_8 = 0 : Out_7 = 10 : Out_6 = 9
                  Out_5 = 8 : Out_4 = 7 : Out_3 = 6 : Out_2 = 5 : Out_1 = 4
               Case 14 :
                  Out_10 = 0 : Out_9 = 0 : Out_8 = 0 : Out_7 = 0 : Out_6 = 10
                  Out_5 = 9 : Out_4 = 8 : Out_3 = 7 : Out_2 = 6 : Out_1 = 5
               Case 15 :
                  Out_10 = 0 : Out_9 = 0 : Out_8 = 0 : Out_7 = 0 : Out_6 = 0
                  Out_5 = 10 : Out_4 = 9 : Out_3 = 8 : Out_2 = 7 : Out_1 = 6
               Case 16 :
                  Out_10 = 0 : Out_9 = 0 : Out_8 = 0 : Out_7 = 0 : Out_6 = 0
                  Out_5 = 0 : Out_4 = 10 : Out_3 = 9 : Out_2 = 8 : Out_1 = 7
               Case 17 :
                  Out_10 = 0 : Out_9 = 0 : Out_8 = 0 : Out_7 = 0 : Out_6 = 0
                  Out_5 = 0 : Out_4 = 0 : Out_3 = 10 : Out_2 = 9 : Out_1 = 8
               Case 18 :
                  Out_10 = 0 : Out_9 = 0 : Out_8 = 0 : Out_7 = 0 : Out_6 = 0
                  Out_5 = 0 : Out_4 = 0 : Out_3 = 0 : Out_2 = 10 : Out_1 = 9
               Case 19 :
                  Out_10 = 0 : Out_9 = 0 : Out_8 = 0 : Out_7 = 0 : Out_6 = 0
                  Out_5 = 0 : Out_4 = 0 : Out_3 = 0 : Out_2 = 0 : Out_1 = 10
               Case 20 :
                  Out_10 = 0 : Out_9 = 0 : Out_8 = 0 : Out_7 = 0 : Out_6 = 0
                  Out_5 = 0 : Out_4 = 0 : Out_3 = 0 : Out_2 = 0 : Out_1 = 0
            End Select
         End If
   Elseif F = 6 Then :
      If Sectic = 127 Then :
         Start Adc : Dama = Getadc(0) : Stop Adc : Dama = Dama * 25
         L = Dama / 100000 : Out_8 = L + 1 : L = L * 100000 : Dama = Dama - L
         L = Dama / 10000 : Out_7 = L + 1 : L = L * 10000 : Dama = Dama - L
         L = Dama / 1000 : Out_6 = L + 1 : L = L * 1000 : Dama = Dama - L
         L = Dama / 100 : Out_5 = L + 16 : L = L * 100 : Dama = Dama - L
         L = Dama / 10 : Out_4 = L + 1 : L = L * 10 : Dama = Dama - L
         Out_3 = Dama + 1 : Out_10 = 27 : Out_9 = 28 : Out_8 = 12 : Out_2 = 29 : Out_1 = 30
      End If
   Elseif F = 7 Then :
      If Sectic = 127 Then :

         Ss = Ss + 1
         If Ss > 59 Then :
            Ss = 0 : Mm = Mm + 1
         End If
         If Mm > 59 Then :
            Mm = 0 : Cc = Cc + 1
         End If
         If Cc > 23 Then :
            Cc = 0
         End If
         E = Ss : W = E / 10 : Out_3 = W + 1 : W = W * 10 : E = E - W : Out_2 = E + 1
         E = Mm : W = E / 10 : Out_6 = W + 1 : W = W * 10 : E = E - W : Out_5 = E + 1
         E = Cc : W = E / 10 : Out_9 = W + 1 : W = W * 10 : E = E - W : Out_8 = E + 1
         Out_4 = 12 : Out_7 = 12 : Out_1 = 0 : Out_10 = 0

      Elseif Sectic = 63 Then :
         Out_4 = 0 : Out_7 = 0
         E = Mm : W = E / 10 : Out_6 = W + 1 : W = W * 10 : E = E - W : Out_5 = E + 1
         E = Cc : W = E / 10 : Out_9 = W + 1 : W = W * 10 : E = E - W : Out_8 = E + 1
      Elseif Sectic = 31 Then :
         If Ff = 1 Then : Out_8 = 0 : Out_9 = 0
         Elseif Ff = 2 Then : Out_6 = 0 : Out_5 = 0
         End If
      Elseif Sectic = 95 Then :
         If Ff = 1 Then : Out_8 = 0 : Out_9 = 0
         Elseif Ff = 2 Then : Out_6 = 0 : Out_5 = 0
         End If
      End If

   End If
   If Sectic > 126 Then Sectic = 255
Return

Ol:
   Incr Ol
Return

'
###############################################################################

Scan:
   
Incr B : If 11 Then B 1

   Reset Portb.4 
Reset Portb.5 Reset Portb.6 Reset Portb.7 Reset Portc.0
   Reset Portc.1 
Reset Portc.2 Reset Portc.3 Reset Portc.4 Reset Portc.5

   Select 
Case B
   
Case :
      
Portd Lookup(out_1 Number) : Set Portb.7
   
Case :
      
Portd Lookup(out_2 Number) : Set Portb.6
   
Case :
      
Portd Lookup(out_3 Number) : Set Portb.5
   
Case :
      
Portd Lookup(out_4 Number) : Set Portb.4
   
Case :
      
Portd Lookup(out_5 Number) : Set Portc.5
   
Case :
      
Portd Lookup(out_6 Number) : Set Portc.4
   
Case :
      
Portd Lookup(out_7 Number) : Set Portc.3
   
Case :
      
Portd Lookup(out_8 Number) : Set Portc.2
   
Case :
      
Portd Lookup(out_9 Number) : Set Portc.1
   
Case 10 :
      
Portd Lookup(out_10 Number) : Set Portc.0
   End Select
Return

'###############################################################################

Number:
Data 0 , &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110 , &B01101101 _
 , &B01111101 , &B00000111 , &B01111111 , &B01101111 , &B01110001 , &B01001000 , &B01110110 _
 , &B01001001 , 0 , &B10111111 , &B10000110 , &B11011011 , &B11001111 , &B11100110 , &B11101101_
  , &B11111101 , &B10000111 , &B11111111 , &B01101111 , 26 , &B00110001 , &B01111001 , &B00000001 , &B01011000 
نقل قول: و دقت کنید برنامه Getkey من دارای یک While بی نهایت است
یه تابع دیگه هم هست که while بی نهایت نداره از اون استفاده کن فقط چک می کنه اگه فشرده شده باشه عدد کلید رو در غیر اینصورت مثلا false بر می گردونه با اون مشکلت حل می شه
ایده هی تایمر و وقفه تایمر هم ایده خوبی البته ممکنه مشکلاتی پیش بیاره مثل اینکه وسط نوشتن توی LCD وقفه فعال بشه و اون شروع کنه به نوشتن که قاطی می شه باید اینجور مواقع وقفه رو از غیر فعال کنی بعد دوباره فعال کنی