Arkadaşlar yaptığım çalışmada
if(sifre==6299 && e==14)
output_high(pin_b0);
keypadle girdiğim sayılarda yüzler basamağında 299'a kadar sayılarla işlem yapıyor. 299'u geçince duruyor.Birde binler basamağı kaç olursa olsun çalışıyor.Örneğin 7299'a kadar sayılarla çalışyor.7300'de ve yukarısında işlem yapmıyor.8299'a kadar sayılarla çalışıyor.8300'de duruyor.9299 a kadar sayılarlaçalışıyor,9300'de çalışmıyor.v.b.Bu sayıları0000'dan - 9999'a kadar nasıl çalştırtabilirim.
değişken tipleri bu sayıları tutmaya yetiyor mu? Ayrıca programı gömek lazım.
Alıntı yapılan: kantirici - 19 Nisan 2014, 21:26:57
değişken tipleri bu sayıları tutmaya yetiyor mu? Ayrıca programı gömek lazım.
Hocam, değişkenler:
unsigned int8 tus,e,a,b,c,d;
unsigned int16 sifre=0;
Kodlar:
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#include <lcd.c>
#use fast_io(c)
#use fast_io(b)
#use fast_io(d)
#use fast_io(a)
#use fast_io(e)
#define sut1 pin_B4
#define sut2 pin_B5
#define sut3 pin_B6
#define sat1 pin_B0
#define sat2 pin_B1
#define sat3 pin_B2
#define sat4 pin_B3
#define m1 pin_a0
#define m2 pin_a1
#define ea pin_a2
#define eb pin_a3
#define buton_ileri pin_e0
#define buton_geri pin_e1
#define buton_stop pin_e2
#define buzzer pin_c0
#define use_portd_lcd TRUE
unsigned int8 tus,e,a,b,c,d;
unsigned int16 sifre=0;
void tus_al()// yazılım bu fonksiyona geldiğinde buradan bir
{ // tus değeri almadan bu fonksiyondan çıkmaz
don:
output_low(sut1);output_high(sut2);output_high(sut3);
if(input(sat1)==0){tus=1;goto brk;}
if(input(sat2)==0){tus=4;goto brk;}
if(input(sat3)==0){tus=7;goto brk;}
if(input(sat4)==0){tus=15;goto brk;}
output_high(sut1);output_low(sut2);output_high(sut3);
if(input(sat1)==0){tus=2;goto brk;}
if(input(sat2)==0){tus=5;goto brk;}
if(input(sat3)==0){tus=8;goto brk;}
if(input(sat4)==0){tus=0;goto brk;}
output_high(sut1);output_high(sut2);output_low(sut3);
if(input(sat1)==0){tus=3;goto brk;}
if(input(sat2)==0){tus=6;goto brk;}
if(input(sat3)==0){tus=9;goto brk;}
if(input(sat4)==0){tus=14;goto brk;}
goto don;
brk:
while(!input(sat1));
while(!input(sat2));
while(!input(sat3));
while(!input(sat4));
output_high(buzzer);delay_ms(100);output_low(buzzer);
}
void main()
{
set_tris_b(0b00001111);//keypad baglı
set_tris_c(0b00000000);
set_tris_a(0b00000000);
set_tris_d(0b00000000);
set_tris_e(0b00000111);
port_b_pullups(true);//*** CMOS girişler voltaja hassastır , en ufak voltajı 0-1 olarak kabul edebilirler.
//Bunun önüne geçmek için pull-up yada pull-down direnci ile hat 0'a yada 5V'a çekilir ve stabil hale getirilir.
output_a(0x00);
output_b(0x00);
output_c(0x00);
output_d(0x00);
output_e(0x00);
output_high(ea);
output_low(eb);
lcd_init(); // LCD hazırlanıyor
basla:
printf(lcd_putc,"\fsifre:");
delay_ms(500);
all:
tus_al();
a=tus;
lcd_gotoxy(9,1);
printf(lcd_putc,"*");
if(tus==14||tus==15) {goto basla;}
delay_ms(300);
tus_al();
b=tus;
lcd_gotoxy(10,1);
printf(lcd_putc,"*");
if(tus==14||tus==15) {goto basla;}
delay_ms(300);
tus_al();
c=tus;
lcd_gotoxy(11,1);
printf(lcd_putc,"*");
if(tus==14||tus==15) {goto basla;}
delay_ms(300);
tus_al();
d=tus;
lcd_gotoxy(12,1);
printf(lcd_putc,"*");
if(tus==14||tus==15) {goto basla;}
delay_ms(300);
tus_al();
e=tus;
if(tus==15) {goto basla;}
delay_ms(300);
sifre=((a*1000)+(b*100)+(c*10)+(d*1));
if(sifre==8299 && e==14)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\f DOGRU SIFRE");
printf(lcd_putc,"\n PROJE CALISTI");
delay_ms(300);
while(1) // Sonsuz döngü
{
if (input(buton_ileri)) // İLERİ Butonuna basılsı ise
{
output_high(m1); // L298 Input1 girişi lojik-1
output_low(m2); // L298 Input2 girişi lojik-0
}
if (input(buton_geri)) // GERİ Butonuna basılsı ise
{
output_low(m1); // L298 Input1 girişi lojik-0
output_high(m2); // L298 Input1 girişi lojik-1
}
if (input(buton_stop)) // HIZLI STOP Butonuna basılsı ise
{
output_low(m1); // L298 Input1 girişi lojik-0
output_low(m2); // L298 Input1 girişi lojik-0
// Hızlı stop için burada her iki girişte lojik-1 olabilirdi.
// Önemli olan Hızlı Stop için, her iki girişin aynı seviyede olması
}
}
}
else
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\f YANLIS SIFRE");
printf(lcd_putc,"\nTEKRAR DENEYINIZ");
delay_ms(1000);
goto basla;
}}
Sorun:Yazılmış olan program sayıları 1299-2299-3299-4299...9299 'a kadarlığını kullanıyor.Program içinde sifre oluşturduğumda bu sayılara kadar olanları program dikkate alıyor,kullanıyor.Bu sayılardan büyüklerinde programda hatalı bir çalışma oluyor.Bunları 0000'dan -9999'a kadar kullanmak istiyorum ne yapmalıyım.
x
@semfero
o kadar goto kullanmışsın ki bir an için basic programına bakıyorum zannettim. Örneğin tuş basması için b portu kesmesini kullanabilirsin. Böylece sürekli tuş basıldı mı diye bakmana gerek kalmaz.
Yok onu kullanmam dersen bir ve değil kapısı ile işlemciye giren bacaklardan birer tanesi VE DEĞİL kapısına uygulanır çıkışı da harici kesmeye uygulanır.
tuşları tek tek değişkene eşitlemene gerek yok
e=d;
d=c;
c=b;
b=a;
a=tus;
böylece bir seferde girilen son değere göre değerler kaydırılır.
hani olabilir ya
if(sifre==8299 && e==14)
bunu a,b,c,d değerlerini tek tek bakacak şekilde düzenleyip bir deneyebilirsin..
if(a==8 && b==2 && c==9 && d==9 && e==14)
gibi bir şey oluyor...
tuş takımından girilen sayıları toplarken işlem türünü bildirmen gerekiyor yoksa 8 bitlik işlem yapar. bu nedenle 300 sayısını elde edemiyorsun.
işlemi şu şekilde yap bakalım:
sifre=(((int16)a*1000)+((int16)b*100)+(c*10)+(d*1));
Alıntı yapılan: pwm.c - 20 Nisan 2014, 00:51:50
tuş takımından girilen sayıları toplarken işlem türünü bildirmen gerekiyor yoksa 8 bitlik işlem yapar. bu nedenle 300 sayısını elde edemiyorsun.
işlemi şu şekilde yap bakalım:
sifre=(((int16)a*1000)+((int16)b*100)+(c*10)+(d*1));
Hocam çok teşekkür ederim, sayenizde sorun giderildi.
mesaj birleştirme:: 20 Nisan 2014, 06:59:32
Alıntı yapılan: ambar7 - 20 Nisan 2014, 00:40:40
@semfero
o kadar goto kullanmışsın ki bir an için basic programına bakıyorum zannettim. Örneğin tuş basması için b portu kesmesini kullanabilirsin. Böylece sürekli tuş basıldı mı diye bakmana gerek kalmaz.
Yok onu kullanmam dersen bir ve değil kapısı ile işlemciye giren bacaklardan birer tanesi VE DEĞİL kapısına uygulanır çıkışı da harici kesmeye uygulanır.
tuşları tek tek değişkene eşitlemene gerek yok
e=d;
d=c;
c=b;
b=a;
a=tus;
böylece bir seferde girilen son değere göre değerler kaydırılır.
hani olabilir ya
if(sifre==8299 && e==14)
bunu a,b,c,d değerlerini tek tek bakacak şekilde düzenleyip bir deneyebilirsin..
if(a==8 && b==2 && c==9 && d==9 && e==14)
gibi bir şey oluyor...
Hocam verdiğiniz bu bilgilerden sonra programı bu bilgiler ışığında yeniden düzenlemeye karar verdim.Ancak kesmeler üzerine biraz daha araştırma yapmam lazım.Teşekkür ederim.