반응형

// Cortex-M4를 이용한 LED, Switch, Fnd 제어

// SW PD0를 누를경우 Num 증가 

// SW PD1을 누를경우 Num 감소








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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/**
  ******************************************************************************
  * @file    main.c
  * @author  Ac6
  * @version V1.0
  * @date    01-December-2013
  * @brief   Default main function.
  ******************************************************************************
*/
 
 
#include "stm32f4xx.h"
            
void delay_time(int time){
    while(time-->=0);
}
void delay_us(int time){
    while(time-->=0)
        delay_time(1);
}
void delay_ms(int time){
    while(time-->0)
        delay_us(1000);
}
 
unsigned int fnd[10=
    {0b0011111100000000,0b0000011000000000,0b0101101100000000,0b0100111100000000,
     0b0110011000000000,0b0110110100000000,0b0111110100000000,0b0010011100000000,
     0b0111111100000000,0b0110011100000000};
 
unsigned int fnd_sel[4]=
    {0b1000000000000000,0b0100000000000000,0b0010000000000000,0b0001000000000000};
 
void display_fnd(int num){
 
    int num1=0,num2=0,num3=0,num4=0;
 
    num1 = num%10;
    num2 = (num/10)%10;
    num3 = (num/100)%10;
    num4 = (num/1000)%10;
 
    GPIO_ResetBits(GPIOB,fnd_sel[3]);
    GPIO_SetBits(GPIOD, fnd[num1]);
    GPIO_SetBits(GPIOB,fnd_sel[3]);
    GPIO_ResetBits(GPIOD,fnd[num1]);
 
    GPIO_ResetBits(GPIOB,fnd_sel[2]);
    GPIO_SetBits(GPIOD, fnd[num2]);
    GPIO_SetBits(GPIOB,fnd_sel[2]);
    GPIO_ResetBits(GPIOD,fnd[num2]);
 
    GPIO_ResetBits(GPIOB,fnd_sel[1]);
    GPIO_SetBits(GPIOD, fnd[num3]);
    GPIO_SetBits(GPIOB,fnd_sel[1]);
    GPIO_ResetBits(GPIOD,fnd[num3]);
 
    GPIO_ResetBits(GPIOB,fnd_sel[0]);
    GPIO_SetBits(GPIOD, fnd[num4]);
    GPIO_SetBits(GPIOB,fnd_sel[0]);
    GPIO_ResetBits(GPIOD,fnd[num4]);
}
 
int main(void)
{
 
    GPIO_InitTypeDef GPIO_InitStructure;
 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD,ENABLE); // GPIO 클럭 인가
 
    // GPIOB set
    GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|
            GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // push pull
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
 
    GPIO_Init(GPIOB, &GPIO_InitStructure);
 
    GPIO_InitStructure.GPIO_Pin = 0b1111111100000000;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
 
    //GPIOD set
    GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
    // equal to 0b00001111
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // push pull
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
 
    GPIO_Init(GPIOD, &GPIO_InitStructure);
 
    //GPIO_ResetBits(GPIOB, 0b1111000000000000);
    //GPIO_SetBits(GPIOD, 0b1111111100000000);
    delay_ms(500);
 
    GPIO_SetBits(GPIOB, GPIO_Pin_5);
    delay_ms(500);
    GPIO_ResetBits(GPIOB, GPIO_Pin_5);
    delay_ms(500);
 
    GPIO_SetBits(GPIOB, GPIO_Pin_6);
    GPIO_ResetBits(GPIOB, GPIO_Pin_6);
 
 
    GPIO_SetBits(GPIOB, GPIO_Pin_7 | GPIO_Pin_8); // 특정비트 1
    //GPIO_ResetBits(GPIOB, GPIO_Pin_7 | GPIO_Pin_8); // 틀정비트 0
    // setBit : 특정 (1로 표시된) 비트를 1로 바꿈
    // ResetBit : 1로 표시된 비트를 0으로 바꿈
    // WriteBit
    int num =1234;
    int flag = 0, flag2=0, flag3=0;
 
 
    for(;;)
    {
        /*
        // FND display 1234 출력
        for (int i =0;i<4; i++){
            GPIO_ResetBits(GPIOB,fnd_sel[i]);
            GPIO_SetBits(GPIOD, fnd[i]);
            GPIO_SetBits(GPIOB,fnd_sel[i]);
            GPIO_ResetBits(GPIOD,fnd[i]);
        }*/
 
        display_fnd(num); //FND display(num)
 
        // GPIOD 입력시 GPIOB bit set, num++;
        if((GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_0)==0&& flag ==0){
            GPIO_SetBits(GPIOB, GPIO_Pin_5);
            num++;
            flag=1;
        }
        else if((GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0)==1&& flag==1){
            GPIO_ResetBits(GPIOB, GPIO_Pin_5);
            flag=0;
        }
 
        // GPIOD 이력시 GPIOB bit set, num--;
        if((GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_1)==0&& flag2 ==0){
            GPIO_SetBits(GPIOB, GPIO_Pin_6);
            num--;
            flag2=1;
        }
        else if ((GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_1)==1)&& flag2 ==1){
            GPIO_ResetBits(GPIOB, GPIO_Pin_6);
            flag2=0;
        }
        if ((GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_2)==0)&& flag3 ==0){
 
            flag3=1;
        }
        else if((GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_2)==1)&&flag ==1){
            flag3=0;
        }
    }
}
 
cs


반응형

'Study > 32-bit MCUs' 카테고리의 다른 글

[Elevator(ARM)] DoorLock  (0) 2018.10.25
[Elevator(ARM)] Calculator  (0) 2018.10.25
[Elevator(ARM)] Coretex-M4 Elevator  (0) 2018.10.18
[MTX32F407-M4] BMI Calculator  (0) 2018.10.18
[MTX32F407-M4] Coretex-M4 Stop_Watch  (0) 2018.10.18

+ Recent posts