2015-01-16 2 views
0

두 개의 시프트 레지스터 4094, 일부 7 세그먼트 LED 및 ATmega 328p를 표시하고 싶습니다. 내 curent 코드는 다음과 같습니다7 세그먼트 LED + 4094

uint8_t LED[10]={0b11111100,0b01100000,0b011011010,0b011110010,0b01100110,0b10110110,0b10111110,0b111000000,0b11111110,0b11110110}; 


int j =Led; //input from the main 
uint8_t num_1=Led/10; 
uint8_t num_2=Led%10;  
Strobe=0; 
uint8_t mask=0x80; 
for(uint8_t i=0; i<8; i++) 
    { 
     mask=mask>>1;  

    if((LED[num_1] & mask) ==1) 
    { 
     DATA= 1; 
    } 
    else 
    { 

     DATA= 0; 
    } 
    pulse(); 
} 
mask=0x80; 
for(uint8_t i=0; i<8; i++) 
{ 
    mask=mask>>1; 
    ; 

    if((LED[num_2] & mask)==1) 
    { 
     DATA= 1; 
    } 
    else 
    { 

     DATA= 0; 
    } 
    pulse(); 
} 

그러나 물론이 제대로 작동하지 않습니다. 단지 0을 생성합니다. 올바른 방향으로 나를 가리킬 수 있습니까? 편집 : 나는 코드의 목적은 당신은 루프의 끝에서 mask = mask>>1을 넣어 갈까요, 00에서 16

+1

자세한 내용을 입력 해주세요. 일부 비트 패턴 또는 일련의 비트 패턴을 생성하는 것이 목표입니까? 코드는 C와 유사합니다. 실제로 C입니까? – Codor

+0

4094는 shift-in 값을 출력을 저장하는 내부 레지스터에 저장하기 위해 여분의 신호가 필요합니다. 나는 너를 보살 피는 것을 보지 못했다. – Cactus

+0

코드를 표시하려면 언어에 태그를 지정해야합니다. 사람들이 질문을 찾도록 돕는 것 외에도 구문 강조 표시에도 영향을 미칩니다. – crashmstr

답변

2

첫째로 번호를 생성하는 것입니다 아트멜 스튜디오 6. 를 사용합니다.

둘째, 당신은 0b10000000, 0b01000000, ..., 0b00000001 할 수있는
if((LED[num_2] & mask) == 1)
if((LED[num_2] & mask) == mask) 또는 단지
if( LED[num_2] & mask)

마스크를 교체해야합니다.
& 작업의 결과는 마스크 또는 0과 같을 수 있습니다.
== 연산자의 오른쪽은 1이며, 항상 0b00000001입니다.

+0

if 문을 없애고 Data = LED [num_2] & mask ??를 직접 쓸 수 있습니까? – user3713940

+0

그것은 매력처럼 작동합니다. 시간을내어 주셔서 감사합니다. – user3713940

+0

앞서 살펴본 바와 같이 ** AND ** 연산의 결과는 마스크 또는 제로와 같을 수 있습니다. resutl이 0 일 때이 작업을 수행 할 수 있습니다. 결과가 마스크이면 결과는 ** 1 **과 같지 않은 0이 아닙니다. ** 4094 **의 원칙에 따르면 ** 데이터 **는 ** ** ** ** ** ** ** 일 수 있습니다. – iama

관련 문제