Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: ertuğrul54 - 18 Ekim 2016, 16:56:05

Başlık: iki buton mantığı sorunu
Gönderen: ertuğrul54 - 18 Ekim 2016, 16:56:05
merhaba arkadaşlar kendi çapımda denemeler yapıyorum ama takıldığım yerler var yardımcı olursanız sevinirim  3 adet led  2 adet buton var  select ve press  ilk calışmada prese basıyorum ama çalışmıyor  amac ilk önce prese basmak select ile  animasyon seçimi yapmak  ama bir türlü ilk çalışmada  prese bastığım halde ilk animasyona geçemiyorum illaki select e  basmam gerekiyor mantığı çözemedim



#include <12F683.h>
#fuses   INTRC_IO,MCLR,NOBROWNOUT
#use    delay(clock=4000000)
#define led1     PIN_A0
#define led2     PIN_A1
#define led3     PIN_A2
#define select   PIN_A4
#define press    PIN_A5

#define on   output_high
#define off  output_low
int sec=0;
//int1 flag=1;
//int1 test=1;
Void anime1()
{
if(input(press))
{
while(input(press));
on(led1);
delay_ms(200);
off(led1);
delay_ms(200);
on(led1);
delay_ms(200);
off(led1);
delay_ms(200);
on(led1);
delay_ms(200);
off(led1);
delay_ms(200);
on(led1);
delay_ms(200);
off(led1);
delay_ms(200);
}
}
  void anime2()
{
if(input(press))
{
while(input(press));
on(led2);
delay_ms(200);
off(led2);
delay_ms(200);
on(led2);
delay_ms(200);
off(led2);
delay_ms(200);
on(led2);
delay_ms(200);
off(led2);
delay_ms(200);
on(led2);
delay_ms(200);
off(led2);
delay_ms(200);
}
}
  void anime3()
{
if(input(press))
{
while(input(press));
on(led3);
delay_ms(200);
off(led3);
delay_ms(200);
on(led3);
delay_ms(200);
off(led3);
delay_ms(200);
on(led3);
delay_ms(200);
off(led3);
delay_ms(200);
on(led3);
delay_ms(200);
off(led3);
delay_ms(200);
}
}
Void main()
{
set_tris_a(0x00);
output_a(0b11000);
  while(1)
{
    if(input(select))
{
while(input(select));
sec++;
}
    if(sec==1)
{
anime1();
}
    if(sec==2)
{
anime2();
}
    if(sec==3)
{
anime3();
}
    if(sec==4)
{
sec=1;
}
}
  }
Başlık: Ynt: iki buton mantığı sorunu
Gönderen: int32 - 18 Ekim 2016, 18:00:00
(Programdan anladığım kadarıyla basılan buton pic'in pinine lojik-1 veriyor)

main'deki ana döngüde press butonu için hiç bir işlem koymamışsın ki!
Sadece select butonu için işlem koymuşsun.
Başlık: Ynt: iki buton mantığı sorunu
Gönderen: Cemre. - 19 Ekim 2016, 00:27:53
Yapmak istediğinizi basitçe ve adım adım yazın.

Döngü başladı,

#Press'e basılana kadar burada bekle.
Basılınca alt satıra in.
#Select'e basılana kadar burada bekle.
Basılınca alt satıra in.
#x değişkenini bir artır.
#x değişkeni 1 mi?
Evetse şunu yap, değilse
#x değişkeni 2 mi?
Evetse şunu yap, değişse
#x değişkeni 3 mü?
Evetse şunu yap, değilse
#x değişkeni 4 mü?
Evetse x değişkenini 1 yap.
Bitti. Başa dön.

Bunu yapacak kodu aşağı yukarı yazmışsınız. Ancak çok daha basit hale getirmelisiniz. Eksikleriniz var, bunları düzeltmelisiniz. Yukarıdaki adımları izleyerek biryerden kopya çekmeden gereken kodu yazabilir misiniz? Bence evet! Yazın, tekrar konuşalım.

İyi çalışmalar, iyi geceler.

mesaj birleştirme:: 19 Ekim 2016, 00:29:47

Ayrıca kurulan mantık hatalı, şu an farkettim, düzeltme özelliği olmadığı için yeni mesaj olacak kusura bakmayın... Mantığı adım adım tekrar kurun. Buna algoritma deniyor. Kendi algoritmanızı oluşturun. Akış şeması nedir biliyor musunuz? Akış şemasını çizin. Eminim yapacaksınız. Kolaylıklar...
Başlık: Ynt: iki buton mantığı sorunu
Gönderen: kareli - 22 Ekim 2016, 19:00:13
İyi çalışmalar ,l önce yazılımınızı şöle göz ucu ile incelediğimde sen A portunun 0 1 2 portlarını cıkıs 3 4 portlarını buton ,ç,n giriş olarak kullanmışşsın ama yazılımda set_tris_a(0x00) şeklinde A portunun hepsini çıkış yapmışsın

mesaj birleştirme:: 23 Ekim 2016, 09:02:03

output_a(0x11000) ile set tris farklı tam tersini yapman gerekiyor a portunu temizlemek için

mesaj birleştirme:: 22 Ekim 2016, 19:09:49

#int32 arkadaşımızın dediği gibi press ile ilgili bir komut yok ,ard arda if komutu kullanmışsın else if fondgusen prees koymalısın yada diğer select komutlarını iç içe yazmalasın
Başlık: Ynt: iki buton mantığı sorunu
Gönderen: ertuğrul54 - 26 Ekim 2016, 13:15:37
uzun bir ara vermek zorunda kaldım işlerimin yoğunluğundan dolayı
aşağıdaki kodlar çalışıyor


#include <12F683.h>
#fuses   INTRC_IO,MCLR,NOBROWNOUT
#use    delay(clock=4000000)
#define led1     PIN_A0
#define led2     PIN_A1
#define led3     PIN_A2
#define select   PIN_A4
#define press    PIN_A5

#define on   output_high
#define off  output_low

static int1 Start = 0;
static int Ani = 1;


void buton(){

static int timeOutE = 0;
static int timeOutS = 0;

if((!input(press)) && (timeOutE++>35)){
delay_ms(3);
Start = 1;
timeOutE=0;
}
else if(input(press)){
timeOutE=0;
}

if((!input(select)) && (timeOutS++>35)){
delay_ms(3);
if(Ani<3) Ani++;
else Ani=1;
write_eeprom(2,ani);
delay_us(20);
timeOutS = 0;
}
else if(input(select)){
timeOutS = 0;
}

}

void main(){

for(;;){
buton();
if(Start){//
  Switch(Ani){
case 1:
delay_ms(100);
on(led1);
delay_ms(200);
off(led1);
delay_ms(200);
on(led1);
delay_ms(200);
off(led1);
delay_ms(200);
on(led1);
delay_ms(200);
off(led1);
delay_ms(200);
on(led1);
delay_ms(200);
off(led1);
delay_ms(200);
break;
case 2:
on(led2);
delay_ms(200);
off(led2);
delay_ms(200);
on(led2);
delay_ms(200);
off(led2);
delay_ms(200);
on(led2);
delay_ms(200);
off(led2);
delay_ms(200);
on(led2);
delay_ms(200);
off(led2);
delay_ms(200);


break;
case 3:
on(led3);
delay_ms(200);
off(led3);
delay_ms(200);
on(led3);
delay_ms(200);
off(led3);
delay_ms(200);
on(led3);
delay_ms(200);
off(led3);
delay_ms(200);
on(led3);
delay_ms(200);
off(led3);
delay_ms(200);
break;
default:break;
}
Start=0;
}

}
}