Değişkenin 1 Olan Bitlerinin Sayısını Nasıl Öğrenirim?

Başlatan rkinaci, 13 Mayıs 2014, 00:56:58

rkinaci

Merhaba arkadaşlar,
Yapmak istediğimi öncelikle anlatayım fikir verirseniz sevinirim. 16F877 ile bir nevi alarm gibi çalışacak bir devre yapıyorum. 7 adet input var ve bu inputlardan birinden veya bir kaçından gelen sinyali LCD ekrana yazdırmak istiyorum. 7 girişi tek tek kontrol edip, her kontol bloğu içinde bir değişken ile "veya"layıp 7 kontrolden sonra değişkende kaç bit ve hangi sıradaki bitler 1 olmuşsa ekrana yazdırmak istiyorum.

Öncelikle kontrol mantığı yeterli mi sizce?
Sonrada değişkenin bit sayısını ve pozisyonunu öğrenebilir miyim?

LCDOUT $FE,1,"SISTEM OK"
SAYAC = 0
BASLA:
IF PORTA.0=1 THEN
LCDOUT $FE,1
pause 50
LCDOUT "1. BOLGE"
pause 300
HIGH ROLE1
HIGH ROLE3
SAYAC = SAYAC | %00000001
LCDOUT $FE,1, DEC SAYAC
ENDIF 

IF PORTA.1=1 THEN
LCDOUT $FE,1
pause 50
LCDOUT "2. BOLGE"
pause 300
HIGH ROLE1
HIGH ROLE3
SAYAC = SAYAC | %00000010
LCDOUT $FE,1, DEC SAYAC
ENDIF                     
GOTO BASLA
END


Yukarıdaki örnek programda olduğu her kontrolden sonra bilgiyi yazdırmak değilde, her kontrolde dediğim gibi 1 bit setleyip bu bitlerin sayısı ve sırasına göre son kontrolden sonra 1. bölge, 2.bölge, 3. bölge vs. böyle devam etsin istiyorum. Takıldım kaldım.
Ne kadar bilirsen bil, söylediklerin karşındakinin anladığı kadardır!

z

Fikir verebilirim. Komutlari sen yazarsin. (Benim yazdigim komutlar dogru olmayabilir)

Girisler=PORTA benzeri bir komutla portun 8 bitini de 1 cirpida oku

M=1;
K=0;
for N=0 to 7
     if (Girisler AND M)=1 then 
           ' Port.M = 1 ise burasi calisacak
             K=K+1 ' bir olan bitlerin sayacini 1 artir
     endif
     m=m+m;
next N

Artik kac tane bit 1 imis biliyoruz.

K, 1 olan bitlerin sayisi
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

Bu işinizi görür sanırım;

uint8_t numsetbits(uint8_t x)
{
    x = x - ((x >> 1) & 0x55);
    x = (x & 0x33) + ((x >> 2) & 0x33);
    return (((x + (x >> 4)) & 0x0F) * 0x01);
}
"... a healthy dose of paranoia leads to better systems." Jack Ganssle