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를 설정한다.



+ Recent posts