Switch 4개를 각각 누를 때마다 FND 카운터 증가
Anode 4-digit FND (4401ASR2)를 PORTC 에 연결하고 COM 은 PORT0~ PORT3에 연결하여
스위치를 누를 때마다 각 자리수의 값이 증가하는 예제입니다.
< 시작 화면: 모든 값이 0으로 표시됩니다 >
< PA7 1번, PA6 2번, PA5는 8 번, PA4 는 5번 눌렀을 경우 >
전체 소스 AVR Studio 4.7 용
/**********************************************
//PA4~7에switch연결 // PA7 : FND 자리수증가 // PA6 : FND 자리수증가 // PA5 : FND 자리수증가 // PA4 : FND 자리수증가 // 스위치를누르면각각의FND 표시값증가( 0부터9까지반복표시)
Tools : AVR Studio 4.16 http://watsim.tistory.com *********************************************/
#include <avr/io.h> #include <avr/interrupt.h>
void DisplayFND(); void InitPort(); void GetSW( );
unsigned char g_Dig1=0,g_Dig2=0,g_Dig3=0,g_Dig4=0; // 각자리마다표시할수(범위: 0 ~9)
// FND DATA (FND 4401ASR2 용) const unsigned char num[10]={ 0b00010100, //0 0b11010111, //1 0b01001100, //2 0b01000101, //3 0b10000111, //4 0b00100101, //5 0b00100100, //6 0b01010111, //7 0b00000100, //8 0b00000101 //9 };
// 스위치(키)의입력값이변경되었는지와마지막값확인용 unsigned char keyvalue = -1; // -1 은입력된값이없을때 unsigned char lastkeyvalue = -1; // -1 은입력된값이없을때
int main() { InitPort();
while(1) { GetSW(); DisplayFND();
} }
void InitPort() { DDRC = 0xFF; DDRA = 0x0F; DDRD = 0xFF;
PORTC = 0x00; PORTA = 0xF0; PORTD = 0x55; }
void DisplayFND() { int i=0;
PORTD = 1; PORTC = num[g_Dig1];
for(i=0; i<=2540; i++) { asm volatile(" PUSH R0 "); asm volatile(" POP R0 ");
}
PORTD = 2; PORTC = num[g_Dig2]; for(i=0; i<=2540; i++) { asm volatile(" PUSH R0 "); asm volatile(" POP R0 ");
}
PORTD = 4; PORTC = num[g_Dig3]; for(i=0; i<=2540; i++) { asm volatile(" PUSH R0 "); asm volatile(" POP R0 ");
}
PORTD = 8; PORTC =num[g_Dig4];
for(i=0; i<=2540; i++) { asm volatile(" PUSH R0 "); asm volatile(" POP R0 ");
} }
void GetSW() {
keyvalue = PINA >> 4;
// switch 의값이변경되었을때만처리하자.
if( keyvalue != lastkeyvalue) {
if((lastkeyvalue& 0x08) && !(keyvalue & 0x08)) { g_Dig1 ++; if(g_Dig1>9) g_Dig1 = 0; }
if((lastkeyvalue& 0x04) && !(keyvalue & 0x04)) { g_Dig2 ++; if(g_Dig2>9) g_Dig2 = 0; } if((lastkeyvalue& 0x02) && !(keyvalue & 0x02)) { g_Dig3 ++; if(g_Dig3>9) g_Dig3 = 0; }
if((lastkeyvalue& 0x01) && !(keyvalue & 0x01)) { g_Dig4 ++; if(g_Dig4>9) g_Dig4 = 0; }
lastkeyvalue = keyvalue; }
} |
주요 부품
ATMEGA128 - 1EA FND 4401ASR2 ( Anode type ) – 1 EA Switch – 4EA POWER 5V/1A |
실행파일 다운로드
이번 예제가 추가되면서 실행파일이 업데이트 되었습니다.
4401ASR2 부품을 사용하기 위해서는 패치 하시기 바랍니다.
'AVR키트' 카테고리의 다른 글
WAT-AVR128 모듈 (0) | 2011.07.20 |
---|---|
WAT-AVR128로 키 패드(키 매트릭스) 제어 (2) | 2011.07.15 |
로터리(Rotary) 스위치 값을 FND(4401ASR)에 표시하는 예제 (0) | 2011.07.12 |
가변저항 변화에 따라 LED 상태 변화 (4) | 2011.07.07 |
스위치 누름 카운터 Character LCD에 출력 (0) | 2011.07.06 |