arkadaşlar proteusta devreyi kurdum programı picin içine attım KEYPAD de sayılara bastıktan 2 sn sonra sayı sıfırlanıyor neden olabilir acaba yardımcı olabilecek varsa kodu ve proteus çizimimi yollayabilirim. mesela 25+52 dicem ama 25 yazdıktan 2 sn sonra sıfırlanıyor işlem yapmıyor yardımcı olabilecek varsa çok makbule geçer
Sanirsam bi yerlerde temizleme islemi yapiyo.
< Bu ileti mobil sürüm kullanılarak atıldı >
pm olarak kodu gönderdim bakabilirmisin kardeş bi sana zahmet ya
yardımcı olabilecek kimse yok mu arkadaşlar ?
buraya hangi dili kullandığınızı,kodunuzu ve simülasyon dosyasını koyarsanız yardımcı olabilirsem olurum olamazsam mutlaka yardımcı olacaklar çıkacaktır.
for (;;) { key = calc_getkey(); if (calc_testkey(key)) { // Key test positive for digit so we read it into the // buffer and then write the buffer to the screen/LCD. // Size limit the number of digits - allow for termination // and possible negative results. if (pos != MAX_DISPLAY_CHAR - 2) { number[pos++] = key; number[pos] = 0; calc_display(number); } } else { // If a number has been entered, then evaulate it. // The number is stored to lvalue if we have no current operator, // or else rvalue if we do. if (pos != 0) { tmp = atof(number); if (lastop == 0) lvalue = tmp; else rvalue = tmp; }
// Reset the input buffer. pos = 0;
// Process the Command - LastOp holds the last actual operator; if (lastop != 0) calc_opfunctions(lastop); if (key != '=') lastop = key; else lastop = 0; } } }
VOID calc_opfunctions (CHAR token) // Handle the operations. Lvalue holds the result and we test for // consecutive operator presses. { INT8 result = OK; switch (token) { case '+' : lvalue += rvalue; break; case '-' : lvalue -= rvalue; break; case '*' : lvalue *= rvalue; break; case '/' : if (rvalue != 0) lvalue /= rvalue; else result = ERROR; break; }
if (result == OK) calc_format(lvalue); else if (result == ERROR) { char buf[] = "*ERROR*"; calc_display(buf); } }
VOID calc_format (FLOAT f) // Microchip C18's math libraries are not as accurate as // they should be, so we have to use a table of divisors. { static const float divisors[] = { 100000000, 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, 0 }; CHAR dbuf [MAX_DISPLAY_CHAR+1]; FLOAT divisor, tmp; INT count = 0, digit; INT pad=0, p=0;
// Sort out minus sign: if (f >= 0) dbuf[p++] = ' '; else { dbuf[p++] = '-'; f = -f; }
if (f >= divisors[0]) dbuf[p++] = 'E'; else while (p < MAX_DISPLAY_CHAR && ((divisor=divisors[count++]) >= 1 || f > 0.0000001)) { if (fabs(f)<1) digit = f/divisor+0.05; else digit = f/divisor; if (divisor == 0.1) dbuf[p++] = '.'; if (digit != 0 || divisor < 10) { dbuf[p++] = digit + '0'; pad = TRUE; } else if (pad) dbuf[p++] = '0'; tmp = digit*divisor; f -= tmp; } dbuf[p] = 0; calc_display(dbuf); }
BOOL calc_testkey (CHAR key) // Test whether the key is a digit, a decimal point or an operator. // Return 1 for digit or decimal point, 0 for op. { if ((key == '.')|| ((key >= '0') && (key <= '9'))) return TRUE; else return FALSE; }
CHAR calc_getkey (VOID) // Use the input routine from the *Keypad_Read* assembly file to // Scan for a key and return ASCII value of the Key pressed. { CHAR mykey; while ((mykey = keypadread()) == 0x00) /* Poll again */; return mykey; }
VOID calc_display (CHAR *buf) // Use the Output and Clearscreen routines from the // *LCD_Write* assembly file to output ASCII values to the LCD. { INT8 i; clearscreen(); for (i=0 ; buf != 0; i++) // { if (buf[calc_testkey(buf) || buf == 0x2D) { wrdata(buf); } // } }
yok mu yardımcı olabilecek birileri hata nerde
c dilini bilsem yardımcı olmaya çalışırdım
yinede teşekkürler
yeni mesaja git
Yeni mesajları sizin için sürekli kontrol ediyoruz, bir mesaj yazılırsa otomatik yükleyeceğiz.Bir Daha Gösterme