[임베디드 C언어_Day4]LED + keypad 구현
■LED + Keypad 회로도■
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include "2450addr.h" #define GPGCON (*(volatile unsigned int *)0x56000060) #define GPGDAT (*(volatile unsigned int *)0x56000064) #define GPFCON (*(volatile unsigned int *)0x56000050) #define GPFDAT (*(volatile unsigned int *)0x56000054) void Init(void); void LED_ON_Off(int num); int Get_Key_byPolling(void); void Main() { int key; Init(); while(1) { GPFDAT &= ~(0x1 <<7); GPGDAT |= 0x1; key = Get_Key_byPolling(); LED_ON_Off(key); GPFDAT |= (0x1 <<7); GPGDAT &= ~(0x1); key = Get_Key_byPolling(); LED_ON_Off(key+1); } } void Init() { GPGCON |= 0x5500; GPGDAT |=0xf0; GPFCON |=0xffff; GPFCON &= ~(0x3ff << 4); GPFCON &= ~(0x2 <<14); GPGCON |= 0x1; GPFDAT &= ~(0xff); } void LED_ON_Off(int num) { GPGDAT |=0xf0; switch(num) { case 0: GPGDAT &=(0xf0); break; case 1: GPGDAT &=(0xe0); break; case 2: GPGDAT &=(0xd0); break; case 3: GPGDAT &=(0xb0); break; case 4: GPGDAT &=(0x70); break; case 5: GPGDAT &= (0x30); break; case 6: GPGDAT &=0xc0; break; } } int Get_Key_byPolling(void) { if((GPFDAT & 0x7)==0x3) return 1; if((GPFDAT & 0xf)==0x7) return 2; if((GPFDAT & 0x1f)==0xf) return 3; if((GPFDAT & 0x3f)==0x1f) return 4; if((GPFDAT & 0x7f)==0x3f) return 5; } | cs |
스위치를 누르지 않은 상태일때는 스위치에 해당하는 핀의 전압이 VDD이므로 1(HIGH) 상태이다.
스위치를 누를경우 스위치에 해당하는 핀이 4~8번일경우 GPF7과, 9~13번일경우 GPG0 과 연결되는데,
GPF7, GPG0의 값이 0(LOW)이면, 연결된 핀의 전압이 0V가 되므로 0(LOW)상태가 된다.
GPFDAT7, GPGDAT0을 1(HIGH)상태로 둘경우 연결된 핀의 전압은 여전히 VDD이므로 핀의 상태는 HIGH(1)가 된다.
ex)
4번 스위치가 열린상태 : GPF2에 걸리는 전압이 VDD 이므로 1(HIGH)
4번스위치 닫힘, GPF7의 상태가 LOW : GPF2에 걸리는 전압이 0V 이므로 0(LOW)
4번스위치 닫힘, GPF7의 상태가 HIGH : GPF2에 걸리는 전압이 VDD 이므로 1(HIGH)
1. LED 설정
GPGCON4~GPGCON7 을 01(output mode) 로 초기화
GPGDAT의 4~7번 비트를 1(HIGH)로 초기화
2. keypad 설정
GPFCON2 ~ GPFCON6 을 00(input mode)로 초기화
GPFDAT의 2~6번 비트는 회로상 이미 1(HIGH)상태
GPFCON7, GPGCON0 을 00(output mode) 로 초기화
GPFDAT의 7번비트를 0으로 할 경우 4~8번 스위치가 작동
GPGDAT의 0번비트를 0으로 할 경우 9~13번 스위치가 작동
3. GPFDAT
회로상 GPFDAT의 2~6번비트는 기본상태가 1(HIGH)이다.
각 핀에 해당하는 스위치를 누를 경우 해당 비트가 0(LOW)가 된다.
ex)5번 스위치를 누를경우 GPFDAT의 3번비트만 0이 된다.
while문을 통해서
GPFCON7, GPGCON0 을 01
GPFCON7, GPGCON0 을 10
인 상태에서 key값을 받아서
조건문을 통해 각 스위치에 맞게 LED를 설정한다.