yüzler ve binler basamağı için gerekli kod.

Başlatan Recep METE, 18 Ekim 2013, 00:12:02

Recep METE

Arkadaşlar elimde ikili 7 segment ile 0-99 sayıcı programı var.Buna göre birler ve onların hesaplanması şöyle yapılmış:
birler=sayi%10;          // birler hanesi hesaplanıyor
onlar=sayi/10;           // onlar hanesi hesaplanıyor,

Ben bu programa yüzler ve binleride eklemek istiyorum bunun için nasıl bir yol izlemeliyim.4'lü 7 segment kullanacağımda.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

AYKIRI


erpay

birler=sayi%10;         
onlar=(sayi/10)%10 ;         
yüzler = (sayi/100)%10 ;
binler = sayi/1000 ;

Bçyle bir kod işe yarayabilir.

Klein

birler = sayi % 10;
onlar = (sayi % 100)  / 10
yüzler = (sayi %1000) / 100
binler = (sayi % 10000) / 1000
...
...

Recep METE

#4
Alıntı yapılan: Klein - 18 Ekim 2013, 00:18:21
birler = sayi % 10;
onlar = (sayi % 100)  / 10
yüzler = (sayi %1000) / 100
binler = (sayi % 10000) / 1000
...
...

Alıntı yapılan: erpay - 18 Ekim 2013, 00:17:06
birler=sayi%10;         
onlar=(sayi/10)%10 ;         
yüzler = (sayi/100)%10 ;
binler = sayi/1000 ;

Bçyle bir kod işe yarayabilir.



Hocam ikisindede sayı 220'den sonra 0'a dönüyor.bu sorunu nasıl düzeltebilirim acaba.

mesaj birleştirme:: 18 Ekim 2013, 00:29:37

/******************************************************
 Uygulama Adı      : Display Uygulaması-2 (Buton İle 0-99 Yukarı Sayıcı)
 PIC PROG/DEKA     : Port B jumper'ı 7-seg konumunda olmalı
*******************************************************/

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor


#use fast_io(a) // Port yönlendirme komutları a portu için geçerli
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli

#define   display_1   pin_a0      //display_1 ifadesi pin_a0 ifadesine eşleniyor
#define   display_2   pin_a1      // display_2 ifadesi pin_a1 ifadesine eşleniyor
#define   display_3   pin_a2
#define   display_4   pin_a3


int i;
char birler=0, onlar=0,yuzler=0,binler=0, sayi=0;       // char tipinde değişkenler tanımlanıyor


// Ortak katot display için veri değerleri
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{

unsigned char a=0;
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x00);
   set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor

   output_high(display_1);      // 1. display aktif durumda
   output_high(display_2);      // 2. display aktif durumda
   output_high(display_3);
  output_high(display_4);
  
  
   while(1)
   {
      

   for(i=0;i<10;i++)       // sayi değişkenini 1 arttır
  {
  if(a==1) {sayi++;a=0;}
 
            if (sayi==1000)  // Eğer sayi değişkeni 100 oldu ise sıfırla
              sayi=0;

         birler=sayi%10;          
        onlar=(sayi/10)%10 ;         
        yuzler = (sayi/100)%10 ;
        binler = sayi/1000 ;




            
            
            
            output_low(display_2);  // 2. display aktif durumda
               output_b(digit[birler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_2);   // 2. display pasif durumda
               output_low(display_1);  // 1. display aktif durumda
               output_b(digit[onlar]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_1);   // 1. display pasif durumda
               
                 
             output_low(display_4);  // 2. display aktif durumda
               output_b(digit[yuzler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_4);   // 2. display pasif durumda
               output_low(display_3);  // 1. display aktif durumda
               output_b(digit[binler]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_3);   // 1. display pasif durumda
            
               
               a++;
            
         
  }}
   }





Kod bu şekilde;

mesaj birleştirme:: 18 Ekim 2013, 00:31:32

Diğer kod;


/******************************************************
 Uygulama Adı      : Display Uygulaması-2 (Buton İle 0-99 Yukarı Sayıcı)
 PIC PROG/DEKA     : Port B jumper'ı 7-seg konumunda olmalı
*******************************************************/

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor


#use fast_io(a) // Port yönlendirme komutları a portu için geçerli
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli

#define   display_1   pin_a0      //display_1 ifadesi pin_a0 ifadesine eşleniyor
#define   display_2   pin_a1      // display_2 ifadesi pin_a1 ifadesine eşleniyor
#define   display_3   pin_a2
#define   display_4   pin_a3


int i;
char birler=0, onlar=0,yuzler=0,binler=0, sayi=0;       // char tipinde değişkenler tanımlanıyor


// Ortak katot display için veri değerleri
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{

unsigned char a=0;
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x00);
   set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor

   output_high(display_1);      // 1. display aktif durumda
   output_high(display_2);      // 2. display aktif durumda
   output_high(display_3);
  output_high(display_4);
  
  
   while(1)
   {
      

   for(i=0;i<10;i++)       // sayi değişkenini 1 arttır
  {
  if(a==1) {sayi++;a=0;}
 
            if (sayi==1000)  // Eğer sayi değişkeni 100 oldu ise sıfırla
              sayi=0;

        birler = sayi % 10;
onlar = (sayi % 100)  / 10
yüzler = (sayi %1000) / 100
binler = (sayi % 10000) / 1000



            
            
            
            output_low(display_2);  // 2. display aktif durumda
               output_b(digit[birler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_2);   // 2. display pasif durumda
               output_low(display_1);  // 1. display aktif durumda
               output_b(digit[onlar]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_1);   // 1. display pasif durumda
               
                 
             output_low(display_4);  // 2. display aktif durumda
               output_b(digit[yuzler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_4);   // 2. display pasif durumda
               output_low(display_3);  // 1. display aktif durumda
               output_b(digit[binler]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_3);   // 1. display pasif durumda
            
               
               a++;
            
         
  }}
   }
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

sadogan

#5
Alıntı yapılan: erpay - 18 Ekim 2013, 00:17:06
birler=(int16)sayi%10;         
onlar=(int16)(sayi/10)%10 ;         
yüzler =(int16) (sayi/100)%10 ;
binler = (int16)sayi/1000 ;

Bçyle bir kod işe yarayabilir.
type casting yapmak gerekebilir = den sonra (int16)

mesaj birleştirme:: 18 Ekim 2013, 00:38:37

başka bir yol ise
haneler diye bir dizi olsun
     unsigned int8 haneler[10];
     sprintf(haneler"%04lu"sayi);

haneler[0]-> binler
haneler[1]-> yüzler
haneler[2]-> onlar
haneler[3]-> birler

Klein

#6
sayi değişkenin char tipinde. int16 olarak tanımla.

Recep METE

#7
Alıntı yapılan: Klein - 18 Ekim 2013, 00:42:07
sayi değişkenin char tipinde. int16 olarak tanımla.


Hocam şimdi oldu Teşekkür ederim.ancak şimdi de 999'dan 0' adönüyor.

mesaj birleştirme:: 18 Ekim 2013, 00:56:46

Hocam yüzler basamağı 999' a kadar sayıyor sonra başa dönüyor.Binleh basamağı 0'da kalıyor.Kodları gönderiyorum.


/******************************************************
 Uygulama Adı      : Display Uygulaması-2 (Buton İle 0-99 Yukarı Sayıcı)
 PIC PROG/DEKA     : Port B jumper'ı 7-seg konumunda olmalı
*******************************************************/

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor


#use fast_io(a) // Port yönlendirme komutları a portu için geçerli
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli

#define   display_1   pin_a0      //display_1 ifadesi pin_a0 ifadesine eşleniyor
#define   display_2   pin_a1      // display_2 ifadesi pin_a1 ifadesine eşleniyor
#define   display_3   pin_a2
#define   display_4   pin_a3


int16 i;
char birler=0, onlar=0,yuzler=0,binler=0;       // char tipinde değişkenler tanımlanıyor

int16 sayi=0;  
// Ortak katot display için veri değerleri
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{

unsigned char a=0;
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x00);
   set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor

   output_high(display_1);      // 1. display aktif durumda
   output_high(display_2);      // 2. display aktif durumda
   output_high(display_3);
  output_high(display_4);
  
  
   while(1)
   {
      

   for(i=0;i<100;i++)       // sayi değişkenini 1 arttır
  {
  if(a==1) {sayi++;a=0;}
 
            if (sayi==1000)  // Eğer sayi değişkeni 100 oldu ise sıfırla
              sayi=0;

      birler = sayi % 10;
onlar = (sayi % 100)  / 10;
yuzler = (sayi %1000) / 100;
binler = (sayi % 10000) / 1000;




            
            
            
            output_low(display_2);  // 2. display aktif durumda
               output_b(digit[birler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_2);   // 2. display pasif durumda
               output_low(display_1);  // 1. display aktif durumda
               output_b(digit[onlar]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_1);   // 1. display pasif durumda
               
                 
             output_low(display_4);  // 2. display aktif durumda
               output_b(digit[yuzler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_4);   // 2. display pasif durumda
               output_low(display_3);  // 1. display aktif durumda
               output_b(digit[binler]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_3);   // 1. display pasif durumda
            
               
               a++;
            
         
  }}
   }
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

sadogan

sayı 1000 e eşit olunca "0"a eşitliyorsunuz

Recep METE

Alıntı yapılan: sadogan - 18 Ekim 2013, 01:00:40
sayı 1000 e eşit olunca "0"a eşitliyorsunuz


Tamam hocam öyle yaptım ama yine olmadı 999 dan sıfıra dönüyor.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

sadogan

1000 e eşitlemeyin
4 hane olduğuna göre 10000 eşitlemek gerekiyor.

Recep METE

Alıntı yapılan: sadogan - 18 Ekim 2013, 01:09:24
1000 e eşitlemeyin
4 hane olduğuna göre 10000 eşitlemek gerekiyor.


Hocam şimdi sorun çözüldü.Allah razı olsun.İyi geceler diliyorum.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

XX_CİHAN_XX

Kullandığınız yöntem özellikle 8 bitlik MCU lar için hoş bir basamak ayırma yöntemi değildir. Aşağıdaki şekilde basamak ayırma işlemi yapmanızı tavsiye ederim.
unsigned long value = 12345;  //basamaklara ayrilacak olan sayi
unsigned int digit[5];	      //basamaklarin yerlestirilecegi dizi		
digit[0]; = 0; digit[1]; = 0; digit[2]; = 0; digit[3]; = 0; digit[4]; = 0; 

//basamaklarina ayırma dongusu    	
for(unsigned int i=0;i<5;i++) //dongu basamak sayisi(5) kadar doner
{
  digit[i] = (unsigned int)(value % 10);  
  value = value - digit[i];  
  value = value / 10;     
}

Fonksiyon haline getirildiğinde çok daha kullanışlı bir basamak ayırma programı elde edebilirsiniz.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

schrodinger

for(k=0;k<4;k++)
      {
         basamak_deger[k]=basamak%10;
         basamak=basamak/10;   
      }

istedıgın kadar  basamagı ayırabılırsın bu kodla. (for dakı 4 sayısıyla oynayarak)

pwm.c

Test sonuçlarıma göre en hızlı işleyen basamak ayırma kodu bu oldu.
int   BIR,ON,YUZ,BIN;
int16 SAYI=1023;
//
//
//
   BIR=0;
   ON=0;
   YUZ=0;
   BIN=0;
   WHILE(SAYI>=1000){SAYI=SAYI-1000,BIN++;}
   WHILE(SAYI>=100){SAYI=SAYI-100,YUZ++;}
   WHILE(SAYI>=10){SAYI=SAYI-10,ON++;}
   WHILE(SAYI>=1){SAYI=SAYI-1,BIR++;}

denemek isteyenler kodun başına ve sonuna herhangibi pini 1 ve 0 yaparak osiloskop görüntüsüne bakabilir.
diğerlerine göre inanılmaz fark var.
sadece tavsiye...
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-