pcbway

pic16f877 + keypad + iki tane 7-segment(yardim edin)

Başlatan suleymanq, 14 Mayıs 2013, 20:11:05

suleymanq

14 Mayıs 2013, 20:11:05 Son düzenlenme: 14 Mayıs 2013, 20:17:43 suleymanq
Beyler yardim edin projem yarimda kaldi yetistirmem lazim
sirasiyla portb ve portc ye bagli 7-seg yapiyorum yani 0 ile 99 arasi istedigim sayi gostermem lazim. asagidaki koda nasil bir dongu eklemem lazim?


#include <16f877.h> 

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)

#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

#byte   portb=0x06
#byte   portc=0x07   

#define sut1   pin_d0
#define sut2   pin_d1
#define sut3   pin_d2
#define sut4   pin_d3

#define sat1   pin_d4
#define sat2   pin_d5
#define sat3   pin_d6
#define sat4   pin_d7

char tus=0;

//*********** Keypad Tarama Fonksiyonu *********
char keypad_oku()
{
   output_d(0x00);

   output_high(sat1);
   if (input(sut1))   // 1. sütun okunuyor
      { delay_ms(20); tus=1; }
   if (input(sut2))   // 2. sütun okunuyor
      { delay_ms(20); tus=2; }
   if (input(sut3))   // 3. sütun okunuyor
      { delay_ms(20); tus=3; }
   if (input(sut4))   // 4. sütun okunuyor
      { delay_ms(20); tus=0xA; }
   output_low(sat1); // 1. satýr lojik-0 yapýlýyor

   output_high(sat2); // 2. satýr lojik-1 yapýlýyor
   if (input(sut1))   // 1. sütun okunuyor
      { delay_ms(20); tus=4; }
   if (input(sut2))   // 2. sütun okunuyor
      { delay_ms(20); tus=5; }
   if (input(sut3))   // 3. sütun okunuyor
      { delay_ms(20); tus=6; }
   if (input(sut4))   // 4. sütun okunuyor
      { delay_ms(20); tus=0xB; }
   output_low(sat2); // 2. satýr lojik-0 yapýlýyor

   output_high(sat3); // 3. satýr lojik-1 yapýlýyor
   if (input(sut1))   // 1. sütun okunuyor
      { delay_ms(20); tus=7; }
   if (input(sut2))   // 2. sütun okunuyor
      { delay_ms(20); tus=8; }
   if (input(sut3))   // 3. sütun okunuyor
      { delay_ms(20); tus=9; }
   if (input(sut4))   // 4. sütun okunuyor
      {delay_ms(20); tus=0x0C; }
   output_low(sat3); // 3. satýr lojik-0 yapýlýyor

   output_high(sat4); // 3. satýr lojik-1 yapýlýyor
   if (input(sut1))   // 1. sütun okunuyor
      { delay_ms(20); tus=0xE; }
   if (input(sut2))   // 2. sütun okunuyor
      { delay_ms(20); tus=0; }
   if (input(sut3))   // 3. sütun okunuyor
      { delay_ms(20); tus=0xF; }
   if (input(sut4))   // 4. sütun okunuyor
      {delay_ms(20); tus=0xD; }
   output_low(sat4); // 3. satýr lojik-0 yapýlýyor

   return tus;
}

/********* ANA PROGRAM FONKSÝYONU********/

void main ( )
{
   setup_psp(PSP_DISABLED);       
   setup_timer_1(T1_DISABLED);   
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS); 
   setup_adc(ADC_OFF);             
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);

   set_tris_b(0x00);
   set_tris_c(0x00); 
   set_tris_d(0x0F); 

   output_b(0x00);
   output_c(0x00);

   int k;

   while(1) 
   {
     if(keypad_oku())
     {
     k++;
     if(k==1){portc=tus;}
     if(k==2){portb=tus;k=0;}
     }
  }
}

suleymanq

suanki haliyle iki rakam ayni anda cikiyor yani 11 22 33 44 55.. nasil ayirabilirim bunlari?

pwm.c

http://www.picproje.org/index.php/topic,46722.0/topicseen.html
Burada yeterince yardım eden olmuş.
yapman gereken şey tuşlardan bilgi geldiğinde ekrana yazdıktan sonra tuşu bırakana kadar beklemeye (döngüye) sokmak.
tuşu bırakmayı beklemessen girdiğin verileri sürekli ekrana aktarır ve doğal olarak aynı sayılar görülür.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

suleymanq

aynen sikinti burada yapamiyorum iste deneme yanilma yoluyla deniyorum olmuyor

pwm.c

15 Mayıs 2013, 20:45:38 #4 Son düzenlenme: 15 Mayıs 2013, 20:48:10 pwm.c
devrenin proteus dsn dosyasını gönderebilirmisiniz?
birde 4511 entegrelerini kaldırsanız daha iyi olmaz mı?
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

suleymanq

Alıntı yapılan: pwm.c - 15 Mayıs 2013, 20:45:38devrenin proteus dsn dosyasını gönderebilirmisiniz?
birde 4511 entegrelerini kaldırsanız daha iyi olmaz mı?

Tabi ki hocam, 4511 entegreler onemli degil ama baska bir sekilde de bilmiyorum zaten. dosya ekledim bir zahmet yardimci olur musunuz

pwm.c

_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

suleymanq

Masallah hocam tam istedigim gibi bir kod yazdiniz, simdi projenin kalan kismi var onu ben halelederim burada paylasirim :) (proje 0-99 arasi role kontrol)

suleymanq

Öncelikle pwm.c hocamızı teşekkür etmek istiyorum ve bitirmiş olduğum projenin son halini paylaşıyorum.

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=2000000)

#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

#byte   portb=0x06
#byte   portc=0x07

#define sut1   pin_d0
#define sut2   pin_d1
#define sut3   pin_d2
#define sut4   pin_d3

#define sat1   pin_d4
#define sat2   pin_d5
#define sat3   pin_d6
#define sat4   pin_d7

char tus=0,ptus,ekran;

char keypad()
{
   output_d(0x00);
   tus=0;
   output_high(sat1);
   if (input(sut1)) 
      { delay_ms(20); tus=1; }
   if (input(sut2)) 
      { delay_ms(20); tus=2; }
   if (input(sut3))   
      { delay_ms(20); tus=3; }
   output_low(sat1);

   output_high(sat2);
   if (input(sut1))   
      { delay_ms(20); tus=4; }
   if (input(sut2))   
      { delay_ms(20); tus=5; }
   if (input(sut3))   
      { delay_ms(20); tus=6; }
   output_low(sat2);

   output_high(sat3);
   if (input(sut1))   
      { delay_ms(20); tus=7; }
   if (input(sut2))   
      { delay_ms(20); tus=8; }
   if (input(sut3))   
      { delay_ms(20); tus=9; }
   output_low(sat3);

   output_high(sat4);
   if (input(sut1)) 
      { delay_ms(20); tus=0xE; }
   if (input(sut2))   
      { delay_ms(20); tus=0; }
   if (input(sut3))   
      { delay_ms(20); tus=0xF; }
   output_low(sat4);
     
   return tus;
   
}

void goster_b()
      {     
      ekran=tus;
      if(ekran==255){ekran=0;}output_b(tus);           
      }
void goster_c()
      {
      ekran=tus;
      if(ekran==255){ekran=0;}output_c(tus);           
      }

void main ( )
{
   setup_psp(PSP_DISABLED);       
   setup_timer_1(T1_DISABLED);     
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);   
   setup_adc(ADC_OFF);             
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);

   set_tris_b(0x00);
   set_tris_c(0x00);   
   set_tris_d(0x0F);   

   output_b(0x00);
   output_c(0x00);
   
   int k;
   
   while(1) 
   {
     keypad();
     if(tus>0)
     {
     k++;
     if(k==1){
     goster_b();
     ptus=tus;
     do{delay_ms(10);keypad();}while(tus==ptus);
     }
     
     if(k==2){
     goster_c();
     ptus=tus; k=0;
     do{delay_ms(10);keypad();}while(tus==ptus);
     }
    }
  }
}



Devrenin sağ tarafındaki 10x10 matris çıkışına 90 adet röle bağlanabilir.

suleymanq

Merhaba arkadaşlar!
Projede biraz değişiklikler yaptım, son halini ekliyorum

#include <16f877.h>   
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

#byte   portb=0x06
#byte   portc=0x07 

char tus,ptus,ekran;

int digit[16]={63,6,91,79,102,109,125,7,127,111,119,56,57,94,121,113};
//            [0 ,1,2 ,3 , 4 , 5 , 6 ,7, 8 , 9 , a , L ,c ,d , e , f ]

int k;

char keypad_oku()
{
   output_d(0x00);   
   tus=input_d(); 
   if(tus==11){k=0;reset_cpu();}     
   return tus;   
}

void goster_b()
      {     
      ekran=tus;
      if(ekran==255){ekran=0;}output_b(digit[ekran]);           
      }
void goster_c()
      {
      ekran=tus;
      if(ekran==255){ekran=0;}output_c(digit[ekran]);           
      }
     
void main ( )
{
   setup_psp(PSP_DISABLED);       
   setup_timer_1(T1_DISABLED);     
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);   
   setup_adc(ADC_OFF);             
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);

   set_tris_b(0x00);
   set_tris_c(0x00);   
   set_tris_d(0x0F);   

   output_b(digit[0]);
   output_c(digit[0]);
   
   while(1) 
   {
     keypad_oku();
     if(tus>0)
     {
     k++;
     if(k==1){
     goster_b();
     ptus=tus;
     do{delay_ms(10);keypad_oku();}while(tus==ptus);
     }
     
     if(k==2){
     goster_c();
     ptus=tus; k=0;
     do{delay_ms(10);keypad_oku();}while(tus==ptus);
     }
     }
     }
}



433Mhz RF modüller ve PT2262,72 entegreleri ekledim devre çalışıyor, kumandada basılan rakamı ekranda gösteriyor bir sıkıntı yok, yalnız program kısmında eklemek istediğim ufak bir şey var: günlük hayatımızda * ve # olarak adlandırdığımız iki tuş \'artır\' ve \'azalt\' olarak kullanmak istiyorum yani (tus=10 ise azalt) ve (tus=12 ise artır)
ıf(tus=10){portc bir azalt)
if(tus=12){portc bir artır}
http://www.dosya.tc/server17/5Er5I3/displayboard.rar.html